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; }
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); }
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; }
public virtual void VisitQueryDistinct(QueryDistinct distinct){ if (distinct == null) return; this.VisitExpression(distinct.Source); }
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; }
public override Node VisitQueryDistinct(QueryDistinct distinct){ if (distinct == null) return null; return base.VisitQueryDistinct((QueryDistinct)distinct.Clone()); }
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; }
public override Node VisitQueryDistinct(QueryDistinct distinct) { base.VisitQueryDistinct(distinct); return this.Compose(distinct, this.GetComposer(distinct.Source)); }
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); }