private void ReadTerms(ref JsonReader reader, ITermsQuery termsQuery, IJsonFormatterResolver formatterResolver)
        {
            var token = reader.GetCurrentJsonToken();

            if (token == JsonToken.BeginObject)
            {
                var fieldLookup = new FieldLookup();

                var count = 0;
                while (reader.ReadIsInObject(ref count))
                {
                    var property = reader.ReadPropertyNameSegmentRaw();
                    if (FieldLookups.TryGetValue(property, out var value))
                    {
                        switch (value)
                        {
                        case 0:
                            fieldLookup.Id = formatterResolver.GetFormatter <Id>()
                                             .Deserialize(ref reader, formatterResolver);
                            break;

                        case 1:
                            fieldLookup.Index = formatterResolver.GetFormatter <IndexName>()
                                                .Deserialize(ref reader, formatterResolver);
                            break;

                        case 2:
                            fieldLookup.Path = formatterResolver.GetFormatter <Field>()
                                               .Deserialize(ref reader, formatterResolver);
                            break;

                        case 3:
                            fieldLookup.Routing = formatterResolver.GetFormatter <Routing>()
                                                  .Deserialize(ref reader, formatterResolver);
                            break;
                        }
                    }
                }

                termsQuery.TermsLookup = fieldLookup;
            }
            else if (token == JsonToken.BeginArray)
            {
                var values = formatterResolver.GetFormatter <IEnumerable <object> >()
                             .Deserialize(ref reader, formatterResolver);
                termsQuery.Terms = values;
            }
        }
        private void ReadTerms(ITermsQuery termsQuery, JsonReader reader, JsonSerializer serializer)
        {
            reader.Read();
            if (reader.TokenType == JsonToken.StartObject)
            {
                var ef    = new FieldLookup();
                var depth = reader.Depth;
                while (reader.Read() && reader.Depth >= depth && reader.Value != null)
                {
                    var property = reader.Value as string;
                    switch (property)
                    {
                    case "id":
                        reader.Read();
                        var id = serializer.Deserialize <Id>(reader);
                        ef.Id = id;
                        break;

                    case "index":
                        reader.Read();
                        ef.Index = reader.Value as string;
                        break;

                    case "type":
                        reader.Read();
                        ef.Type = reader.Value as string;
                        break;

                    case "path":
                        reader.Read();
                        ef.Path = reader.Value as string;
                        break;

                    case "routing":
                        reader.Read();
                        ef.Routing = reader.Value as string;
                        break;
                    }
                }
                termsQuery.TermsLookup = ef;
            }
            else if (reader.TokenType == JsonToken.StartArray)
            {
                var values = JArray.Load(reader).Values <object>();
                termsQuery.Terms = values;
            }
        }