private static void AddEquivalent( ExprAggregateNode aggNodeToAdd, IList<AggregationServiceAggExpressionDesc> equivalencyList) { // Check any same aggregation nodes among all aggregation clauses bool foundEquivalent = false; foreach (AggregationServiceAggExpressionDesc existing in equivalencyList) { ExprAggregateNode aggNode = existing.AggregationNode; // we have equivalence when: // (a) equals on node returns true // (b) positional parameters are the same // (c) non-positional (group-by over, if present, are the same ignoring duplicates) if (!aggNode.EqualsNode(aggNodeToAdd, false)) { continue; } if (!ExprNodeUtility.DeepEquals(aggNode.PositionalParams, aggNodeToAdd.PositionalParams, false)) { continue; } if (aggNode.OptionalLocalGroupBy != null || aggNodeToAdd.OptionalLocalGroupBy != null) { if ((aggNode.OptionalLocalGroupBy == null && aggNodeToAdd.OptionalLocalGroupBy != null) || (aggNode.OptionalLocalGroupBy != null && aggNodeToAdd.OptionalLocalGroupBy == null)) { continue; } if ( !ExprNodeUtility.DeepEqualsIgnoreDupAndOrder( aggNode.OptionalLocalGroupBy.PartitionExpressions, aggNodeToAdd.OptionalLocalGroupBy.PartitionExpressions)) { continue; } } existing.AddEquivalent(aggNodeToAdd); foundEquivalent = true; break; } if (!foundEquivalent) { equivalencyList.Add(new AggregationServiceAggExpressionDesc(aggNodeToAdd, aggNodeToAdd.Factory)); } }