public override void Visit(BasicRule visitee)
        {
            PathBasedFieldSelector pathSelector = FindPathSelector(visitee.Selector);

            if (pathSelector == null)
            {
                //TODO: Allow other selectors if they are all equal.
                throw new InvalidOperationException("Self referencing selector requires a path based selector.");
            }

            if (SelectorPath == null)
            {
                SelectorPath = pathSelector.Path;
                Alias        = visitee.Alias;
                return;
            }

            if (SelectorPath != pathSelector.Path)
            {
                throw new InvalidOperationException("Json Rule Tree had multiple different selectors.");
            }

            if (Alias == null)
            {
                //Note: If Alias is null, we allow the next rule to provide one.
                Alias = visitee.Alias;
                return;
            }

            if (Alias != visitee.Alias)
            {
                //Note: If multiple aliases was found, we defer back to the selector.
                Alias = SelectorPath;
            }
        }
        private static PathBasedFieldSelector FindPathSelector(FieldSelector selector)
        {
            PathBasedFieldSelector pathSelector = selector as PathBasedFieldSelector;

            if (pathSelector != null)
            {
                return(pathSelector);
            }

            AggregateFieldSelector aggregateSelector = selector as AggregateFieldSelector;

            if (aggregateSelector != null)
            {
                return(FindPathSelector(aggregateSelector.Selector));
            }

            return(null);
        }