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));
            }
        }