Browse Source

complete bool query

shzhulin3 3 years ago
parent
commit
d0f422521a

+ 13 - 0
src/search_local/index_read/component.cc

@@ -21,6 +21,10 @@
 #include "db_manager.h"
 #include "utf8_str.h"
 #include "query/bool_query_parser.h"
+#include "query/geo_distance_parser.h"
+#include "query/range_query_parser.h"
+#include "query/match_query_parser.h"
+#include "query/term_query_parser.h"
 #include <sstream>
 using namespace std;
 
@@ -218,6 +222,14 @@ void Component::GetQueryWord(uint32_t &m_has_gis){
 	if(m_query.isObject()){
 		if(m_query.isMember("bool")){
 			query_parser = new BoolQueryParser(m_appid, m_query["bool"]);
+		} else if(m_query.isMember("geo_distance")){
+			query_parser = new GeoDistanceParser(m_appid, m_query["geo_distance"]);
+		} else if(m_query.isMember("range")){
+			query_parser = new RangeQueryParser(m_appid, m_query["range"]);
+		} else if(m_query.isMember("match")){
+			query_parser = new MatchQueryParser(m_appid, m_query["match"]);
+		} else if(m_query.isMember("term")){
+			query_parser = new TermQueryParser(m_appid, m_query["term"]);
 		}
 		query_parser_res = new QueryParserRes();
 		query_parser->ParseContent(query_parser_res);
@@ -234,6 +246,7 @@ void Component::GetQueryWord(uint32_t &m_has_gis){
 			latitude = query_parser_res->Latitude();
 			longitude = query_parser_res->Longitude();
 			distance = query_parser_res->Distance();
+			log_debug("lat: %s, lon: %s, distance: %f", latitude.c_str(), longitude.c_str(), distance);
 		}
 		extra_filter_keys.assign(query_parser_res->ExtraFilterKeys().begin(), query_parser_res->ExtraFilterKeys().end());
 		extra_filter_and_keys.assign(query_parser_res->ExtraFilterAndKeys().begin(), query_parser_res->ExtraFilterAndKeys().end());

+ 14 - 6
src/search_local/index_read/query/bool_query_parser.cc

@@ -4,13 +4,15 @@
 #include "range_query_parser.h"
 #include "term_query_parser.h"
 #include "match_query_parser.h"
+#include "geo_distance_parser.h"
 
-const char* const BoolQueryParser::NAME ="bool";
-const char* const BoolQueryParser::MUST ="must";
-const char* const BoolQueryParser::SHOULD ="should";
-const char* const BoolQueryParser::TERM ="term";
-const char* const BoolQueryParser::MATCH ="match";
-const char* const BoolQueryParser::RANGE ="range";
+const char* const NAME ="bool";
+const char* const MUST ="must";
+const char* const SHOULD ="should";
+const char* const TERM ="term";
+const char* const MATCH ="match";
+const char* const RANGE ="range";
+const char* const GEODISTANCE ="geo_distance";
 
 BoolQueryParser::BoolQueryParser(uint32_t a, Json::Value& v)
 :appid(a),value(v)
@@ -28,6 +30,9 @@ BoolQueryParser::~BoolQueryParser(){
 	if(NULL != match_query_parser){
 		delete match_query_parser;
 	}
+	if(NULL != geo_query_parser){
+		delete geo_query_parser;
+	}
 }
 
 void BoolQueryParser::DoJobByType(Json::Value& value, uint32_t type, QueryParserRes* query_parser_res){
@@ -40,6 +45,9 @@ void BoolQueryParser::DoJobByType(Json::Value& value, uint32_t type, QueryParser
 	} else if(value.isMember(RANGE)){
 		range_query_parser = new RangeQueryParser(appid, value[RANGE]);
 		range_query_parser->ParseContent(query_parser_res, type);
+	} else if(value.isMember(GEODISTANCE)){
+		geo_query_parser = new GeoDistanceParser(appid, value[GEODISTANCE]);
+		geo_query_parser->ParseContent(query_parser_res);
 	}
 }
 

+ 2 - 6
src/search_local/index_read/query/bool_query_parser.h

@@ -24,6 +24,7 @@
 class RangeQueryParser;
 class TermQueryParser;
 class MatchQueryParser;
+class GeoDistanceParser;
 class BoolQueryParser : public QueryParser
 {
 public:
@@ -38,15 +39,10 @@ private:
 private:
 	uint32_t appid;
 	Json::Value value;
-	static const char* const NAME;
-	static const char* const MUST;
-	static const char* const SHOULD;
-	static const char* const TERM;
-	static const char* const MATCH;
-	static const char* const RANGE;
 	RangeQueryParser* range_query_parser;
 	TermQueryParser* term_query_parser;
 	MatchQueryParser* match_query_parser;
+	GeoDistanceParser* geo_query_parser;
 };
 
 #endif

+ 1 - 1
src/search_local/index_read/query/geo_distance_parser.cc

@@ -102,8 +102,8 @@ void GeoDistanceParser::ParseContent(QueryParserRes* query_parser_res){
         stringstream sslat;
         stringstream sslon;
         sslat << geo.lat;
-        sslon << geo.lon;
         query_parser_res->Latitude() = sslat.str();
+        sslon << geo.lon;
         query_parser_res->Longitude() = sslon.str();
         query_parser_res->Distance() = distance;
 	}

+ 1 - 1
src/search_local/index_read/query/query_parser.h

@@ -48,7 +48,7 @@ public:
         return latitude;
     }
     string& Longitude(){
-        return latitude;
+        return longitude;
     }
     double& Distance(){
         return distance;

+ 4 - 3
src/search_local/index_read/query/range_query_parser.cc

@@ -53,9 +53,10 @@ void RangeQueryParser::ParseContent(QueryParserRes* query_parser_res, uint32_t t
 					info.range_type = RANGE_GTLT;
 				}
 			}
-			info.start = start.asInt();
-			info.end = end.asInt();
-			fieldInfos.push_back(info);
+			fieldInfo.start = start.asInt();
+			fieldInfo.end = end.asInt();
+			fieldInfo.range_type = info.range_type;
+			fieldInfos.push_back(fieldInfo);
 		}
 		if(fieldInfos.size() != 0){
             if(type == ORKEY){