private IQueryModelTransform CompileSearchQuery(SearchQuery query)
        {
            if (!query.BooleanOperation.HasValue)
            {
                throw new CompileException("Operation is not specified");
            }
            SearchQueryTransformer transformer;

            switch (query.Left.Type)
            {
            case SearchNode.SearchNodeType.Nil:
                throw new CompileException("Query is empty.");

            case SearchNode.SearchNodeType.Id:
            case SearchNode.SearchNodeType.Grouped:
                transformer = new SearchQueryTransformer(query);
                transformer.Nodes.Add(CompileSearchNode(query.Left));
                break;

            default:
                transformer = new SearchQueryTransformer(query);
                IQueryModelTransform s = CompileSearchNode(query.Left);
                if (s != null)
                {
                    transformer.Nodes.Add(s);
                }
                s = CompileSearchNode(query.Right);
                if (s != null)
                {
                    transformer.Nodes.Add(s);
                }
                break;
            }
            return(transformer);
        }
        public virtual string Compile(SearchNode node)
        {
            if (node == null)
            {
                throw new CompileException("Not a valid query.");
            }
            IQueryModelTransform structure = CompileSearchNode(node);

            if (structure == null)
            {
                throw new CompileException("Failed to compile query!");
            }
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                ContractResolver  = new CamelCasePropertyNamesContractResolver(),
                Converters        = new List <JsonConverter> {
                    new StringEnumConverter {
                        CamelCaseText = false
                    }
                },
            };

            return(JsonConvert.SerializeObject(structure, settings));
        }