public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Dictionary<string, object> fieldDict = serializer.Deserialize<Dictionary<string, object>>(reader);

            if (fieldDict.ContainsKey(_CONSTANT_SCORE))
                fieldDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(fieldDict.First().Value.ToString());

            ConstantScoreQueryBase constantScore = null;

            if (fieldDict.ContainsKey(_QUERY))
            { 
                Dictionary<string, object> queryDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(fieldDict[_QUERY].ToString());
                QueryTypeEnum queryType = QueryTypeEnum.ConstantScoreQuery;
                queryType = QueryTypeEnum.Find(queryDict.First().Key);
                IQuery query = JsonConvert.DeserializeObject(queryDict.First().Value.ToString(), queryType.ImplementationType) as IQuery;
                constantScore = new ConstantScoreQuery(query);
            }
            else if (fieldDict.ContainsKey(_FILTER))
            {
                Dictionary<string, object> filterDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(fieldDict[_FILTER].ToString());
                FilterTypeEnum filterType = FilterTypeEnum.Term;
                filterType = FilterTypeEnum.Find(filterDict.First().Key);
                IFilter filter = JsonConvert.DeserializeObject(filterDict.First().Value.ToString(), filterType.ImplementationType) as IFilter;
                constantScore = new ConstantScoreFilter(filter);
            }
            else 
            {
                throw new Exception("ConstantScore expects a filter or query.");
            }

            constantScore.Boost = fieldDict.GetDouble(QuerySerializer._BOOST, QuerySerializer._BOOST_DEFAULT);
            constantScore.QueryName = fieldDict.GetStringOrDefault(QuerySerializer._QUERY_NAME);
            return constantScore;
        }   
        public void PASS_CreateQuery()
        {
            ConstantScoreFilter query = new ConstantScoreFilter(new TermFilter("field", "value"))
            {
                Boost = 1.2
            };

            Assert.IsNotNull(query);
            Assert.AreEqual(1.2, query.Boost);
            Assert.IsTrue(query.SearchPiece is TermFilter);
            Assert.AreEqual("field", (query.SearchPiece as TermFilter).Field);
            Assert.AreEqual("value", (query.SearchPiece as TermFilter).Value);
        }
        public void PASS_Serialize()
        {
            ConstantScoreFilter query = new ConstantScoreFilter(new TermFilter("field", "value"))
            {
                Boost = 1.2
            };

            string json = JsonConvert.SerializeObject(query);

            Assert.IsNotNull(json);

            string expectedJson = "{\"constant_score\":{\"filter\":{\"term\":{\"field\":\"value\"}},\"boost\":1.2}}";
            Assert.AreEqual(expectedJson, json);
        }