public virtual Node VisitQueryDistinct(QueryDistinct distinct, QueryDistinct changes, QueryDistinct deletions, QueryDistinct insertions){
   this.UpdateSourceContext(distinct, changes);
   if (distinct == null) return changes;
   if (changes != null){
     if (deletions == null || insertions == null)
       Debug.Assert(false);
     else{
     }
   }else if (deletions != null)
     return null;
   return distinct;
 }
 public virtual Node VisitQueryDistinct(QueryDistinct distinct){
   if (distinct == null) return null;
   distinct.Source = this.VisitExpression(distinct.Source);
   return distinct;
 }
    public virtual Differences VisitQueryDistinct(QueryDistinct distinct1, QueryDistinct distinct2){
      Differences differences = new Differences(distinct1, distinct2);
      if (distinct1 == null || distinct2 == null){
        if (distinct1 != distinct2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++;
        return differences;
      }
      QueryDistinct changes = (QueryDistinct)distinct2.Clone();
      QueryDistinct deletions = (QueryDistinct)distinct2.Clone();
      QueryDistinct insertions = (QueryDistinct)distinct2.Clone();

      //      distinct1.Context;
      //      distinct1.Group;
      //      distinct1.GroupTarget;
      //      distinct1.Source;

      if (differences.NumberOfDifferences == 0){
        differences.Changes = null;
        differences.Deletions = null;
        differences.Insertions = null;
      }else{
        differences.Changes = changes;
        differences.Deletions = deletions;
        differences.Insertions = insertions;
      }
      return differences;
    }
Exemple #4
0
 public override Node VisitQueryDistinct(QueryDistinct qd) {
   if (qd == null) return null;
   Class cc = this.currentMethod.Scope.ClosureClass;
   qd.Source = this.VisitExpression(qd.Source);
   return this.CheckQueryDistinct(qd);
 }
Exemple #5
0
 private QueryDistinct CheckQueryDistinct(QueryDistinct qd) {
   if (qd == null) return null;
   if (qd.Source == null || qd.Source.Type == null) return null;
   if (qd.Group == null) {
     Cardinality card = this.typeSystem.GetCardinality(qd.Source, this.TypeViewer);
     if (qd.Context == null && card != Cardinality.OneOrMore && card != Cardinality.ZeroOrMore) {
       this.HandleError(qd.Source, Error.QueryNotStream);
       return null;
     } else if (qd.Context != null && (card == Cardinality.OneOrMore || card == Cardinality.ZeroOrMore)) {
       this.HandleError(qd.Source, Error.QueryNotScalar);
       return null;
     }
   }
   if (qd.Type == null) return null;
   return qd;
 }
Exemple #6
0
 public virtual void VisitQueryDistinct(QueryDistinct distinct){
   if (distinct == null) return;
   this.VisitExpression(distinct.Source);
 }
Exemple #7
0
 public override Node VisitQueryDistinct(QueryDistinct qd){
   if (qd == null) return null;
   qd.Context = this.contextScope;
   if (qd.Group == null){
     qd.Source = this.VisitExpression(qd.Source);
     if (qd.Source != null && qd.Source.Type != null){
       qd.Type = this.GetResultType(qd.Source, null, Cardinality.ZeroOrMore);
     }
   }
   return qd;
 }
 public virtual Node VisitQueryDistinct(QueryDistinct distinct1, QueryDistinct distinct2){
   if (distinct1 == null) return null;
   if (distinct2 == null)
     distinct1.Source = this.VisitExpression(distinct1.Source, null);
   else
     distinct1.Source = this.VisitExpression(distinct1.Source, distinct2.Source);
   return distinct1;
 }
Exemple #9
0
 public override Node VisitQueryDistinct(QueryDistinct distinct){
   if (distinct == null) return null;
   return base.VisitQueryDistinct((QueryDistinct)distinct.Clone());
 }
Exemple #10
0
 public override Node VisitQueryDistinct(QueryDistinct qd) {
   Debug.Assert(qd.Group == null, "QueryDistinct evaluated separately from QueryGroupBy");
   // only product disinct-by-value rows of the stream
   TypeNode resultElementType = this.typeSystem.GetStreamElementType(qd.Type, this.TypeViewer);
   Block block = null;
   Node closure = this.StartQueryClosure(resultElementType, "distinct", out block);
   BlockScope scope = block.Scope;
   Expression locTable = this.NewClosureLocal(SystemTypes.Hashtable, scope);
   // build comparer for key
   if (!this.GetTypeView(resultElementType).IsAssignableTo(SystemTypes.IComparable)) {
     TypeNode comparerType = this.BuildDefaultComparer(resultElementType);
     block.Statements.Add(new QueryGeneratedType(comparerType));
     // create hashtable instance before source iteration
     Construct ccons = new Construct();
     ccons.Constructor = new MemberBinding(null, this.GetTypeView(comparerType).GetConstructor());
     ccons.Type = comparerType;
     Construct tcons = new Construct();
     InstanceInitializer ii = SystemTypes.Hashtable.GetConstructor(SystemTypes.IHashCodeProvider, SystemTypes.IComparer);
     tcons.Constructor = new MemberBinding(null, ii);
     tcons.Operands = new ExpressionList(ccons, new Expression(NodeType.Dup, ccons.Type));
     tcons.Type = SystemTypes.Hashtable;
     block.Statements.Add(new AssignmentStatement(locTable, tcons));
   }
   else {
     Construct tcons = new Construct();
     InstanceInitializer ii = SystemTypes.Hashtable.GetConstructor();
     tcons.Constructor = new MemberBinding(null, ii);
     tcons.Type = SystemTypes.Hashtable;
     block.Statements.Add(new AssignmentStatement(locTable, tcons));
   }
   // iterate source items
   Expression feTarget = null;
   Block inner = null;
   block.Statements.Add(this.BuildClosureForEach(qd.Source, ref feTarget, out inner, scope));
   // add key & row to hashtable
   Expression boxedKey = new Local(SystemTypes.Object);
   // object boxedKey = (object)locKey;
   inner.Statements.Add(new AssignmentStatement(boxedKey, this.Box(feTarget)));
   // locList = ht[boxedKey]
   Method mget = SystemTypes.Hashtable.GetMethod(StandardIds.getItem, SystemTypes.Object);
   MethodCall mcget = new MethodCall(new MemberBinding(locTable, mget), new ExpressionList(boxedKey));
   mcget.Type = mget.ReturnType;
   // if (ht[item] != null) goto brBottom;
   Block brBottom = new Block();
   inner.Statements.Add(new Branch(new BinaryExpression(mcget, Literal.Null, NodeType.Ne), brBottom));
   // ht[item] = item;
   Method mset = SystemTypes.Hashtable.GetMethod(Identifier.For("set_Item"), SystemTypes.Object, SystemTypes.Object);
   MethodCall mcset = new MethodCall(new MemberBinding(locTable, mset), new ExpressionList(boxedKey, boxedKey));
   mcset.Type = mset.ReturnType;
   inner.Statements.Add(new ExpressionStatement(mcset));
   // yield item;
   inner.Statements.Add(new Yield(feTarget));
   inner.Statements.Add(brBottom);
   // get rid of hashtable
   block.Statements.Add(new AssignmentStatement(locTable, Literal.Null));
   // and weez done
   return this.EndQueryClosure(closure, qd.Type);
 }
 public override Node VisitQueryDistinct( QueryDistinct qd ){
   base.VisitQueryDistinct(qd);
   if (qd.Group == null && this.currentGroup != null){
     qd.Group = this.currentGroup;
   }
   return qd;
 }
Exemple #12
0
 public override Node VisitQueryDistinct(QueryDistinct distinct) {
   base.VisitQueryDistinct(distinct);
   return this.Compose(distinct, this.GetComposer(distinct.Source));
 }
Exemple #13
0
 public override Node VisitQueryDistinct(QueryDistinct distinct)
 {
     base.VisitQueryDistinct(distinct);
     return(this.Compose(distinct, this.GetComposer(distinct.Source)));
 }
 public EventingVisitor(Action<QueryDistinct> visitQueryDistinct) { VisitedQueryDistinct += visitQueryDistinct; } public event Action<QueryDistinct> VisitedQueryDistinct; public override Node VisitQueryDistinct(QueryDistinct distinct) { if (VisitedQueryDistinct != null) VisitedQueryDistinct(distinct); return base.VisitQueryDistinct(distinct); }