]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QNegation.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / query / QNegation.java
1 package org.simantics.scl.compiler.elaboration.query;
2
3 import org.simantics.scl.compiler.common.names.Names;
4 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
5 import org.simantics.scl.compiler.elaboration.expressions.EApply;
6 import org.simantics.scl.compiler.elaboration.expressions.QueryTransformer;
7 import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext;
8 import org.simantics.scl.compiler.elaboration.query.compilation.DerivateException;
9 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext;
10 import org.simantics.scl.compiler.elaboration.query.compilation.QueryConstraint;
11 import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryException;
12 import org.simantics.scl.compiler.elaboration.relations.LocalRelation;
13 import org.simantics.scl.compiler.types.Type;
14
15 import gnu.trove.map.hash.THashMap;
16 import gnu.trove.set.hash.TIntHashSet;
17
18
19 public class QNegation extends QAbstractModifier {
20
21     public QNegation(Query query) {
22         super(query);
23     }
24
25     @Override
26     public void collectConstraints(ConstraintCollectionContext context) throws UnsolvableQueryException {
27         TIntHashSet vars = new TIntHashSet();
28         query.collectVars(context.getVariableMap(), vars);
29         
30         final QueryCompilationContext innerContext = context.getQueryCompilationContext().createCheckContext(); 
31         query.generate(innerContext);
32         
33         context.addConstraint(new QueryConstraint(vars.toArray()) {
34             long variableMask;
35             {
36                 for(int v : variables)
37                     variableMask |= 1L << v;
38             }
39             @Override
40             public double getSolutionCost(long boundVariables) {
41                 if((boundVariables & variableMask) != variableMask)
42                     return Double.POSITIVE_INFINITY;
43                 return innerContext.getCost();
44             }
45             @Override
46             public double getSolutionBranching(long boundVariables) {
47                 if((boundVariables & variableMask) != variableMask)
48                     return Double.POSITIVE_INFINITY;
49                 return innerContext.getBranching();
50             }
51             @Override
52             public boolean canBeSolvedFrom(long boundVariables) {
53                 return (boundVariables & variableMask) == variableMask;
54             }
55             
56             @Override
57             public long getVariableMask() {
58                 return variableMask;
59             }
60             @Override
61             public void generate(QueryCompilationContext context) {
62                 context.condition(new EApply(
63                         context.getConstant(Names.Prelude_not, Type.EMPTY_ARRAY),
64                         innerContext.getContinuation()));
65             }
66         });
67     }
68     
69     @Override
70     public Query replace(ReplaceContext context) {
71         return new QNegation(query.replace(context));
72     }
73     
74     @Override
75     public Diff[] derivate(THashMap<LocalRelation, Diffable> diffables) throws DerivateException {
76         Diff[] diffs = query.derivate(diffables);
77         if(diffs.length == 0)
78             return NO_DIFF;
79         else
80             throw new DerivateException(location);
81     }
82     
83     @Override
84     public void accept(QueryVisitor visitor) {
85         visitor.visit(this);
86     }
87     
88     @Override
89     public Query accept(QueryTransformer transformer) {
90         return transformer.transform(this);
91     }
92
93 }