/** * 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 java.text.ParseException; import java.text.SimpleDateFormat; public class TestErrorHandling extends TestCase { private BQLCompiler _compiler; private JsonComparator _comp = new JsonComparator(1); public TestErrorHandling() { 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("time", new String[]{"custom", ""}); // Mimic a custom facet _compiler = new BQLCompiler(facetInfoMap); } @Test public void testBasicError1() throws Exception { System.out.println("testBasicError1"); System.out.println("=================================================="); boolean caughtException = false; try { // Incomplete where clause JSONObject json = _compiler.compile( "select category " + "from cars " + "where" ); } catch (RecognitionException err) { caughtException = true; assertTrue(_compiler.getErrorMessage(err).startsWith("[line:1, col:31] No viable alternative (token=<EOF>)")); } finally { assertTrue(caughtException); } } @Test public void testInconsistentRanges() throws Exception { System.out.println("testInconsistentRanges"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE color = 'red' \n" + " AND year > 2000 AND year < 1995 \n" + " OR price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:5, col:2] Inconsistent ranges detected for column: year (token=OR)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testInvalidInPred() throws Exception { System.out.println("testInvalidInPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE year in (1995, 2000) \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Range facet \"year\" cannot be used in IN predicates. (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testInvalidInPredValues() throws Exception { System.out.println("testInvalidInPredValues"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE color in ('red', 2000, 'blue') \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Value list for IN predicate of facet \"color\" contains incompatible value(s). (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testInvalidInPredExceptValues() throws Exception { System.out.println("testInvalidInPredExceptValues"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE color IN ('red', 'blue') EXCEPT ('black', 2000) \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] EXCEPT value list for IN predicate of facet \"color\" contains incompatible value(s). (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testInvalidContainsAllPred() throws Exception { System.out.println("testInvalidContainsAllPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE year contains all (1995, 2000) \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Range facet column \"year\" cannot be used in CONTAINS ALL predicates. (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testInvalidContainsAllPredValues() throws Exception { System.out.println("testInvalidContainsAllPredValues"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE tags CONTAINS ALL ('cool', 175.50, 'hybrid') \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Value list for CONTAINS ALL predicate of facet \"tags\" contains incompatible value(s). (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testInvalidContainsAllPredExceptValues() throws Exception { System.out.println("testInvalidContainsAllPredExceptValues"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE tags contains all ('cool', 'hybrid') EXCEPT ('moon-roof', 2000) \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] EXCEPT value list for CONTAINS ALL predicate of facet \"tags\" contains incompatible value(s). (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadDataInEqualPred() throws Exception { System.out.println("testBadDataInEqualPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE color = 1234 \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Incompatible data type was found in an EQUAL predicate for column \"color\". (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testExpectingCOLON() throws Exception { System.out.println("testExpectingCOLON"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE city = 'u.s.a./new york' WITH('strict', true) \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:3, col:44] Expecting COLON (token=,)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testUnsupportedProp() throws Exception { System.out.println("testUnsupportedProp"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE city = 'u.s.a./new york' WITH('ddd':123, 'strict':true) \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Unsupported property was found in an EQUAL predicate for path facet column \"city\": ddd. (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadDataInNotEqualPred() throws Exception { System.out.println("testBadDataInNotEqualPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE color <> 1234 \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Incompatible data type was found in a NOT EQUAL predicate for column \"color\". (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testNotEqualOnPath() throws Exception { System.out.println("testNotEqualOnPath"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE city <> 'u.s.a./new york' \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] NOT EQUAL predicate is not supported for path facets (column \"city\"). (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadBetweenPred() throws Exception { System.out.println("testBadBetweenPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE city BETWEEN 'blue' AND 'red' \n" + " AND price < 1750.00" ); //System.out.println(">>> json: " + json); } catch (RecognitionException err) { caughtException = true; //System.out.println(">>> _compiler.getErrorMessage(err): " + _compiler.getErrorMessage(err)); assertEquals("[line:4, col:2] Non-rangable facet column \"city\" cannot be used in BETWEEN predicates. (token=AND)", _compiler.getErrorMessage(err)); //System.out.println(">>> caughtException: " + caughtException); } finally { //System.out.println(">>> caughtException: " + caughtException); assertTrue(caughtException); } } @Test public void testBadDataInBetweenPred() throws Exception { System.out.println("testBadDataInBetweenPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE year BETWEEN 'blue' AND 2000 \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Incompatible data type was found in a BETWEEN predicate for column \"year\". (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadRangePred() throws Exception { System.out.println("testBadRangePred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE city > 'red' \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Non-rangable facet column \"city\" cannot be used in RANGE predicates. (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadDataInRangePred() throws Exception { System.out.println("testBadDataInRangePred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE year > 'red' \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Incompatible data type was found in a RANGE predicate for column \"year\". (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadDatetime1() throws Exception { System.out.println("testBadDatetime1"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE time > 2011-16-20 55:10:10 \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Date string contains invalid date/time: \"2011-16-20 55:10:10\". (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadDatetime2() throws Exception { System.out.println("testBadDatetime2"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT category \n" + "FROM cars \n" + "WHERE time > 2011-10/20 \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] ParseException happened for \"2011-10/20\": Unparseable date: \"2011-10/20\". (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadMatchPred() throws Exception { System.out.println("testBadMatchPred"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT color \n" + "FROM cars \n" + "WHERE MATCH(color, year) AGAINST('text1 AND text2') \n" + " AND price < 1750.00" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:2] Non-string type column \"year\" cannot be used in MATCH AGAINST predicates. (token=AND)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testEOF() throws Exception { System.out.println("testEOF"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select color, year from where year > 1" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:1, col:24] Mismatched input (token=where)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadSelectList() throws Exception { System.out.println("testBadSelectList"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select color, from aa where color = 'red'" ); } catch (RecognitionException err) { caughtException = true; assertTrue(_compiler.getErrorMessage(err).startsWith("[line:1, col:14] No viable alternative (token=from)")); } finally { assertTrue(caughtException); } } @Test public void testOrderByOnce() throws Exception { System.out.println("testOrderByOnce"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category \n" + "from cars \n" + "order by color \n" + "order by year \n" + "limit 10" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:5, col:0] ORDER BY clause can only appear once. (token=limit)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testLimitOnce() throws Exception { System.out.println("testLimitOnce"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category \n" + "from cars \n" + "limit 10, 20 \n" + "limit 10 \n" + "order by color \n" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:5, col:0] LIMIT clause can only appear once. (token=order)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadGroupBy() throws Exception { System.out.println("testBadGroupBy"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category, tags \n" + "from cars \n" + "group by tags \n" + "order by color \n" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:0] Range/multi/path facet, \"tags\", cannot be used in the GROUP BY clause. (token=order)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testBadGroupBy2() throws Exception { System.out.println("testBadGroupBy2"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category, tags \n" + "from cars \n" + "group by color OR year \n" + "order by color \n" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:0] Range/multi/path facet, \"year\", cannot be used in the GROUP BY clause. (token=order)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } // @Test // public void testConflictSelections() throws Exception // { // System.out.println("testConflictSelections"); // System.out.println("=================================================="); // boolean caughtException = false; // try // { // JSONObject json = _compiler.compile( // "SELECT color FROM cars WHERE color = 'red' AND color = 'blue'" // ); // } // catch (RecognitionException err) // { // caughtException = true; // assertEquals("[line:1, col:14] Expecting IDENT (token=from)", // _compiler.getErrorMessage(err)); // } // finally // { // assertTrue(caughtException); // } // } @Test public void testBadTimePredicate() throws Exception { System.out.println("testBadTimePredicate"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category \n" + "from cars \n" + "where city IN LAST 2 days" ); } catch (RecognitionException err) { caughtException = true; //System.out.println(">>> _compiler.getErrorMessage(err): " + _compiler.getErrorMessage(err)); assertEquals("[line:3, col:25] Non-rangable facet column \"city\" cannot be used in TIME predicates. (token=<EOF>)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testOverflowInteger() throws Exception { System.out.println("testOverflowInteger"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category \n" + "from cars \n" + "where year = 12345678901234567890" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:3, col:33] Hit NumberFormatException: For input string: \"12345678901234567890\" (token=<EOF>)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRouteByOnce() throws Exception { System.out.println("testRouteByOnce"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category \n" + "from cars \n" + "route by '1234' \n" + "route by '9999'" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:15] ROUTE BY clause can only appear once. (token=<EOF>)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testSrcdataFetchStoredError1() throws Exception { System.out.println("testSrcdataFetchStoredError1"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select _srcdata.category \n" + "from cars \n" + "fetching stored false" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:3, col:21] FETCHING STORED cannot be false when _srcdata is selected. (token=<EOF>)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testSrcdataFetchStoredError2() throws Exception { System.out.println("testSrcdataFetchStoredError2"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select _srcdata, color \n" + "from cars \n" + "fetching stored false" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:3, col:21] FETCHING STORED cannot be false when _srcdata is selected. (token=<EOF>)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testUsingRelevanceOnce() throws Exception { System.out.println("testUsingRelevanceOnce"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "select category \n" + "from cars \n" + "using relevance model md1 (srcid:1234) \n" + "using relevance model md2 (param1:'abc')" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:4, col:40] USING RELEVANCE MODEL clause can only appear once. (token=<EOF>)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceVarRedefined() throws Exception { System.out.println("testRelevanceVarRedefined"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " int x, y; \n" + " short x = 5; \n" + " return 0.5; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:7, col:15] Variable \"x\" is already defined. (token=;)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceUndefinedVar1() throws Exception { System.out.println("testRelevanceUndefinedVar1"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " if (x == 5) \n" + " return 0.1; \n" + " return 0.5; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:6, col:10] Variable or class \"x\" is not defined. (token===)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceUndefinedVar2() throws Exception { System.out.println("testRelevanceUndefinedVar2"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " int x = 5; \n" + " if (price > 2000.0) \n" + " return 0.1; \n" + " else { \n" + " x = 10; \n" + " y = x + 123; \n" + " } \n" + " return 0.5; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; // System.out.println(">>> err = " + _compiler.getErrorMessage(err)); assertEquals("[line:11, col:8] Variable or class \"y\" is not defined. (token==)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceUndefinedVar3() throws Exception { System.out.println("testRelevanceUndefinedVar3"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " int total = 0; \n" + " for (int i = 0; i < 10; ++i) { \n" + " total += i; \n" + " } \n" + " i = 100; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:10, col:6] Variable or class \"i\" is not defined. (token==)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceVarDeclError1() throws Exception { System.out.println("testRelevanceVarDeclError1"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " int year; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:6, col:12] Facet name \"year\" cannot be used to declare a variable. (token=;)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceVarDeclError2() throws Exception { System.out.println("testRelevanceVarDeclError2"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " String _NOW; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:6, col:15] Internal variable \"_NOW\" cannot be re-used to declare another variable. (token=;)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceVarDeclError3() throws Exception { System.out.println("testRelevanceVarDeclError3"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid) \n" + " BEGIN \n" + " int x = 100; \n" + " for (int i = 1; i < 10; ++i) { \n" + " int x; \n" + " } \n" + " END" ); } catch (RecognitionException err) { caughtException = true; assertEquals("[line:8, col:11] Variable \"x\" is already defined. (token=;)", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceModelParamError1() throws Exception { System.out.println("testRelevanceModelParamError1"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid, float price) \n" + " BEGIN \n" + " return 0.5; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; // System.out.println(">>> err = " + _compiler.getErrorMessage(err)); assertEquals("[line:4, col:36] Facet name \"price\" cannot be used as a relevance model parameter. (token=))", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceModelParamError2() throws Exception { System.out.println("testRelevanceModelParamError2"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid, String srcid) \n" + " BEGIN \n" + " return 0.5; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; // System.out.println(">>> err = " + _compiler.getErrorMessage(err)); assertEquals("[line:4, col:37] Parameter name \"srcid\" has already been used. (token=))", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } @Test public void testRelevanceModelParamError3() throws Exception { System.out.println("testRelevanceModelParamError3"); System.out.println("=================================================="); boolean caughtException = false; try { JSONObject json = _compiler.compile( "SELECT * \n" + "FROM cars \n" + "USING RELEVANCE MODEL md1 (srcid:1234) \n" + " DEFINED AS (int srcid, long _NOW) \n" + " BEGIN \n" + " return 0.5; \n" + " END" ); } catch (RecognitionException err) { caughtException = true; // System.out.println(">>> err = " + _compiler.getErrorMessage(err)); assertEquals("[line:4, col:34] Internal variable \"_NOW\" cannot be used as a relevance model parameter. (token=))", _compiler.getErrorMessage(err)); } finally { assertTrue(caughtException); } } }