Skip to content

Commit

Permalink
Changed how map data is passed in relevance model JSON API.
Browse files Browse the repository at this point in the history
  • Loading branch information
Baoqiu Cui committed May 22, 2012
1 parent 753ccfb commit cd7021c
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 47 deletions.
25 changes: 11 additions & 14 deletions sensei-core/src/main/antlr3/com/senseidb/bql/parsers/BQL.g
Expand Up @@ -2082,29 +2082,26 @@ python_style_list returns [JSONArray json]
python_style_dict returns [JSONObject json]
@init {
$json = new JSONObject();
JSONArray keys = new JSONArray();
JSONArray values = new JSONArray();
}
: '{' p=key_value_pair
{
keys.put($p.key);
values.put($p.val);
}
(COMMA p=key_value_pair
{
keys.put($p.key);
values.put($p.val);
}
)* '}'
{
try {
$json.put("key", keys);
$json.put("value", values);
$json.put($p.key, $p.val);
}
catch (JSONException err) {
throw new FailedPredicateException(input, "python_style_dict", "JSONException: " + err.getMessage());
}
}
(COMMA p=key_value_pair
{
try {
$json.put($p.key, $p.val);
}
catch (JSONException err) {
throw new FailedPredicateException(input, "python_style_dict", "JSONException: " + err.getMessage());
}
}
)* '}'
;
python_style_value returns [Object val]
Expand Down
Expand Up @@ -89,7 +89,7 @@
"values": {
"c":[1996,1997],
"e":0.98,
"j":{"key":[1,2,3], "value":[2.3, 3.4, 2.9]} // a user input hashmap;
"j":{"1":2.3, "2":3.4, "3":2.9} // a user input hashmap;
}
}
Expand Down Expand Up @@ -151,10 +151,10 @@
"values":{
"goodYear":[1996,1997],
"thisYear":2001,
"mileageWeight":{"key":[11400,11000],"value":[777.9, 10.2]},
"yearcolor":{"key":[1998],"value":["red"]},
"colorweight":{"key":["red"],"value":[335.5]},
"categorycolor":{"key":["compact"],"value":["red"]},
"mileageWeight":{"11400":777.9, "11000":10.2},
"yearcolor":{"1998":"red"},
"colorweight":{"red":335.5},
"categorycolor":{"compact":"red"},
"coolTag":"cool"
}
}
Expand Down Expand Up @@ -667,20 +667,9 @@ else if (typeNum >= RelevanceJSONConstants.TYPENUMBER_MAP_INT_INT &&
if (values == null)
throw new JSONException("Variable "+ symbol + " does not have value.");

JSONArray keysList = values.optJSONArray("key");
JSONArray valuesList = values.optJSONArray("value");

if (keysList == null)
throw new JSONException("Variable " + symbol + " is a map, but does not have a key list.");

if (valuesList == null)
throw new JSONException("Variable " + symbol + "is a map, but does not have a value list.");
JSONArray keysList = values.names();

int keySize = keysList.length();
int valueSize = valuesList.length();

if (keySize != valueSize)
throw new JSONException("Variable " + symbol + ": key size is different from value size, can not convert to a map." );

Map hm = null;
switch (typeNum)
Expand All @@ -689,70 +678,75 @@ else if (typeNum >= RelevanceJSONConstants.TYPENUMBER_MAP_INT_INT &&
hm = new Int2IntOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Int2IntOpenHashMap) hm).put(keysList.getInt(j), valuesList.getInt(j));
((Int2IntOpenHashMap) hm).put(keysList.getInt(j), values.getInt(keysList.getString(j)));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_INT_DOUBLE:
hm = new Int2DoubleOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Int2DoubleOpenHashMap) hm).put(keysList.getInt(j), valuesList.getDouble(j));
((Int2DoubleOpenHashMap) hm).put(keysList.getInt(j), values.getDouble(keysList.getString(j)));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_INT_FLOAT:
hm = new Int2FloatOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Int2FloatOpenHashMap) hm).put(keysList.getInt(j), (float) valuesList.getDouble(j));
((Int2FloatOpenHashMap) hm).put(keysList.getInt(j), (float) values.getDouble(keysList.getString(j)));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_INT_LONG:
hm = new Int2LongOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Int2LongOpenHashMap) hm).put(keysList.getInt(j), Long.parseLong(valuesList.getString(j)));
((Int2LongOpenHashMap) hm).put(keysList.getInt(j), Long.parseLong(values.getString(keysList.getString(j))));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_INT_STRING:
hm = new Int2ObjectOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Int2ObjectOpenHashMap) hm).put(keysList.getInt(j), valuesList.getString(j));
((Int2ObjectOpenHashMap) hm).put(keysList.getInt(j), values.getString(keysList.getString(j)));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_STRING_INT:
hm = new Object2IntOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Object2IntOpenHashMap) hm).put(keysList.getString(j), valuesList.getInt(j));
String key = keysList.getString(j);
((Object2IntOpenHashMap) hm).put(key, values.getInt(key));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_STRING_DOUBLE:
hm = new Object2DoubleOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Object2DoubleOpenHashMap) hm).put(keysList.getString(j), valuesList.getDouble(j));
String key = keysList.getString(j);
((Object2DoubleOpenHashMap) hm).put(key, values.getDouble(key));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_STRING_FLOAT:
hm = new Object2FloatOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Object2FloatOpenHashMap) hm).put(keysList.getString(j), (float) valuesList.getDouble(j));
String key = keysList.getString(j);
((Object2FloatOpenHashMap) hm).put(key, (float) values.getDouble(key));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_STRING_LONG:
hm = new Object2LongOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Object2LongOpenHashMap) hm).put(keysList.getString(j), Long.parseLong(valuesList.getString(j)));
String key = keysList.getString(j);
((Object2LongOpenHashMap) hm).put(key, Long.parseLong(values.getString(keysList.getString(j))));
}
break;
case RelevanceJSONConstants.TYPENUMBER_MAP_STRING_STRING:
hm = new Object2ObjectOpenHashMap();
for (int j = 0; j < keySize; j++)
{
((Object2ObjectOpenHashMap) hm).put(keysList.getString(j), valuesList.getString(j));
String key = keysList.getString(j);
((Object2ObjectOpenHashMap) hm).put(key, values.getString(key));
}
break;
}
Expand Down
9 changes: 4 additions & 5 deletions sensei-core/src/test/java/com/senseidb/test/TestSensei.java
Expand Up @@ -774,7 +774,7 @@ public void testRelevanceInnerScore() throws Exception
public void testRelevanceHashMapInt2Float() throws Exception
{
logger.info("executing test case testRelevanceHashMapInt2Int");
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"long\":[\"groupid\"]},\"function\":\" if(mileageWeight.containsKey(mileage)) return 10000+mileageWeight.get(mileage); if(goodYear.contains(year)) return (float)Math.exp(2d); if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"]}},\"values\":{\"thisYear\":2001,\"mileageWeight\":{\"value\":[777.9,10.2],\"key\":[11400,11000]},\"goodYear\":[1996,1997]}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"long\":[\"groupid\"]},\"function\":\" if(mileageWeight.containsKey(mileage)) return 10000+mileageWeight.get(mileage); if(goodYear.contains(year)) return (float)Math.exp(2d); if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"]}},\"values\":{\"thisYear\":2001,\"mileageWeight\":{\"11400\":777.9, \"11000\":10.2},\"goodYear\":[1996,1997]}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
JSONObject res = search(new JSONObject(req));
assertEquals("numhits is wrong", 15000, res.getInt("numhits"));
//the first one should has socre 10777.900390625, and mileage: 11400;
Expand All @@ -800,8 +800,7 @@ public void testRelevanceHashMapInt2Float() throws Exception
public void testRelevanceHashMapInt2String() throws Exception
{
logger.info("executing test case testRelevanceHashMapInt2String");
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\",\"color\",\"yearcolor\",\"colorweight\",\"category\",\"categorycolor\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"string\":[\"color\",\"category\"],\"long\":[\"groupid\"]},\"function\":\"if(yearcolor.containsKey(year) && yearcolor.get(year).equals(color)) return 100000f; if(goodYear.contains(year)) return (float)Math.exp(2d); if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"map_int_string\":[\"yearcolor\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"],\"map_string_float\":[\"colorweight\"],\"map_string_string\":[\"categorycolor\"]}},\"values\":{\"thisYear\":2001,\"yearcolor\":{\"value\":[\"red\"],\"key\":[1998]},\"mileageWeight\":{\"value\":[777.9,10.2],\"key\":[11400,11000]},\"colorweight\":{\"value\":[335.5],\"key\":[\"red\"]},\"goodYear\":[1996,1997],\"categorycolor\":{\"value\":[\"red\"],\"key\":[\"compact\"]}}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
JSONObject res = search(new JSONObject(req));
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\",\"color\",\"yearcolor\",\"colorweight\",\"category\",\"categorycolor\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"string\":[\"color\",\"category\"],\"long\":[\"groupid\"]},\"function\":\"if(yearcolor.containsKey(year) && yearcolor.get(year).equals(color)) return 100000f; if(goodYear.contains(year)) return (float)Math.exp(2d); if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"map_int_string\":[\"yearcolor\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"],\"map_string_float\":[\"colorweight\"],\"map_string_string\":[\"categorycolor\"]}},\"values\":{\"thisYear\":2001,\"yearcolor\":{\"1998\":\"red\"},\"mileageWeight\":{\"11400\":777.9, \"11000\":10.2},\"colorweight\":{\"red\":335.5},\"goodYear\":[1996,1997],\"categorycolor\":{\"compact\":\"red\"}}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}"; JSONObject res = search(new JSONObject(req));
assertEquals("numhits is wrong", 15000, res.getInt("numhits"));
//the first one should has socre 10777.900390625, and mileage: 11400;
JSONArray hits = res.getJSONArray("hits");
Expand Down Expand Up @@ -831,7 +830,7 @@ public void testRelevanceHashMapInt2String() throws Exception
public void testRelevanceHashMapString2Float() throws Exception
{
logger.info("executing test case testRelevanceHashMapString2Float");
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\",\"color\",\"yearcolor\",\"colorweight\",\"category\",\"categorycolor\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"string\":[\"color\",\"category\"],\"long\":[\"groupid\"]},\"function\":\" if(colorweight.containsKey(color) ) return 200f + colorweight.getFloat(color); if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"map_int_string\":[\"yearcolor\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"],\"map_string_float\":[\"colorweight\"],\"map_string_string\":[\"categorycolor\"]}},\"values\":{\"thisYear\":2001,\"yearcolor\":{\"value\":[\"red\"],\"key\":[1998]},\"mileageWeight\":{\"value\":[777.9,10.2],\"key\":[11400,11000]},\"colorweight\":{\"value\":[335.5],\"key\":[\"red\"]},\"goodYear\":[1996,1997],\"categorycolor\":{\"value\":[\"red\"],\"key\":[\"compact\"]}}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\",\"color\",\"yearcolor\",\"colorweight\",\"category\",\"categorycolor\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"string\":[\"color\",\"category\"],\"long\":[\"groupid\"]},\"function\":\" if(colorweight.containsKey(color) ) return 200f + colorweight.getFloat(color); if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"map_int_string\":[\"yearcolor\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"],\"map_string_float\":[\"colorweight\"],\"map_string_string\":[\"categorycolor\"]}},\"values\":{\"thisYear\":2001,\"yearcolor\":{\"1998\":\"red\"},\"mileageWeight\":{\"11400\":777.9, \"11000\":10.2},\"colorweight\":{\"red\":335.5},\"goodYear\":[1996,1997],\"categorycolor\":{\"compact\":\"red\"}}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
JSONObject res = search(new JSONObject(req));
assertEquals("numhits is wrong", 15000, res.getInt("numhits"));
//the first one should has socre 10777.900390625, and mileage: 11400;
Expand All @@ -856,7 +855,7 @@ public void testRelevanceHashMapString2Float() throws Exception
public void testRelevanceHashMapString2String() throws Exception
{
logger.info("executing test case testRelevanceHashMapInt2Int");
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\",\"color\",\"yearcolor\",\"colorweight\",\"category\",\"categorycolor\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"string\":[\"color\",\"category\"],\"long\":[\"groupid\"]},\"function\":\" if(categorycolor.containsKey(category) && categorycolor.get(category).equals(color)) return 10000f; if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"map_int_string\":[\"yearcolor\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"],\"map_string_float\":[\"colorweight\"],\"map_string_string\":[\"categorycolor\"]}},\"values\":{\"thisYear\":2001,\"yearcolor\":{\"value\":[\"red\"],\"key\":[1998]},\"mileageWeight\":{\"value\":[777.9,10.2],\"key\":[11400,11000]},\"colorweight\":{\"value\":[335.5],\"key\":[\"red\"]},\"goodYear\":[1996,1997],\"categorycolor\":{\"value\":[\"red\"],\"key\":[\"compact\"]}}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
String req = "{\"sort\":[\"_score\"],\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"_INNER_SCORE\",\"thisYear\",\"year\",\"goodYear\",\"mileageWeight\",\"mileage\",\"color\",\"yearcolor\",\"colorweight\",\"category\",\"categorycolor\"],\"facets\":{\"int\":[\"year\",\"mileage\"],\"string\":[\"color\",\"category\"],\"long\":[\"groupid\"]},\"function\":\" if(categorycolor.containsKey(category) && categorycolor.get(category).equals(color)) return 10000f; if(year==thisYear) return 87f ; return _INNER_SCORE;\",\"variables\":{\"map_int_float\":[\"mileageWeight\"],\"map_int_string\":[\"yearcolor\"],\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"],\"map_string_float\":[\"colorweight\"],\"map_string_string\":[\"categorycolor\"]}},\"values\":{\"thisYear\":2001,\"yearcolor\":{\"1998\":\"red\"},\"mileageWeight\":{\"11400\":777.9, \"11000\":10.2},\"colorweight\":{\"red\":335.5},\"goodYear\":[1996,1997],\"categorycolor\":{\"compact\":\"red\"}}}}},\"fetchStored\":false,\"from\":0,\"explain\":false,\"size\":6}";
JSONObject res = search(new JSONObject(req));
assertEquals("numhits is wrong", 15000, res.getInt("numhits"));
//the first one should has socre 10777.900390625, and mileage: 11400;
Expand Down
Expand Up @@ -1642,7 +1642,7 @@ public void testRelevanceModelMapValue() throws Exception
"ORDER BY relevance"
);

JSONObject expected = new JSONObject("{\"sort\":\"relevance\",\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"predefined_model\":\"my_model\",\"values\":{\"thisYear\":2001,\"myMap\":{\"value\":[1,2],\"key\":[\"aaa\",\"bbb\"]}}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"*\"]}}");
JSONObject expected = new JSONObject("{\"sort\":\"relevance\",\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"predefined_model\":\"my_model\",\"values\":{\"thisYear\":2001,\"myMap\":{\"aaa\":1,\"bbb\":2}}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"*\"]}}");
assertTrue(_comp.isEquals(json, expected));
}

Expand Down

0 comments on commit cd7021c

Please sign in to comment.