[Groonga-commit] groonga/groonga at 787ba81 [master] Support customizing max interval in script syntax

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Jan 12 11:34:18 JST 2017


Kouhei Sutou	2017-01-12 11:34:18 +0900 (Thu, 12 Jan 2017)

  New Revision: 787ba81040098aec32aa02c07b52b2bb5449d2c6
  https://github.com/groonga/groonga/commit/787ba81040098aec32aa02c07b52b2bb5449d2c6

  Message:
    Support customizing max interval in script syntax
    
    Syntax:
    
        column *N${MAX_INTERVAL} "..."
    
    Examples:
    
        column *N15 "..."
        column *N-1 "..."

  Added files:
    test/command/suite/select/filter/near/max_interval/custom.expected
    test/command/suite/select/filter/near/max_interval/custom.test
    test/command/suite/select/filter/near/max_interval/ordered.expected
    test/command/suite/select/filter/near/max_interval/ordered.test
  Modified files:
    lib/expr.c
    lib/grn_ecmascript.c
    lib/grn_ecmascript.lemon

  Modified: lib/expr.c (+14 -2)
===================================================================
--- lib/expr.c    2017-01-12 11:32:58 +0900 (aadde66)
+++ lib/expr.c    2017-01-12 11:34:18 +0900 (1839bc0)
@@ -7806,8 +7806,20 @@ parse_script(grn_ctx *ctx, efs_info *q)
     case '*' :
       switch (q->cur[1]) {
       case 'N' :
-        PARSE(GRN_EXPR_TOKEN_NEAR);
-        q->cur += 2;
+        {
+          const char *next_start = q->cur + 2;
+          const char *end;
+          int max_interval;
+          max_interval = grn_atoi(next_start, q->str_end, &end);
+          if (end == next_start) {
+            max_interval = DEFAULT_MAX_INTERVAL;
+          } else {
+            next_start = end;
+          }
+          GRN_INT32_PUT(ctx, &q->max_interval_stack, max_interval);
+          PARSE(GRN_EXPR_TOKEN_NEAR);
+          q->cur = next_start;
+        }
         break;
       case 'S' :
         PARSE(GRN_EXPR_TOKEN_SIMILAR);

  Modified: lib/grn_ecmascript.c (+131 -124)
===================================================================
--- lib/grn_ecmascript.c    2017-01-12 11:32:58 +0900 (4337b86)
+++ lib/grn_ecmascript.c    2017-01-12 11:34:18 +0900 (79edf77)
@@ -1145,7 +1145,6 @@ static int yy_find_reduce_action(
 */
 static void yyStackOverflow(yyParser *yypParser){
    grn_expr_parserARG_FETCH;
-   yypParser->yytos--;
 #ifndef NDEBUG
    if( yyTraceFILE ){
      fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
@@ -1198,12 +1197,14 @@ static void yy_shift(
 #endif
 #if YYSTACKDEPTH>0 
   if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){
+    yypParser->yytos--;
     yyStackOverflow(yypParser);
     return;
   }
 #else
   if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){
     if( yyGrowStack(yypParser) ){
+      yypParser->yytos--;
       yyStackOverflow(yypParser);
       return;
     }
@@ -1428,7 +1429,7 @@ static void yy_reduce(
 {
   grn_expr_append_op(efsi->ctx, efsi->e, grn_int32_value_at(&efsi->op_stack, -1), 2);
 }
-#line 1432 "grn_ecmascript.c"
+#line 1433 "grn_ecmascript.c"
         break;
       case 1: /* query ::= query LOGICAL_AND query_element */
       case 23: /* logical_and_expression ::= logical_and_expression LOGICAL_AND bitwise_or_expression */ yytestcase(yyruleno==23);
@@ -1436,7 +1437,7 @@ static void yy_reduce(
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND, 2);
 }
-#line 1440 "grn_ecmascript.c"
+#line 1441 "grn_ecmascript.c"
         break;
       case 2: /* query ::= query LOGICAL_AND_NOT query_element */
       case 24: /* logical_and_expression ::= logical_and_expression LOGICAL_AND_NOT bitwise_or_expression */ yytestcase(yyruleno==24);
@@ -1444,7 +1445,7 @@ static void yy_reduce(
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND_NOT, 2);
 }
-#line 1448 "grn_ecmascript.c"
+#line 1449 "grn_ecmascript.c"
         break;
       case 3: /* query ::= query LOGICAL_OR query_element */
       case 22: /* logical_or_expression ::= logical_or_expression LOGICAL_OR logical_and_expression */ yytestcase(yyruleno==22);
@@ -1452,7 +1453,7 @@ static void yy_reduce(
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_OR, 2);
 }
-#line 1456 "grn_ecmascript.c"
+#line 1457 "grn_ecmascript.c"
         break;
       case 4: /* query_element ::= RELATIVE_OP query_element */
 #line 65 "grn_ecmascript.lemon"
@@ -1460,7 +1461,7 @@ static void yy_reduce(
   int mode;
   GRN_INT32_POP(&efsi->mode_stack, mode);
 }
-#line 1464 "grn_ecmascript.c"
+#line 1465 "grn_ecmascript.c"
         break;
       case 5: /* query_element ::= IDENTIFIER RELATIVE_OP query_element */
 #line 69 "grn_ecmascript.lemon"
@@ -1487,7 +1488,7 @@ static void yy_reduce(
     break;
   }
 }
-#line 1491 "grn_ecmascript.c"
+#line 1492 "grn_ecmascript.c"
         break;
       case 6: /* query_element ::= BRACEL expression BRACER */
       case 7: /* query_element ::= EVAL primary_expression */ yytestcase(yyruleno==7);
@@ -1495,98 +1496,98 @@ static void yy_reduce(
 {
   efsi->flags = efsi->default_flags;
 }
-#line 1499 "grn_ecmascript.c"
+#line 1500 "grn_ecmascript.c"
         break;
       case 8: /* expression ::= expression COMMA assignment_expression */
 #line 100 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_COMMA, 2);
 }
-#line 1506 "grn_ecmascript.c"
+#line 1507 "grn_ecmascript.c"
         break;
       case 9: /* assignment_expression ::= lefthand_side_expression ASSIGN assignment_expression */
 #line 105 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_ASSIGN, 2);
 }
-#line 1513 "grn_ecmascript.c"
+#line 1514 "grn_ecmascript.c"
         break;
       case 10: /* assignment_expression ::= lefthand_side_expression STAR_ASSIGN assignment_expression */
 #line 108 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_STAR_ASSIGN, 2);
 }
-#line 1520 "grn_ecmascript.c"
+#line 1521 "grn_ecmascript.c"
         break;
       case 11: /* assignment_expression ::= lefthand_side_expression SLASH_ASSIGN assignment_expression */
 #line 111 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SLASH_ASSIGN, 2);
 }
-#line 1527 "grn_ecmascript.c"
+#line 1528 "grn_ecmascript.c"
         break;
       case 12: /* assignment_expression ::= lefthand_side_expression MOD_ASSIGN assignment_expression */
 #line 114 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MOD_ASSIGN, 2);
 }
-#line 1534 "grn_ecmascript.c"
+#line 1535 "grn_ecmascript.c"
         break;
       case 13: /* assignment_expression ::= lefthand_side_expression PLUS_ASSIGN assignment_expression */
 #line 117 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS_ASSIGN, 2);
 }
-#line 1541 "grn_ecmascript.c"
+#line 1542 "grn_ecmascript.c"
         break;
       case 14: /* assignment_expression ::= lefthand_side_expression MINUS_ASSIGN assignment_expression */
 #line 120 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS_ASSIGN, 2);
 }
-#line 1548 "grn_ecmascript.c"
+#line 1549 "grn_ecmascript.c"
         break;
       case 15: /* assignment_expression ::= lefthand_side_expression SHIFTL_ASSIGN assignment_expression */
 #line 123 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTL_ASSIGN, 2);
 }
-#line 1555 "grn_ecmascript.c"
+#line 1556 "grn_ecmascript.c"
         break;
       case 16: /* assignment_expression ::= lefthand_side_expression SHIFTR_ASSIGN assignment_expression */
 #line 126 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTR_ASSIGN, 2);
 }
-#line 1562 "grn_ecmascript.c"
+#line 1563 "grn_ecmascript.c"
         break;
       case 17: /* assignment_expression ::= lefthand_side_expression SHIFTRR_ASSIGN assignment_expression */
 #line 129 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTRR_ASSIGN, 2);
 }
-#line 1569 "grn_ecmascript.c"
+#line 1570 "grn_ecmascript.c"
         break;
       case 18: /* assignment_expression ::= lefthand_side_expression AND_ASSIGN assignment_expression */
 #line 132 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND_ASSIGN, 2);
 }
-#line 1576 "grn_ecmascript.c"
+#line 1577 "grn_ecmascript.c"
         break;
       case 19: /* assignment_expression ::= lefthand_side_expression XOR_ASSIGN assignment_expression */
 #line 135 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_XOR_ASSIGN, 2);
 }
-#line 1583 "grn_ecmascript.c"
+#line 1584 "grn_ecmascript.c"
         break;
       case 20: /* assignment_expression ::= lefthand_side_expression OR_ASSIGN assignment_expression */
 #line 138 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_OR_ASSIGN, 2);
 }
-#line 1590 "grn_ecmascript.c"
+#line 1591 "grn_ecmascript.c"
         break;
       case 21: /* conditional_expression ::= logical_or_expression QUESTION assignment_expression COLON assignment_expression */
 #line 143 "grn_ecmascript.lemon"
@@ -1595,77 +1596,77 @@ static void yy_reduce(
   e->codes[yymsp[-3].minor.yy0].nargs = yymsp[-1].minor.yy0 - yymsp[-3].minor.yy0;
   e->codes[yymsp[-1].minor.yy0].nargs = e->codes_curr - yymsp[-1].minor.yy0 - 1;
 }
-#line 1599 "grn_ecmascript.c"
+#line 1600 "grn_ecmascript.c"
         break;
       case 25: /* bitwise_or_expression ::= bitwise_or_expression BITWISE_OR bitwise_xor_expression */
 #line 163 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_OR, 2);
 }
-#line 1606 "grn_ecmascript.c"
+#line 1607 "grn_ecmascript.c"
         break;
       case 26: /* bitwise_xor_expression ::= bitwise_xor_expression BITWISE_XOR bitwise_and_expression */
 #line 168 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_XOR, 2);
 }
-#line 1613 "grn_ecmascript.c"
+#line 1614 "grn_ecmascript.c"
         break;
       case 27: /* bitwise_and_expression ::= bitwise_and_expression BITWISE_AND equality_expression */
 #line 173 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_AND, 2);
 }
-#line 1620 "grn_ecmascript.c"
+#line 1621 "grn_ecmascript.c"
         break;
       case 28: /* equality_expression ::= equality_expression EQUAL relational_expression */
 #line 178 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_EQUAL, 2);
 }
-#line 1627 "grn_ecmascript.c"
+#line 1628 "grn_ecmascript.c"
         break;
       case 29: /* equality_expression ::= equality_expression NOT_EQUAL relational_expression */
 #line 181 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NOT_EQUAL, 2);
 }
-#line 1634 "grn_ecmascript.c"
+#line 1635 "grn_ecmascript.c"
         break;
       case 30: /* relational_expression ::= relational_expression LESS shift_expression */
 #line 186 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LESS, 2);
 }
-#line 1641 "grn_ecmascript.c"
+#line 1642 "grn_ecmascript.c"
         break;
       case 31: /* relational_expression ::= relational_expression GREATER shift_expression */
 #line 189 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GREATER, 2);
 }
-#line 1648 "grn_ecmascript.c"
+#line 1649 "grn_ecmascript.c"
         break;
       case 32: /* relational_expression ::= relational_expression LESS_EQUAL shift_expression */
 #line 192 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LESS_EQUAL, 2);
 }
-#line 1655 "grn_ecmascript.c"
+#line 1656 "grn_ecmascript.c"
         break;
       case 33: /* relational_expression ::= relational_expression GREATER_EQUAL shift_expression */
 #line 195 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GREATER_EQUAL, 2);
 }
-#line 1662 "grn_ecmascript.c"
+#line 1663 "grn_ecmascript.c"
         break;
       case 34: /* relational_expression ::= relational_expression IN shift_expression */
 #line 198 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_IN, 2);
 }
-#line 1669 "grn_ecmascript.c"
+#line 1670 "grn_ecmascript.c"
         break;
       case 35: /* relational_expression ::= relational_expression MATCH shift_expression */
       case 83: /* adjust_match_expression ::= IDENTIFIER MATCH STRING */ yytestcase(yyruleno==83);
@@ -1673,131 +1674,137 @@ static void yy_reduce(
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MATCH, 2);
 }
-#line 1677 "grn_ecmascript.c"
+#line 1678 "grn_ecmascript.c"
         break;
       case 36: /* relational_expression ::= relational_expression NEAR shift_expression */
 #line 204 "grn_ecmascript.lemon"
 {
-  grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR, 2);
+  {
+    int max_interval;
+    GRN_INT32_POP(&efsi->max_interval_stack, max_interval);
+    grn_expr_append_const_int(efsi->ctx, efsi->e, max_interval,
+                              GRN_OP_PUSH, 1);
+  }
+  grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR, 3);
 }
-#line 1684 "grn_ecmascript.c"
+#line 1691 "grn_ecmascript.c"
         break;
       case 37: /* relational_expression ::= relational_expression NEAR2 shift_expression */
-#line 207 "grn_ecmascript.lemon"
+#line 213 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR2, 2);
 }
-#line 1691 "grn_ecmascript.c"
+#line 1698 "grn_ecmascript.c"
         break;
       case 38: /* relational_expression ::= relational_expression SIMILAR shift_expression */
-#line 210 "grn_ecmascript.lemon"
+#line 216 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SIMILAR, 2);
 }
-#line 1698 "grn_ecmascript.c"
+#line 1705 "grn_ecmascript.c"
         break;
       case 39: /* relational_expression ::= relational_expression TERM_EXTRACT shift_expression */
-#line 213 "grn_ecmascript.lemon"
+#line 219 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_TERM_EXTRACT, 2);
 }
-#line 1705 "grn_ecmascript.c"
+#line 1712 "grn_ecmascript.c"
         break;
       case 40: /* relational_expression ::= relational_expression LCP shift_expression */
-#line 216 "grn_ecmascript.lemon"
+#line 222 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LCP, 2);
 }
-#line 1712 "grn_ecmascript.c"
+#line 1719 "grn_ecmascript.c"
         break;
       case 41: /* relational_expression ::= relational_expression PREFIX shift_expression */
-#line 219 "grn_ecmascript.lemon"
+#line 225 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PREFIX, 2);
 }
-#line 1719 "grn_ecmascript.c"
+#line 1726 "grn_ecmascript.c"
         break;
       case 42: /* relational_expression ::= relational_expression SUFFIX shift_expression */
-#line 222 "grn_ecmascript.lemon"
+#line 228 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SUFFIX, 2);
 }
-#line 1726 "grn_ecmascript.c"
+#line 1733 "grn_ecmascript.c"
         break;
       case 43: /* relational_expression ::= relational_expression REGEXP shift_expression */
-#line 225 "grn_ecmascript.lemon"
+#line 231 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_REGEXP, 2);
 }
-#line 1733 "grn_ecmascript.c"
+#line 1740 "grn_ecmascript.c"
         break;
       case 44: /* shift_expression ::= shift_expression SHIFTL additive_expression */
-#line 230 "grn_ecmascript.lemon"
+#line 236 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTL, 2);
 }
-#line 1740 "grn_ecmascript.c"
+#line 1747 "grn_ecmascript.c"
         break;
       case 45: /* shift_expression ::= shift_expression SHIFTR additive_expression */
-#line 233 "grn_ecmascript.lemon"
+#line 239 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTR, 2);
 }
-#line 1747 "grn_ecmascript.c"
+#line 1754 "grn_ecmascript.c"
         break;
       case 46: /* shift_expression ::= shift_expression SHIFTRR additive_expression */
-#line 236 "grn_ecmascript.lemon"
+#line 242 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTRR, 2);
 }
-#line 1754 "grn_ecmascript.c"
+#line 1761 "grn_ecmascript.c"
         break;
       case 47: /* additive_expression ::= additive_expression PLUS multiplicative_expression */
       case 81: /* adjuster ::= adjuster PLUS adjust_expression */ yytestcase(yyruleno==81);
-#line 241 "grn_ecmascript.lemon"
+#line 247 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS, 2);
 }
-#line 1762 "grn_ecmascript.c"
+#line 1769 "grn_ecmascript.c"
         break;
       case 48: /* additive_expression ::= additive_expression MINUS multiplicative_expression */
-#line 244 "grn_ecmascript.lemon"
+#line 250 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS, 2);
 }
-#line 1769 "grn_ecmascript.c"
+#line 1776 "grn_ecmascript.c"
         break;
       case 49: /* multiplicative_expression ::= multiplicative_expression STAR unary_expression */
       case 82: /* adjust_expression ::= adjust_match_expression STAR DECIMAL */ yytestcase(yyruleno==82);
-#line 249 "grn_ecmascript.lemon"
+#line 255 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_STAR, 2);
 }
-#line 1777 "grn_ecmascript.c"
+#line 1784 "grn_ecmascript.c"
         break;
       case 50: /* multiplicative_expression ::= multiplicative_expression SLASH unary_expression */
-#line 252 "grn_ecmascript.lemon"
+#line 258 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SLASH, 2);
 }
-#line 1784 "grn_ecmascript.c"
+#line 1791 "grn_ecmascript.c"
         break;
       case 51: /* multiplicative_expression ::= multiplicative_expression MOD unary_expression */
-#line 255 "grn_ecmascript.lemon"
+#line 261 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MOD, 2);
 }
-#line 1791 "grn_ecmascript.c"
+#line 1798 "grn_ecmascript.c"
         break;
       case 52: /* unary_expression ::= DELETE unary_expression */
-#line 260 "grn_ecmascript.lemon"
+#line 266 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DELETE, 1);
 }
-#line 1798 "grn_ecmascript.c"
+#line 1805 "grn_ecmascript.c"
         break;
       case 53: /* unary_expression ::= INCR unary_expression */
-#line 263 "grn_ecmascript.lemon"
+#line 269 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1815,10 +1822,10 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_INCR, 1);
   }
 }
-#line 1819 "grn_ecmascript.c"
+#line 1826 "grn_ecmascript.c"
         break;
       case 54: /* unary_expression ::= DECR unary_expression */
-#line 280 "grn_ecmascript.lemon"
+#line 286 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1836,66 +1843,66 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DECR, 1);
   }
 }
-#line 1840 "grn_ecmascript.c"
+#line 1847 "grn_ecmascript.c"
         break;
       case 55: /* unary_expression ::= PLUS unary_expression */
-#line 297 "grn_ecmascript.lemon"
+#line 303 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS, 1);
 }
-#line 1847 "grn_ecmascript.c"
+#line 1854 "grn_ecmascript.c"
         break;
       case 56: /* unary_expression ::= MINUS unary_expression */
-#line 300 "grn_ecmascript.lemon"
+#line 306 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS, 1);
 }
-#line 1854 "grn_ecmascript.c"
+#line 1861 "grn_ecmascript.c"
         break;
       case 57: /* unary_expression ::= NOT unary_expression */
-#line 303 "grn_ecmascript.lemon"
+#line 309 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NOT, 1);
 }
-#line 1861 "grn_ecmascript.c"
+#line 1868 "grn_ecmascript.c"
         break;
       case 58: /* unary_expression ::= BITWISE_NOT unary_expression */
-#line 306 "grn_ecmascript.lemon"
+#line 312 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_NOT, 1);
 }
-#line 1868 "grn_ecmascript.c"
+#line 1875 "grn_ecmascript.c"
         break;
       case 59: /* unary_expression ::= ADJUST unary_expression */
-#line 309 "grn_ecmascript.lemon"
+#line 315 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_ADJUST, 1);
 }
-#line 1875 "grn_ecmascript.c"
+#line 1882 "grn_ecmascript.c"
         break;
       case 60: /* unary_expression ::= EXACT unary_expression */
-#line 312 "grn_ecmascript.lemon"
+#line 318 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_EXACT, 1);
 }
-#line 1882 "grn_ecmascript.c"
+#line 1889 "grn_ecmascript.c"
         break;
       case 61: /* unary_expression ::= PARTIAL unary_expression */
-#line 315 "grn_ecmascript.lemon"
+#line 321 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PARTIAL, 1);
 }
-#line 1889 "grn_ecmascript.c"
+#line 1896 "grn_ecmascript.c"
         break;
       case 62: /* unary_expression ::= UNSPLIT unary_expression */
-#line 318 "grn_ecmascript.lemon"
+#line 324 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_UNSPLIT, 1);
 }
-#line 1896 "grn_ecmascript.c"
+#line 1903 "grn_ecmascript.c"
         break;
       case 63: /* postfix_expression ::= lefthand_side_expression INCR */
-#line 323 "grn_ecmascript.lemon"
+#line 329 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1913,10 +1920,10 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_INCR_POST, 1);
   }
 }
-#line 1917 "grn_ecmascript.c"
+#line 1924 "grn_ecmascript.c"
         break;
       case 64: /* postfix_expression ::= lefthand_side_expression DECR */
-#line 340 "grn_ecmascript.lemon"
+#line 346 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1934,17 +1941,17 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DECR_POST, 1);
   }
 }
-#line 1938 "grn_ecmascript.c"
+#line 1945 "grn_ecmascript.c"
         break;
       case 65: /* call_expression ::= member_expression arguments */
-#line 361 "grn_ecmascript.lemon"
+#line 367 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_CALL, yymsp[0].minor.yy0);
 }
-#line 1945 "grn_ecmascript.c"
+#line 1952 "grn_ecmascript.c"
         break;
       case 66: /* object_literal ::= BRACEL property_name_and_value_list BRACER */
-#line 389 "grn_ecmascript.lemon"
+#line 395 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr_take_obj(ctx, efsi->e, (grn_obj *)(efsi->object_literal));
@@ -1952,10 +1959,10 @@ static void yy_reduce(
                       GRN_OP_PUSH, 1);
   efsi->object_literal = NULL;
 }
-#line 1956 "grn_ecmascript.c"
+#line 1963 "grn_ecmascript.c"
         break;
       case 67: /* property_name_and_value_list ::= */
-#line 397 "grn_ecmascript.lemon"
+#line 403 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
 
@@ -1968,10 +1975,10 @@ static void yy_reduce(
         (int)(efsi->str_end - efsi->str), efsi->str);
   }
 }
-#line 1972 "grn_ecmascript.c"
+#line 1979 "grn_ecmascript.c"
         break;
       case 68: /* property_name_and_value ::= property_name COLON assignment_expression */
-#line 412 "grn_ecmascript.lemon"
+#line 418 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -2013,61 +2020,61 @@ static void yy_reduce(
     }
   }
 }
-#line 2017 "grn_ecmascript.c"
+#line 2024 "grn_ecmascript.c"
         break;
       case 69: /* member_expression_part ::= BRACKETL expression BRACKETR */
-#line 456 "grn_ecmascript.lemon"
+#line 462 "grn_ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GET_MEMBER, 2);
 }
-#line 2024 "grn_ecmascript.c"
+#line 2031 "grn_ecmascript.c"
         break;
       case 70: /* arguments ::= PARENL argument_list PARENR */
-#line 461 "grn_ecmascript.lemon"
+#line 467 "grn_ecmascript.lemon"
 { yymsp[-2].minor.yy0 = yymsp[-1].minor.yy0; }
-#line 2029 "grn_ecmascript.c"
+#line 2036 "grn_ecmascript.c"
         break;
       case 71: /* argument_list ::= */
-#line 462 "grn_ecmascript.lemon"
+#line 468 "grn_ecmascript.lemon"
 { yymsp[1].minor.yy0 = 0; }
-#line 2034 "grn_ecmascript.c"
+#line 2041 "grn_ecmascript.c"
         break;
       case 72: /* argument_list ::= assignment_expression */
-#line 463 "grn_ecmascript.lemon"
+#line 469 "grn_ecmascript.lemon"
 { yymsp[0].minor.yy0 = 1; }
-#line 2039 "grn_ecmascript.c"
+#line 2046 "grn_ecmascript.c"
         break;
       case 73: /* argument_list ::= argument_list COMMA assignment_expression */
-#line 464 "grn_ecmascript.lemon"
+#line 470 "grn_ecmascript.lemon"
 { yylhsminor.yy0 = yymsp[-2].minor.yy0 + 1; }
-#line 2044 "grn_ecmascript.c"
+#line 2051 "grn_ecmascript.c"
   yymsp[-2].minor.yy0 = yylhsminor.yy0;
         break;
       case 74: /* output_columns ::= */
-#line 466 "grn_ecmascript.lemon"
+#line 472 "grn_ecmascript.lemon"
 {
   yymsp[1].minor.yy0 = 0;
 }
-#line 2052 "grn_ecmascript.c"
+#line 2059 "grn_ecmascript.c"
         break;
       case 75: /* output_columns ::= output_column */
-#line 469 "grn_ecmascript.lemon"
+#line 475 "grn_ecmascript.lemon"
 {
   yylhsminor.yy0 = yymsp[0].minor.yy0;
 }
-#line 2059 "grn_ecmascript.c"
+#line 2066 "grn_ecmascript.c"
   yymsp[0].minor.yy0 = yylhsminor.yy0;
         break;
       case 76: /* output_columns ::= output_columns COMMA */
-#line 474 "grn_ecmascript.lemon"
+#line 480 "grn_ecmascript.lemon"
 {
   yylhsminor.yy0 = yymsp[-1].minor.yy0;
 }
-#line 2067 "grn_ecmascript.c"
+#line 2074 "grn_ecmascript.c"
   yymsp[-1].minor.yy0 = yylhsminor.yy0;
         break;
       case 77: /* output_columns ::= output_columns COMMA output_column */
-#line 479 "grn_ecmascript.lemon"
+#line 485 "grn_ecmascript.lemon"
 {
   if (yymsp[-2].minor.yy0 == 0) {
     yylhsminor.yy0 = yymsp[0].minor.yy0;
@@ -2080,11 +2087,11 @@ static void yy_reduce(
     yylhsminor.yy0 = 1;
   }
 }
-#line 2084 "grn_ecmascript.c"
+#line 2091 "grn_ecmascript.c"
   yymsp[-2].minor.yy0 = yylhsminor.yy0;
         break;
       case 78: /* output_column ::= STAR */
-#line 492 "grn_ecmascript.lemon"
+#line 498 "grn_ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_obj *expr = efsi->e;
@@ -2135,21 +2142,21 @@ static void yy_reduce(
     yymsp[0].minor.yy0 = 0;
   }
 }
-#line 2139 "grn_ecmascript.c"
+#line 2146 "grn_ecmascript.c"
         break;
       case 79: /* output_column ::= NONEXISTENT_COLUMN */
-#line 542 "grn_ecmascript.lemon"
+#line 548 "grn_ecmascript.lemon"
 {
   yymsp[0].minor.yy0 = 0;
 }
-#line 2146 "grn_ecmascript.c"
+#line 2153 "grn_ecmascript.c"
         break;
       case 80: /* output_column ::= assignment_expression */
-#line 545 "grn_ecmascript.lemon"
+#line 551 "grn_ecmascript.lemon"
 {
   yymsp[0].minor.yy0 = 1;
 }
-#line 2153 "grn_ecmascript.c"
+#line 2160 "grn_ecmascript.c"
         break;
       default:
       /* (84) input ::= query */ yytestcase(yyruleno==84);
@@ -2280,7 +2287,7 @@ static void yy_syntax_error(
       GRN_OBJ_FIN(ctx, &message);
     }
   }
-#line 2284 "grn_ecmascript.c"
+#line 2291 "grn_ecmascript.c"
 /************ End %syntax_error code ******************************************/
   grn_expr_parserARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }

  Modified: lib/grn_ecmascript.lemon (+7 -1)
===================================================================
--- lib/grn_ecmascript.lemon    2017-01-12 11:32:58 +0900 (6136ea0)
+++ lib/grn_ecmascript.lemon    2017-01-12 11:34:18 +0900 (97ec9cd)
@@ -202,7 +202,13 @@ relational_expression ::= relational_expression MATCH shift_expression. {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MATCH, 2);
 }
 relational_expression ::= relational_expression NEAR shift_expression. {
-  grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR, 2);
+  {
+    int max_interval;
+    GRN_INT32_POP(&efsi->max_interval_stack, max_interval);
+    grn_expr_append_const_int(efsi->ctx, efsi->e, max_interval,
+                              GRN_OP_PUSH, 1);
+  }
+  grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR, 3);
 }
 relational_expression ::= relational_expression NEAR2 shift_expression. {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR2, 2);

  Added: test/command/suite/select/filter/near/max_interval/custom.expected (+42 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/near/max_interval/custom.expected    2017-01-12 11:34:18 +0900 (4d24997)
@@ -0,0 +1,42 @@
+table_create Memos TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Memos content COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+table_create Terms TABLE_PAT_KEY ShortText   --default_tokenizer TokenBigram   --normalizer NormalizerAuto
+[[0,0.0,0.0],true]
+column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
+[[0,0.0,0.0],true]
+load --table Memos
+[
+{"_key":"alphabets", "content": "a b c d e f g i j k l m n o p q r s t u v w x y z"}
+]
+[[0,0.0,0.0],1]
+select Memos   --filter 'content *N15 "a s" || content *N16 "a s"'   --output_columns '_score, content'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "_score",
+          "Int32"
+        ],
+        [
+          "content",
+          "ShortText"
+        ]
+      ],
+      [
+        1,
+        "a b c d e f g i j k l m n o p q r s t u v w x y z"
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/filter/near/max_interval/custom.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/near/max_interval/custom.test    2017-01-12 11:34:18 +0900 (9139686)
@@ -0,0 +1,16 @@
+table_create Memos TABLE_PAT_KEY ShortText
+column_create Memos content COLUMN_SCALAR ShortText
+
+table_create Terms TABLE_PAT_KEY ShortText \
+  --default_tokenizer TokenBigram \
+  --normalizer NormalizerAuto
+column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
+
+load --table Memos
+[
+{"_key":"alphabets", "content": "a b c d e f g i j k l m n o p q r s t u v w x y z"}
+]
+
+select Memos \
+  --filter 'content *N15 "a s" || content *N16 "a s"' \
+  --output_columns '_score, content'

  Added: test/command/suite/select/filter/near/max_interval/ordered.expected (+42 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/near/max_interval/ordered.expected    2017-01-12 11:34:18 +0900 (5c1aec2)
@@ -0,0 +1,42 @@
+table_create Memos TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Memos content COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+table_create Terms TABLE_PAT_KEY ShortText   --default_tokenizer TokenBigram   --normalizer NormalizerAuto
+[[0,0.0,0.0],true]
+column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
+[[0,0.0,0.0],true]
+load --table Memos
+[
+{"_key":"alphabets", "content": "a b c d e f g i j k l m n o p q r s t u v w x y z"}
+]
+[[0,0.0,0.0],1]
+select Memos   --filter 'content *N-1 "a z"'   --output_columns '_score, content'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "_score",
+          "Int32"
+        ],
+        [
+          "content",
+          "ShortText"
+        ]
+      ],
+      [
+        1,
+        "a b c d e f g i j k l m n o p q r s t u v w x y z"
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/filter/near/max_interval/ordered.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/near/max_interval/ordered.test    2017-01-12 11:34:18 +0900 (24fe7f2)
@@ -0,0 +1,16 @@
+table_create Memos TABLE_PAT_KEY ShortText
+column_create Memos content COLUMN_SCALAR ShortText
+
+table_create Terms TABLE_PAT_KEY ShortText \
+  --default_tokenizer TokenBigram \
+  --normalizer NormalizerAuto
+column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
+
+load --table Memos
+[
+{"_key":"alphabets", "content": "a b c d e f g i j k l m n o p q r s t u v w x y z"}
+]
+
+select Memos \
+  --filter 'content *N-1 "a z"' \
+  --output_columns '_score, content'
-------------- next part --------------
HTML����������������������������...
Descargar 



More information about the Groonga-commit mailing list
Back to archive index