private DryadQueryNode VisitDistinct(QueryNodeInfo source, Expression comparerExpr, Expression queryExpr) { DryadQueryNode child = this.Visit(source); Type keyType = child.OutputTypes[0]; if (comparerExpr == null && !TypeSystem.HasDefaultEqualityComparer(keyType)) { throw DryadLinqException.Create(HpcLinqErrorCode.ComparerMustBeSpecifiedOrKeyTypeMustBeIEquatable, string.Format(SR.ComparerMustBeSpecifiedOrKeyTypeMustBeIEquatable, keyType), queryExpr); } object comparer = null; if (comparerExpr != null) { ExpressionSimplifier<object> evaluator = new ExpressionSimplifier<object>(); comparer = evaluator.Eval(comparerExpr); } LambdaExpression keySelectExpr = IdentityFunction.Instance(keyType); if (!child.OutputPartition.IsPartitionedBy(keySelectExpr, comparer)) { if (child.IsDynamic || child.OutputPartition.Count > 1) { child = new DryadDistinctNode(true, comparerExpr, queryExpr, child); bool isDynamic = (StaticConfig.DynamicOptLevel & StaticConfig.DynamicHashPartitionLevel) != 0; child = new DryadHashPartitionNode(keySelectExpr, comparerExpr, child.OutputPartition.Count, isDynamic, queryExpr, child); child = new DryadMergeNode(false, false, queryExpr, child); } } DryadQueryNode resNode = new DryadDistinctNode(false, comparerExpr, queryExpr, child); return resNode; }
internal virtual string Visit(DryadDistinctNode node, CodeMemberMethod vertexMethod, string[] readerNames, string[] writerNames) { return node.AddVertexCode(vertexMethod, readerNames, writerNames); }