/** * This software is licensed to you under the Apache License, Version 2.0 (the * "Apache License"). * * LinkedIn's contributions are made under the Apache License. If you contribute * to the Software, the contributions will be deemed to have been made under the * Apache License, unless you expressly indicate otherwise. Please do not make any * contributions that would be inconsistent with the Apache License. * * You may obtain a copy of the Apache License at http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, this software * distributed under the Apache License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache * License for the specific language governing permissions and limitations for the * software governed under the Apache License. * * © 2012 LinkedIn Corp. All Rights Reserved. */ package com.senseidb.test.bql.parsers; import java.util.Map; import java.util.HashMap; import junit.framework.TestCase; import org.antlr.runtime.*; import org.junit.Test; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONException; import com.senseidb.bql.parsers.BQLCompiler; import com.senseidb.util.JsonTemplateProcessor; import com.senseidb.util.JSONUtil.FastJSONArray; import com.senseidb.util.JSONUtil.FastJSONObject; import java.text.ParseException; import java.text.SimpleDateFormat; public class TestBQL extends TestCase { private BQLCompiler _compiler; private JsonComparator _comp = new JsonComparator(1); public TestBQL() { super(); Map<String, String[]> facetInfoMap = new HashMap<String, String[]>(); facetInfoMap.put("tags", new String[]{"multi", "string"}); facetInfoMap.put("category", new String[]{"simple", "string"}); facetInfoMap.put("price", new String[]{"range", "float"}); facetInfoMap.put("mileage", new String[]{"range", "int"}); facetInfoMap.put("color", new String[]{"simple", "string"}); facetInfoMap.put("year", new String[]{"range", "int"}); facetInfoMap.put("makemodel", new String[]{"path", "string"}); facetInfoMap.put("city", new String[]{"path", "string"}); facetInfoMap.put("long_id", new String[]{"simple", "long"}); facetInfoMap.put("groupid_range", new String[]{"range", "long"}); facetInfoMap.put("time", new String[]{"custom", ""}); // Mimic a custom facet _compiler = new BQLCompiler(facetInfoMap); } @Test public void testDateRange() throws Exception { String bql = "select long_id , city, _grouphitscount FROM ucp WHERE tags IN ('nus:category:profile') AND color IN ('linkedin:profile-update', 'linkedin:profile-add', 'linkedin:profile-become', 'linkedin:profile-be-studying') AND " + "groupid_range >= $startDate AND groupid_range <= $endDate ORDER BY groupid_range ASC limit 0, 500 ROUTE BY \"0\"\n"; System.out.println(_compiler.compile(bql).toString()); } @Test public void testBasic1() throws Exception { System.out.println("testBasic1"); System.out.println("=================================================="); // No where clause JSONObject json = _compiler.compile( "select category /* BLOCK COMMENTS */ " + "from cars -- LINE COMMENTS" ); JSONObject expected = new JSONObject("{\"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testBasic2() throws Exception { System.out.println("testBasic2"); System.out.println("=================================================="); // No where clause, with a '*' in SELECT list JSONObject json = _compiler.compile( "select * " + "from cars " ); JSONObject expected = new JSONObject("{\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testOrderBy() throws Exception { System.out.println("testOrderBy"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "ORDER BY color" ); JSONObject expected = new JSONObject("{\"sort\": [{\"color\": \"asc\"}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testOrderBy2() throws Exception { System.out.println("testOrderBy2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "ORDER BY color, price DESC, year ASC" ); JSONObject expected = new JSONObject("{\"sort\": [{\"color\": \"asc\"},{\"price\": \"desc\"},{\"year\": \"asc\"}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testOrderByRelevance() throws Exception { System.out.println("testOrderByRelevance"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "ORDER BY relevance" ); JSONObject expected = new JSONObject("{\"sort\":\"relevance\",\"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testLimit1() throws Exception { System.out.println("testLimit1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "LIMIT 123" ); JSONObject expected = new JSONObject("{\"from\": 0, \"size\": 123, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testLimit2() throws Exception { System.out.println("testLimit2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "LIMIT 15, 30" ); JSONObject expected = new JSONObject("{\"from\": 15, \"size\": 30, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testGroupBy1() throws Exception { System.out.println("testGroupBy1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "GROUP BY color" ); JSONObject expected = new JSONObject("{\"groupBy\": {\"columns\": [\"color\"],\"top\":10}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testGroupBy2() throws Exception { System.out.println("testGroupBy2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "GROUP BY color TOP 5" ); JSONObject expected = new JSONObject("{\"groupBy\": {\"columns\": [\"color\"], \"top\":5}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testGroupByOrColumns() throws Exception { System.out.println("testGroupByOrColumns"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "GROUP BY color OR category TOP 5" ); JSONObject expected = new JSONObject("{\"groupBy\":{\"columns\":[\"color\",\"category\"],\"top\":5},\"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testEqualPredInteger() throws Exception { System.out.println("testEqualPredInteger"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE year = 1999" ); JSONObject expected = new JSONObject("{\"selections\":[{\"range\":{\"year\":{\"to\":1999,\"include_lower\":true,\"include_upper\":true,\"from\":1999}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testEqualPredFloat() throws Exception { System.out.println("testEqualPredFloat"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE price = 1500.99" ); JSONObject expected = new JSONObject("{\"selections\":[{\"range\":{\"price\":{\"to\":1500.99,\"include_lower\":true,\"include_upper\":true,\"from\":1500.99}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testEqualPredString() throws Exception { System.out.println("testEqualPredString"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE color = 'red'" ); JSONObject expected = new JSONObject("{\"selections\": [{\"term\": {\"color\": {\"value\": \"red\"}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testInPred1() throws Exception { System.out.println("testInPred1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE color IN ('red', 'blue', 'yellow')" ); JSONObject expected = new JSONObject("{\"selections\":[{\"terms\":{\"color\":{\"values\":[\"red\",\"blue\",\"yellow\"],\"excludes\":[],\"operator\":\"or\"}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testInPred2() throws Exception { System.out.println("testInPred2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE nonfacet IN ('red')" ); JSONObject expected = new JSONObject("{\"filter\":{\"terms\":{\"nonfacet\":{\"values\":[\"red\"],\"excludes\":[],\"operator\":\"or\",\"_noOptimize\":true}}}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testInPred3() throws Exception { System.out.println("testInPred3"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE year IN (1995,2000) " + " AND color = 'red'" ); } catch (RecognitionException err) { // System.out.println(">>> hit FailedPredicateException = " + err); // System.out.println(">>> err.line = " + err.line); // System.out.println(">>> err.charPositionInLine = " + err.charPositionInLine); // System.out.println(">>> err.token = " + err.token.getText()); result = 1; } assertEquals(result, 1); } @Test public void testNotInPred() throws Exception { System.out.println("testNotInPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE color NOT IN ('red', 'blue', 'yellow') EXCEPT ('black', 'green')" ); JSONObject expected = new JSONObject("{\"selections\":[{\"terms\":{\"color\":{\"excludes\":[\"red\",\"blue\",\"yellow\"],\"values\":[\"black\", \"green\"],\"operator\":\"or\"}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testContainsAll() throws Exception { System.out.println("testContainsAll"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE color CONTAINS ALL ('red', 'blue', 'yellow') EXCEPT ('black', 'green')" ); JSONObject expected = new JSONObject("{\"selections\":[{\"terms\":{\"color\":{\"values\":[\"red\",\"blue\",\"yellow\"],\"excludes\":[\"black\", \"green\"],\"operator\":\"and\"}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testPathPred1() throws Exception { System.out.println("testPathPred1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE city = 'china/hongkong' WITH ('strict':false, 'depth':1)" ); JSONObject expected = new JSONObject("{\"selections\":[{\"path\":{\"city\":{\"value\":\"china/hongkong\",\"strict\":false,\"depth\":1}}}], \"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testPathPred2() throws Exception { System.out.println("testPathPred2"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE city = 'china/hongkong' WITH ('strict':false, 'ddd':1)" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testNotEqualPred() throws Exception { System.out.println("testNotEqualPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE color <> 'red'" ); JSONObject expected = new JSONObject("{\"selections\":[{\"terms\":{\"color\":{\"values\":[],\"excludes\":[\"red\"],\"operator\":\"or\"}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testNotEqualForRange() throws Exception { System.out.println("testNotEqualForRange"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE year <> 2000" ); JSONObject expected = new JSONObject("{\"filter\":{\"or\":[{\"range\":{\"year\":{\"to\":2000,\"include_upper\":false}}},{\"range\":{\"year\":{\"include_lower\":false,\"from\":2000}}}]},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testQueryIs() throws Exception { System.out.println("testQueryIs"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE QUERY IS 'cool AND moon-roof'" ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"cool AND moon-roof\"}}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testQueryAndSelection1() throws Exception { System.out.println("testQueryAndSelection1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE QUERY IS 'cool AND moon-roof' " + "AND color = 'red' -- LINE COMMENTS\n" + "AND category = 'sedan'" ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"cool AND moon-roof\"}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}},{\"term\":{\"category\":{\"value\":\"sedan\"}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testQueryAndSelection2() throws Exception { System.out.println("testQueryAndSelection2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE QUERY IS 'cool AND moon-roof' " + "AND age = 12 " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"cool AND moon-roof\"}},\"filter\":{\"term\":{\"age\":{\"value\":12,\"_noOptimize\":true}}}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testBrowseBy1() throws Exception { System.out.println("testBrowseBy1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "BROWSE BY color" ); JSONObject expected = new JSONObject("{\"facets\":{\"color\":{\"max\":10,\"order\":\"hits\",\"expand\":false,\"minhit\":1}}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testBrowseBy2() throws Exception { System.out.println("testBrowseBy2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "BROWSE BY color, price(true, 1, 20, value), year" ); JSONObject expected = new JSONObject("{\"facets\":{\"price\":{\"max\":20,\"order\":\"val\",\"expand\":true,\"minhit\":1},\"color\":{\"max\":10,\"order\":\"hits\",\"expand\":false,\"minhit\":1},\"year\":{\"max\":10,\"order\":\"hits\",\"expand\":false,\"minhit\":1}}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testBetweenPred() throws Exception { System.out.println("testBetweenPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE year BETWEEN 2000 AND 2001" ); JSONObject expected = new JSONObject("{\"selections\":[{\"range\":{\"year\":{\"to\":2001,\"include_lower\":true,\"include_upper\":true,\"from\":2000}}}], \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testFetchingStored1() throws Exception { System.out.println("testFetchingStored1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "FETCHING STORED FALSE" ); JSONObject expected = new JSONObject("{\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testFetchingStored2() throws Exception { System.out.println("testFetchingStored2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "FETCHING STORED true" ); JSONObject expected = new JSONObject("{\"fetchStored\":true, \"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testNotBetweenPred() throws Exception { System.out.println("testNotBetweenPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT category " + "FROM cars " + "WHERE year NOT BETWEEN 2000 AND 2002" ); JSONObject expected = new JSONObject("{\"filter\":{\"or\":[{\"range\":{\"year\":{\"to\":2000,\"include_upper\":false}}},{\"range\":{\"year\":{\"include_lower\":false,\"from\":2002}}}]}, \"meta\":{\"select_list\":[\"category\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRangePred1() throws Exception { System.out.println("testRangePred1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT year " + "FROM cars " + "WHERE year > 1999" ); JSONObject expected = new JSONObject("{\"selections\":[{\"range\":{\"year\":{\"from\":1999,\"include_lower\":false}}}], \"meta\":{\"select_list\":[\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRangePred2() throws Exception { System.out.println("testRangePred2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT year " + "FROM cars " + "WHERE year <= 2000" ); JSONObject expected = new JSONObject("{\"selections\":[{\"range\":{\"year\":{\"to\":2000,\"include_upper\":true}}}], \"meta\":{\"select_list\":[\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRangePred3() throws Exception { System.out.println("testRangePred3"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT year " + "FROM cars " + "WHERE year > 1999 AND year <= 2003 AND year >= 1999" ); JSONObject expected = new JSONObject("{\"selections\":[{\"range\":{\"year\":{\"to\":2003,\"include_lower\":false,\"include_upper\":true,\"from\":1999}}}], \"meta\":{\"select_list\":[\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRangePred4() throws Exception { System.out.println("testRangePred4"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE name > 'abc' AND name < 'xyz' AND name >= 'ddd'" ); JSONObject expected = new JSONObject("{\"filter\":{\"range\":{\"name\":{\"to\":\"xyz\",\"include_lower\":true,\"include_upper\":false,\"from\":\"ddd\"}}}, \"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRangePred5() throws Exception { System.out.println("testRangePred5"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE year > 1999 AND year < 1995" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testOrPred() throws Exception { System.out.println("testOrPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE color = 'red' OR year > 1995" ); JSONObject expected = new JSONObject("{\"filter\":{\"or\":[{\"term\":{\"color\":{\"value\":\"red\"}}},{\"range\":{\"year\":{\"include_lower\":false,\"from\":1995}}}]}, \"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testAndPred() throws Exception { System.out.println("testAndPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE color = 'red' AND year > 1995" ); JSONObject expected = new JSONObject("{\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}},{\"range\":{\"year\":{\"include_lower\":false,\"from\":1995}}}], \"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testAndOrPred() throws Exception { System.out.println("testAndOrPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE (color = 'red' OR color = 'blue') " + " OR (color = 'black' AND tags CONTAINS ALL ('hybrid', 'moon-roof', 'leather'))" ); JSONObject expected = new JSONObject("{\"filter\":{\"or\":[{\"or\":[{\"term\":{\"color\":{\"value\":\"red\"}}},{\"term\":{\"color\":{\"value\":\"blue\"}}}]},{\"and\":[{\"term\":{\"color\":{\"value\":\"black\"}}},{\"terms\":{\"tags\":{\"values\":[\"hybrid\",\"moon-roof\",\"leather\"],\"excludes\":[],\"operator\":\"and\"}}}]}]}, \"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testSelectionAndFilter() throws Exception { System.out.println("testSelectionAndFilter"); System.out.println("=================================================="); // Here "age" is not a facet, so we have to treat it as a filter JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE color = 'red' AND age > 25" ); JSONObject expected = new JSONObject("{\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"filter\":{\"range\":{\"age\":{\"include_lower\":false,\"from\":25}}}, \"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testMultipleQueries() throws Exception { System.out.println("testMultipleQueries"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE (color = 'red' AND query is 'hybrid AND cool') " + " OR (color = 'blue' AND query is 'moon-roof AND navigation')" ); JSONObject expected = new JSONObject("{\"filter\":{\"or\":[{\"and\":[{\"term\":{\"color\":{\"value\":\"red\"}}},{\"query\":{\"query_string\":{\"query\":\"hybrid AND cool\"}}}]},{\"and\":[{\"term\":{\"color\":{\"value\":\"blue\"}}},{\"query\":{\"query_string\":{\"query\":\"moon-roof AND navigation\"}}}]}]}, \"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testMatchPred() throws Exception { System.out.println("testMatchPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE MATCH(f1, f2) AGAINST('text1 AND text2')" ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"text1 AND text2\",\"fields\":[\"f1\",\"f2\"]}}, \"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testNotMatchPred() throws Exception { System.out.println("testNotMatchPred"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color " + "FROM cars " + "WHERE NOT MATCH(color) AGAINST('red')" ); JSONObject expected = new JSONObject("{\"filter\":{\"bool\":{\"must_not\":{\"query\":{\"query_string\":{\"query\":\"red\",\"fields\":[\"color\"]}}}}},\"meta\":{\"select_list\":[\"color\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testLikePredicate1() throws Exception { System.out.println("testLikePredicate1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE category LIKE 's_d%'" ); JSONObject expected = new JSONObject("{\"query\":{\"wildcard\":{\"category\":\"s?d*\"}},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testLikePredicate2() throws Exception { System.out.println("testLikePredicate2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE category LIKE 'sed*'" ); JSONObject expected = new JSONObject("{\"query\":{\"wildcard\":{\"category\":\"sed*\"}},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testLikePredicate3() throws Exception { System.out.println("testLikePredicate3"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE price LIKE '123%'" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testNotLikePredicate() throws Exception { System.out.println("testNotLikePredicate"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color NOT LIKE 'bl%'" ); JSONObject expected = new JSONObject("{\"filter\":{\"bool\":{\"must_not\":{\"query\":{\"wildcard\":{\"color\":\"bl*\"}}}}},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testQueryAndLike() throws Exception { System.out.println("testQueryAndLike"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, category, tags " + "FROM cars " + "WHERE color LIKE 'bl%' " + " AND MATCH(contents) AGAINST('cool AND moon-roof') " + " AND category LIKE '%an'" ); JSONObject expected = new JSONObject("{\"query\":{\"wildcard\":{\"color\":\"bl*\"}},\"filter\":{\"and\":[{\"query\":{\"query_string\":{\"query\":\"cool AND moon-roof\",\"fields\":[\"contents\"]}}},{\"query\":{\"wildcard\":{\"category\":\"*an\"}}}]},\"meta\":{\"select_list\":[\"color\",\"category\",\"tags\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testColumnType1() throws Exception { System.out.println("testColumnType1"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color = 1" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testColumnType2() throws Exception { System.out.println("testColumnType2"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE mileage = 111 " + " OR (color IN ('red', 'blue') AND year > 'bbb')" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testColumnType3() throws Exception { System.out.println("testColumnType3"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color IN ('red', 123)" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testColumnType4() throws Exception { System.out.println("testColumnType4"); System.out.println("=================================================="); int result = 0; try { JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE tags CONTAINS ALL ('cool', 123)" ); } catch (RecognitionException err) { result = 1; } assertEquals(result, 1); } @Test public void testGivenClause1() throws Exception { System.out.println("testGivenClause1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "GIVEN FACET PARAM (My-Network, 'srcid', int, 8233570)" ); JSONObject expected = new JSONObject("{\"facetInit\":{\"My-Network\":{\"srcid\":{\"values\":[8233570],\"type\":\"int\"}}}, \"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testGivenClause2() throws Exception { System.out.println("testGivenClause2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "GIVEN FACET PARAM (My-Network, 'srcid', int, 8233570), " + " (time, 'now', long, '999999'), " + " (member, 'last_name', string, 'Cui'), " + " (member, 'age', int, 25)" ); JSONObject expected = new JSONObject("{\"facetInit\":{\"member\":{\"age\":{\"values\":[25],\"type\":\"int\"},\"last_name\":{\"values\":[\"Cui\"],\"type\":\"string\"}},\"time\":{\"now\":{\"values\":[\"999999\"],\"type\":\"long\"}},\"My-Network\":{\"srcid\":{\"values\":[8233570],\"type\":\"int\"}}}, \"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testGivenClause3() throws Exception { System.out.println("testGivenClause3"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "GIVEN FACET PARAM (member, 'age', int, (25, 30, 35, 40))" ); JSONObject expected = new JSONObject("{\"facetInit\":{\"member\":{\"age\":{\"values\":[25,30,35,40],\"type\":\"int\"}}},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testGivenClauseVariable() throws Exception { System.out.println("testGivenClauseVariable"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "GIVEN FACET PARAM (member, 'age', int, $user_age)" ); JSONObject expected = new JSONObject("{\"facetInit\":{\"member\":{\"age\":{\"values\":\"$user_age\",\"type\":\"int\"}}},\"meta\":{\"select_list\":[\"*\"],\"variables\":[\"user_age\"]}}"); assertTrue(_comp.isEquals(json, expected)); JsonTemplateProcessor jsonProc = new JsonTemplateProcessor(); json.put(JsonTemplateProcessor.TEMPLATE_MAPPING_PARAM, new FastJSONObject().put("user_age", new FastJSONArray().put(25))); JSONObject newJson = jsonProc.substituteTemplates(json); JSONObject expected2 = new JSONObject("{\"facetInit\":{\"member\":{\"age\":{\"values\":[25],\"type\":\"int\"}}},\"templateMapping\":{\"user_age\":[25]},\"meta\":{\"select_list\":[\"*\"],\"variables\":[\"user_age\"]}}"); assertTrue(_comp.isEquals(newJson, expected2)); } @Test public void testTimePred1() throws Exception { System.out.println("testTimePred1"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE time IN LAST 1 weeks 2 day 3 hours 4 mins 5 seconds 6 msecs" ); //System.out.println(">>> json: " + json); long timeStamp = Long.parseLong(json.getJSONObject("filter") .getJSONObject("range").getJSONObject("time").getString("from")); long timeSpan = 1 * (7 * 24 * 60 * 60 * 1000L) + 2 * (24 * 60 * 60 * 1000L) + 3 * (60 * 60 * 1000L) + 4 * (60 * 1000L) + 5 * 1000L + 6; // System.out.println(">>> now - timeStamp = " + (now - timeStamp)); // System.out.println(">>> timeSpan = " + timeSpan); // System.out.println(">>> now - timeStamp - timeSpan = " + (now - timeStamp - timeSpan)); assertTrue(now - timeStamp - timeSpan < 2); // Should be less than 2 msecs } @Test public void testTimePred2() throws Exception { System.out.println("testTimePred2"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE time SINCE 2 days 3 hours 4 minutes 6 milliseconds AGO" ); long timeStamp = Long.parseLong(json.getJSONObject("filter") .getJSONObject("range").getJSONObject("time").getString("from")); long timeSpan = 2 * (24 * 60 * 60 * 1000L) + 3 * (60 * 60 * 1000L) + 4 * (60 * 1000L) + 6; assertTrue(now - timeStamp - timeSpan < 2); // Should be less than 2 msecs } @Test public void testTimePred3() throws Exception { System.out.println("testTimePred3"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE time BEFORE 3 hours 4 min AGO" ); long timeStamp = Long.parseLong(json.getJSONObject("filter") .getJSONObject("range").getJSONObject("time").getString("to")); long timeSpan = 3 * (60 * 60 * 1000L) + 4 * (60 * 1000L); assertTrue(now - timeStamp - timeSpan < 2); // Should be less than 2 msecs } @Test public void testNotTimePred1() throws Exception { System.out.println("testNotTimePred1"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE time NOT BEFORE 3 hours 4 min AGO" ); long timeStamp = Long.parseLong(json.getJSONObject("filter") .getJSONObject("range").getJSONObject("time").getString("from")); long timeSpan = 3 * (60 * 60 * 1000L) + 4 * (60 * 1000L); assertTrue(now - timeStamp - timeSpan < 2); // Should be less than 2 msecs } @Test public void testDateTime1() throws Exception { System.out.println("testDateTime1"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE time < 2012-01-02 12:10:30" ); long timeStamp = Long.parseLong(json.getJSONObject("filter") .getJSONObject("range").getJSONObject("time").getString("to")); long expected = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-01-02 12:10:30").getTime(); assertEquals(timeStamp, expected); } @Test public void testDateTime2() throws Exception { System.out.println("testDateTime2"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE time < 2012-01-02" ); long timeStamp = Long.parseLong(json.getJSONObject("filter") .getJSONObject("range").getJSONObject("time").getString("to")); long expected = new SimpleDateFormat("yyyy-MM-dd").parse("2012-01-02").getTime(); assertEquals(timeStamp, expected); } @Test public void testDateTime3() throws Exception { System.out.println("testDateTime3"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "WHERE time > 2012-01-02 AND time <= 2012/01/31 \n" + " AND color = 'red'" ); //System.out.println(">>> json: " + json); JSONObject timeRange = json.getJSONObject("filter").getJSONObject("range"); long fromTime = Long.parseLong(timeRange.getJSONObject("time").getString("from")); long expectedFromTime = new SimpleDateFormat("yyyy-MM-dd").parse("2012-01-02").getTime(); assertEquals(fromTime, expectedFromTime); assertFalse(timeRange.getJSONObject("time").getBoolean("include_lower")); long toTime = Long.parseLong(timeRange.getJSONObject("time").getString("from")); long expectedToTime = new SimpleDateFormat("yyyy/MM/dd").parse("2012/01/31").getTime(); assertEquals(fromTime, expectedFromTime); assertTrue(timeRange.getJSONObject("time").getBoolean("include_upper")); } @Test public void testUID() throws Exception { System.out.println("testUID"); System.out.println("=================================================="); long now = System.currentTimeMillis(); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE _uid IN (123, 124)" ); JSONObject expected = new JSONObject("{\"selections\":[{\"terms\":{\"_uid\":{\"values\":[123,124],\"excludes\":[],\"operator\":\"or\"}}}],\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testLongValue() throws Exception { System.out.println("testLongValue"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE long_id IN (5497057336205783040)" ); // System.out.println(">>> json = " + json); JSONObject expected = new JSONObject("{\"selections\":[{\"terms\":{\"long_id\":{\"values\":[5497057336205783040],\"excludes\":[],\"operator\":\"or\"}}}],\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testCorrectStatement() throws Exception { System.out.println("testCorrectStatement"); System.out.println("=================================================="); //compile the statement JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE QUERY IS \"hello\" " + " AND color IN (\"red\", \"blue\") EXCEPT ('red') " + " AND category = 'sedan' WITH ('aaa':'111', 'bbb':'222', 'ccc':'333') " + " AND year NOT BETWEEN 1999 AND 2000" ); // for (int i = 0; i < ast.getChildCount(); ++i) // { // System.out.print(ast.getChild(i).getText() + " -- "); // } //check AST structure //assertEquals(BQLParser.SELECT, ast.getChild(0).getType()); //assertEquals(BQLParser.STAR, ast.getChild(1).getType()); } @Test public void testNullPred1() throws Exception { System.out.println("testNullPred1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE price IS NOT NULL" ); JSONObject expected = new JSONObject("{\"filter\":{\"bool\":{\"must_not\":{\"isNull\":\"price\"}}},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testNullPred2() throws Exception { System.out.println("testNullPred2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE price IS NULL" ); JSONObject expected = new JSONObject("{\"filter\":{\"isNull\":\"price\"},\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRouteBy() throws Exception { System.out.println("testRouteBy"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "ROUTE BY '1234'" ); JSONObject expected = new JSONObject("{\"routeParam\":\"1234\",\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testStringColumnName() throws Exception { System.out.println("testStringColumnName"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT 'color', year " + "FROM cars " ); JSONObject expected = new JSONObject("{\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testSubColumnName() throws Exception { System.out.println("testSubColumnName"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT _srcdata.color, _srcdata.'$time' " + "FROM cars " ); JSONObject expected = new JSONObject("{\"fetchStored\":true,\"meta\":{\"select_list\":[\"_srcdata.color\",\"_srcdata.$time\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModel1() throws Exception { System.out.println("testRelevanceModel1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL homepage_top (srcid:1234)" ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"values\":{\"srcid\":1234},\"predefined_model\":\"homepage_top\"}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelIfStmt() throws Exception { System.out.println("testRelevanceModelIfStmt"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int intParam1, int intParam2, String strParam, int srcid) " + " BEGIN " + " int myInt = 100 + intParam1 + intParam2; " + " String newStr = strParam; " + " if (srcid == myInt + 2) " + " return 123; " + " else if (srcid > 200) " + " return 345; " + " else " + " return _INNER_SCORE; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"intParam1\",\"intParam2\",\"strParam\",\"srcid\",\"_INNER_SCORE\"],\"facets\":{},\"variables\":{\"int\":[\"intParam1\",\"intParam2\",\"srcid\"],\"string\":[\"strParam\"]},\"function\":\"int myInt = 100 + intParam1 + intParam2; String newStr = strParam; if (srcid == myInt + 2) return 123; else if (srcid > 200) return 345; else return _INNER_SCORE;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelFloatLiteral() throws Exception { System.out.println("testRelevanceModelFloatLiteral"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int srcid) " + " BEGIN " + " float x1 = 1.2; " + " int x = 7.; " + " x = 7.5e12; " + " x = 7.5e-12; " + " x = 7.5e-12f; " + " x = .34; " + " x = .34e+12; " + " x = 123f; " + " return 0.25; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\"],\"facets\":{},\"variables\":{\"int\":[\"srcid\"]},\"function\":\"float x1 = 1.2; int x = 7.; x = 7.5e12; x = 7.5e-12; x = 7.5e-12f; x = .34; x = .34e+12; x = 123f; return 0.25;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelDataTypes() throws Exception { System.out.println("testRelevanceModelDataTypes"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int intParam1, int intParam2, String strParam) " + " BEGIN " + " int myInt = 100; " + " String str1; " + " String str2 = \"abcd\"; " + " char ch = 'c'; " + " Integer int1, int2; " + " int int3 = 0L, int4 = 1234l; " + " float f1 = 1.23f, f2 = 1.23F; " + " float e1 = 2e+1234; " + " Byte byte1; " + " IntOpenHashSet mySet1, mySet2; " + " Object2IntOpenHashMap myMap1; " + " return 0.123f; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"intParam1\",\"intParam2\",\"strParam\"],\"facets\":{},\"variables\":{\"int\":[\"intParam1\",\"intParam2\"],\"string\":[\"strParam\"]},\"function\":\"int myInt = 100; String str1; String str2 = \\\"abcd\\\"; char ch = 'c'; Integer int1, int2; int int3 = 0L, int4 = 1234l; float f1 = 1.23f, f2 = 1.23F; float e1 = 2e+1234; Byte byte1; IntOpenHashSet mySet1, mySet2; Object2IntOpenHashMap myMap1; return 0.123f;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelWhileStmt() throws Exception { System.out.println("testRelevanceModelWhileStmt"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int srcid) " + " BEGIN " + " int myInt = 100; " + " while (myInt < 200) { " + " myInt++; " + " myInt = myInt + 10; " + " } " + " return 100; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\"],\"facets\":{},\"variables\":{\"int\":[\"srcid\"]},\"function\":\"int myInt = 100; while (myInt < 200) { myInt++; myInt = myInt + 10; } return 100;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelDoWhile() throws Exception { System.out.println("testRelevanceModelDoWhile"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int srcid) " + " BEGIN " + " int myInt = 100; " + " do { " + " myInt = myInt + 10; " + " } while (myInt < 100); " + " return 100; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\"],\"facets\":{},\"variables\":{\"int\":[\"srcid\"]},\"function\":\"int myInt = 100; do { myInt = myInt + 10; } while (myInt < 100); return 100;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelForLoop() throws Exception { System.out.println("testRelevanceModelForLoop"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int srcid) " + " BEGIN " + " int myInt = 0; " + " for (int i = 0; i < 100; i++) { " + " myInt = myInt + i * 10; " + " } " + " return myInt; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\"],\"facets\":{},\"variables\":{\"int\":[\"srcid\"]},\"function\":\"int myInt = 0; for (int i = 0; i < 100; i++) { myInt = myInt + i * 10; } return myInt;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelSwitchStmt() throws Exception { System.out.println("testRelevanceModelSwitchStmt"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int srcid) " + " BEGIN " + " int myInt = 0; " + " switch (myInt) { " + " case 1: myInt = 2; " + " break; " + " case 2: " + " case 3: myInt = 4; " + " break; " + " default: " + " myInt = 100; " + " } " + " return 0.5f; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\"],\"facets\":{},\"variables\":{\"int\":[\"srcid\"]},\"function\":\"int myInt = 0; switch (myInt) { case 1: myInt = 2; break; case 2: case 3: myInt = 4; break; default: myInt = 100; } return 0.5f;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelParameters() throws Exception { System.out.println("testRelevanceModelParameters"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234) " + " DEFINED AS (int intParam1, int intParam2, String strParam, " + " DoubleOpenHashSet setParam, Int2IntOpenHashMap mapParam) " + " BEGIN " + " int myInt = 0; " + " float delta = System.currentTimeMillis() + intParam1 + intParam2 ; " + " float t = delta > 0 ? delta : 0; " + " float numHours = t / (1000 * 3600); " + " float timeScore = (float) Math.exp(numHours); " + " if (tags.contains(\"zzz\")) " + " return 999999; " + " int x = 0; " + " x += 5; " + " x *= 10; " + " return timeScore + _INNER_SCORE + price; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"intParam1\",\"intParam2\",\"strParam\",\"setParam\",\"mapParam\",\"tags\",\"price\",\"_INNER_SCORE\"],\"facets\":{\"mstring\":[\"tags\"],\"float\":[\"price\"]},\"variables\":{\"map_int_int\":[\"mapParam\"],\"int\":[\"intParam1\",\"intParam2\"],\"string\":[\"strParam\"],\"set_double\":[\"setParam\"]},\"function\":\"int myInt = 0; float delta = System.currentTimeMillis() + intParam1 + intParam2 ; float t = delta > 0 ? delta : 0; float numHours = t / (1000 * 3600); float timeScore = (float) Math.exp(numHours); if (tags.contains(\\\"zzz\\\")) return 999999; int x = 0; x += 5; x *= 10; return timeScore + _INNER_SCORE + price;\"},\"values\":{\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelExample1() throws Exception { System.out.println("testRelevanceModelExample1"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (thisYear:2001, goodYear:[1996]) " + " DEFINED AS (int thisYear, IntOpenHashSet goodYear) " + " BEGIN " + " if (goodYear.contains(year)) " + " return (float)Math.exp(10d); " + " if (year == thisYear) " + " return 87f; " + " return _INNER_SCORE; " + " END " + "ORDER BY relevance" ); JSONObject expected = new JSONObject("{\"sort\":\"relevance\",\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"thisYear\",\"goodYear\",\"year\",\"_INNER_SCORE\"],\"facets\":{\"int\":[\"year\"]},\"variables\":{\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"]},\"function\":\"if (goodYear.contains(year)) return (float)Math.exp(10d); if (year == thisYear) return 87f; return _INNER_SCORE;\"},\"values\":{\"thisYear\":2001,\"goodYear\":[1996]}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelExample2() throws Exception { System.out.println("testRelevanceModelExample2"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (thisYear:2001, goodYear:[1996]) " + " DEFINED AS (int thisYear, IntOpenHashSet goodYear) " + " BEGIN " + " if (goodYear.contains(year)) " + " return (float)Math.exp(10d); " + " if (year == thisYear) " + " return 87f; " + " else if (color.equals(\"blue\")) " + " return 99f; " + " return _INNER_SCORE; " + " END " + "ORDER BY relevance" ); JSONObject expected = new JSONObject("{\"sort\":\"relevance\",\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"thisYear\",\"goodYear\",\"color\",\"year\",\"_INNER_SCORE\"],\"facets\":{\"int\":[\"year\"],\"string\":[\"color\"]},\"variables\":{\"set_int\":[\"goodYear\"],\"int\":[\"thisYear\"]},\"function\":\"if (goodYear.contains(year)) return (float)Math.exp(10d); if (year == thisYear) return 87f; else if (color.equals(\\\"blue\\\")) return 99f; return _INNER_SCORE;\"},\"values\":{\"thisYear\":2001,\"goodYear\":[1996]}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelVariableScopes() throws Exception { System.out.println("testRelevanceModelVariableScopes"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (boost:2.5) " + " DEFINED AS (float boost) " + " BEGIN " + " int x, y; " + " for (int i = 0; i < 10; ++i) { " + " x = 10; " + " y = x + i; " + " } " + " return y * boost + price; " + " END " + "ORDER BY relevance" ); JSONObject expected = new JSONObject("{\"sort\":\"relevance\",\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"boost\",\"price\"],\"facets\":{\"float\":[\"price\"]},\"variables\":{\"float\":[\"boost\"]},\"function\":\"int x, y; for (int i = 0; i < 10; ++i) { x = 10; y = x + i; } return y * boost + price;\"},\"values\":{\"boost\":2.5}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"*\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelMapValue() throws Exception { System.out.println("testRelevanceModelMapValue"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (thisYear:2001, myMap:{'aaa':1, 'bbb':2}) " + "ORDER BY relevance" ); 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)); } @Test public void testRelevanceModelWithEmptyMapAndList() throws Exception { System.out.println("testRelevanceModelMapValue"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT * " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (thisYear:2001, list:[], map:{}) " + "ORDER BY relevance" ); assertNotNull(json); } @Test public void testRelevanceModelExpressions() throws Exception { System.out.println("testRelevanceModelExpressions"); System.out.println("=================================================="); JSONObject json = _compiler.compile( "SELECT color, year " + "FROM cars " + "WHERE color = 'red' " + "USING RELEVANCE MODEL my_model (srcid:1234, timeVal:9999, _half_time:8888, coolTag:'zzz') " + " DEFINED AS (int srcid, long timeVal, long _half_time, String coolTag) " + " BEGIN " + " int myInt = 0; " + " float delta = System.currentTimeMillis() - timeVal; " + " float t = delta > 0 ? delta : 0; " + " float numHours = t / (1000 * 3600); " + " float timeScore = (float) Math.exp(-(numHours/_half_time)); " + " if (tags.contains(coolTag)) " + " return 999999; " + " int x = 0; " + " x += 5; " + " x *= 10; " + " return timeScore; " + " END " ); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\",\"timeVal\",\"_half_time\",\"coolTag\",\"tags\"],\"facets\":{\"mstring\":[\"tags\"]},\"variables\":{\"int\":[\"srcid\"],\"string\":[\"coolTag\"],\"long\":[\"timeVal\",\"_half_time\"]},\"function\":\"int myInt = 0; float delta = System.currentTimeMillis() - timeVal; float t = delta > 0 ? delta : 0; float numHours = t / (1000 * 3600); float timeScore = (float) Math.exp(-(numHours/_half_time)); if (tags.contains(coolTag)) return 999999; int x = 0; x += 5; x *= 10; return timeScore;\"},\"values\":{\"_half_time\":8888,\"timeVal\":9999,\"coolTag\":\"zzz\",\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } @Test public void testRelevanceModelExpressionsWithtemplateMappings() throws Exception { System.out.println("testRelevanceModelExpressions"); System.out.println("=================================================="); String bqlStmt = "SELECT color, year " + "FROM cars " + "WHERE color = $color " + "USING RELEVANCE MODEL my_model ($params) " + " DEFINED AS (int srcid, long timeVal, long _half_time, String coolTag) " + " BEGIN " + " int myInt = 0; " + " float delta = System.currentTimeMillis() - timeVal; " + " float t = delta > 0 ? delta : 0; " + " float numHours = t / (1000 * 3600); " + " float timeScore = (float) Math.exp(-(numHours/_half_time)); " + " if (tags.contains(coolTag)) " + " return 999999; " + " int x = 0; " + " x += 5; " + " x *= $ten; " + " return timeScore; " + " END "; String templateMappings = "{\"templateMapping\": { \"color\": \"'red'\", \"ten\": 10, \"params\":\"srcid:1234, timeVal:9999, _half_time:8888, coolTag:'zzz'\" }}"; JsonTemplateProcessor jsonTemplateProcessor = new JsonTemplateProcessor(); String modifiedJson = (String) jsonTemplateProcessor.process(bqlStmt, jsonTemplateProcessor.getTemplates(new JSONObject(templateMappings))); JSONObject json = _compiler.compile(modifiedJson); JSONObject expected = new JSONObject("{\"query\":{\"query_string\":{\"query\":\"\",\"relevance\":{\"model\":{\"function_params\":[\"srcid\",\"timeVal\",\"_half_time\",\"coolTag\",\"tags\"],\"facets\":{\"mstring\":[\"tags\"]},\"variables\":{\"int\":[\"srcid\"],\"string\":[\"coolTag\"],\"long\":[\"timeVal\",\"_half_time\"]},\"function\":\"int myInt = 0; float delta = System.currentTimeMillis() - timeVal; float t = delta > 0 ? delta : 0; float numHours = t / (1000 * 3600); float timeScore = (float) Math.exp(-(numHours/_half_time)); if (tags.contains(coolTag)) return 999999; int x = 0; x += 5; x *= 10; return timeScore;\"},\"values\":{\"_half_time\":8888,\"timeVal\":9999,\"coolTag\":\"zzz\",\"srcid\":1234}}}},\"selections\":[{\"term\":{\"color\":{\"value\":\"red\"}}}],\"meta\":{\"select_list\":[\"color\",\"year\"]}}"); assertTrue(_comp.isEquals(json, expected)); } }