[Groonga-commit] groonga/groonga at f1c1fb8 [master] Support near search with max interval by '*N?"A Z"' syntax

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Aug 14 22:11:41 JST 2014


Kouhei Sutou	2014-08-14 22:11:41 +0900 (Thu, 14 Aug 2014)

  New Revision: f1c1fb8e885582013e2572a60ac567ad086ae40f
  https://github.com/groonga/groonga/commit/f1c1fb8e885582013e2572a60ac567ad086ae40f

  Message:
    Support near search with max interval by '*N?"A Z"' syntax
    
    "?" in '*N?"A Z"' is replaced with number such as '*N5"A Z"'.

  Added files:
    test/command/suite/select/query/near_search/custom_max_interval/match.expected
    test/command/suite/select/query/near_search/custom_max_interval/match.test
    test/command/suite/select/query/near_search/custom_max_interval/not_match.expected
    test/command/suite/select/query/near_search/custom_max_interval/not_match.test
  Modified files:
    lib/ecmascript.c
    lib/ecmascript.lemon
    lib/expr.c

  Modified: lib/ecmascript.c (+145 -134)
===================================================================
--- lib/ecmascript.c    2014-08-14 22:07:16 +0900 (239080a)
+++ lib/ecmascript.c    2014-08-14 22:11:41 +0900 (fd74f95)
@@ -1340,311 +1340,322 @@ static void yy_reduce(
   grn_obj *c;
   GRN_PTR_POP(&efsi->column_stack, c);
   GRN_INT32_POP(&efsi->mode_stack, mode);
+  switch (mode) {
+  case GRN_OP_NEAR :
+  case GRN_OP_NEAR2 :
+    {
+      int max_interval;
+      GRN_INT32_POP(&efsi->max_interval_stack, max_interval);
+    }
+    break;
+  default :
+    break;
+  }
 }
-#line 1345 "ecmascript.c"
+#line 1356 "ecmascript.c"
         break;
       case 13: /* query_element ::= BRACEL expression BRACER */
       case 14: /* query_element ::= EVAL primary_expression */ yytestcase(yyruleno==14);
-#line 71 "ecmascript.lemon"
+#line 82 "ecmascript.lemon"
 {
   efsi->flags = efsi->default_flags;
 }
-#line 1353 "ecmascript.c"
+#line 1364 "ecmascript.c"
         break;
       case 16: /* expression ::= expression COMMA assignment_expression */
-#line 79 "ecmascript.lemon"
+#line 90 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_COMMA, 2);
 }
-#line 1360 "ecmascript.c"
+#line 1371 "ecmascript.c"
         break;
       case 18: /* assignment_expression ::= lefthand_side_expression ASSIGN assignment_expression */
-#line 84 "ecmascript.lemon"
+#line 95 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_ASSIGN, 2);
 }
-#line 1367 "ecmascript.c"
+#line 1378 "ecmascript.c"
         break;
       case 19: /* assignment_expression ::= lefthand_side_expression STAR_ASSIGN assignment_expression */
-#line 87 "ecmascript.lemon"
+#line 98 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_STAR_ASSIGN, 2);
 }
-#line 1374 "ecmascript.c"
+#line 1385 "ecmascript.c"
         break;
       case 20: /* assignment_expression ::= lefthand_side_expression SLASH_ASSIGN assignment_expression */
-#line 90 "ecmascript.lemon"
+#line 101 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SLASH_ASSIGN, 2);
 }
-#line 1381 "ecmascript.c"
+#line 1392 "ecmascript.c"
         break;
       case 21: /* assignment_expression ::= lefthand_side_expression MOD_ASSIGN assignment_expression */
-#line 93 "ecmascript.lemon"
+#line 104 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MOD_ASSIGN, 2);
 }
-#line 1388 "ecmascript.c"
+#line 1399 "ecmascript.c"
         break;
       case 22: /* assignment_expression ::= lefthand_side_expression PLUS_ASSIGN assignment_expression */
-#line 96 "ecmascript.lemon"
+#line 107 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS_ASSIGN, 2);
 }
-#line 1395 "ecmascript.c"
+#line 1406 "ecmascript.c"
         break;
       case 23: /* assignment_expression ::= lefthand_side_expression MINUS_ASSIGN assignment_expression */
-#line 99 "ecmascript.lemon"
+#line 110 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS_ASSIGN, 2);
 }
-#line 1402 "ecmascript.c"
+#line 1413 "ecmascript.c"
         break;
       case 24: /* assignment_expression ::= lefthand_side_expression SHIFTL_ASSIGN assignment_expression */
-#line 102 "ecmascript.lemon"
+#line 113 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTL_ASSIGN, 2);
 }
-#line 1409 "ecmascript.c"
+#line 1420 "ecmascript.c"
         break;
       case 25: /* assignment_expression ::= lefthand_side_expression SHIFTR_ASSIGN assignment_expression */
-#line 105 "ecmascript.lemon"
+#line 116 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTR_ASSIGN, 2);
 }
-#line 1416 "ecmascript.c"
+#line 1427 "ecmascript.c"
         break;
       case 26: /* assignment_expression ::= lefthand_side_expression SHIFTRR_ASSIGN assignment_expression */
-#line 108 "ecmascript.lemon"
+#line 119 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTRR_ASSIGN, 2);
 }
-#line 1423 "ecmascript.c"
+#line 1434 "ecmascript.c"
         break;
       case 27: /* assignment_expression ::= lefthand_side_expression AND_ASSIGN assignment_expression */
-#line 111 "ecmascript.lemon"
+#line 122 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND_ASSIGN, 2);
 }
-#line 1430 "ecmascript.c"
+#line 1441 "ecmascript.c"
         break;
       case 28: /* assignment_expression ::= lefthand_side_expression XOR_ASSIGN assignment_expression */
-#line 114 "ecmascript.lemon"
+#line 125 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_XOR_ASSIGN, 2);
 }
-#line 1437 "ecmascript.c"
+#line 1448 "ecmascript.c"
         break;
       case 29: /* assignment_expression ::= lefthand_side_expression OR_ASSIGN assignment_expression */
-#line 117 "ecmascript.lemon"
+#line 128 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_OR_ASSIGN, 2);
 }
-#line 1444 "ecmascript.c"
+#line 1455 "ecmascript.c"
         break;
       case 31: /* conditional_expression ::= logical_or_expression QUESTION assignment_expression COLON assignment_expression */
-#line 122 "ecmascript.lemon"
+#line 133 "ecmascript.lemon"
 {
   grn_expr *e = (grn_expr *)efsi->e;
   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 1453 "ecmascript.c"
+#line 1464 "ecmascript.c"
         break;
       case 38: /* bitwise_or_expression ::= bitwise_or_expression BITWISE_OR bitwise_xor_expression */
-#line 142 "ecmascript.lemon"
+#line 153 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_OR, 2);
 }
-#line 1460 "ecmascript.c"
+#line 1471 "ecmascript.c"
         break;
       case 40: /* bitwise_xor_expression ::= bitwise_xor_expression BITWISE_XOR bitwise_and_expression */
-#line 147 "ecmascript.lemon"
+#line 158 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_XOR, 2);
 }
-#line 1467 "ecmascript.c"
+#line 1478 "ecmascript.c"
         break;
       case 42: /* bitwise_and_expression ::= bitwise_and_expression BITWISE_AND equality_expression */
-#line 152 "ecmascript.lemon"
+#line 163 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_AND, 2);
 }
-#line 1474 "ecmascript.c"
+#line 1485 "ecmascript.c"
         break;
       case 44: /* equality_expression ::= equality_expression EQUAL relational_expression */
-#line 157 "ecmascript.lemon"
+#line 168 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_EQUAL, 2);
 }
-#line 1481 "ecmascript.c"
+#line 1492 "ecmascript.c"
         break;
       case 45: /* equality_expression ::= equality_expression NOT_EQUAL relational_expression */
-#line 160 "ecmascript.lemon"
+#line 171 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NOT_EQUAL, 2);
 }
-#line 1488 "ecmascript.c"
+#line 1499 "ecmascript.c"
         break;
       case 47: /* relational_expression ::= relational_expression LESS shift_expression */
-#line 165 "ecmascript.lemon"
+#line 176 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LESS, 2);
 }
-#line 1495 "ecmascript.c"
+#line 1506 "ecmascript.c"
         break;
       case 48: /* relational_expression ::= relational_expression GREATER shift_expression */
-#line 168 "ecmascript.lemon"
+#line 179 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GREATER, 2);
 }
-#line 1502 "ecmascript.c"
+#line 1513 "ecmascript.c"
         break;
       case 49: /* relational_expression ::= relational_expression LESS_EQUAL shift_expression */
-#line 171 "ecmascript.lemon"
+#line 182 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LESS_EQUAL, 2);
 }
-#line 1509 "ecmascript.c"
+#line 1520 "ecmascript.c"
         break;
       case 50: /* relational_expression ::= relational_expression GREATER_EQUAL shift_expression */
-#line 174 "ecmascript.lemon"
+#line 185 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GREATER_EQUAL, 2);
 }
-#line 1516 "ecmascript.c"
+#line 1527 "ecmascript.c"
         break;
       case 51: /* relational_expression ::= relational_expression IN shift_expression */
-#line 177 "ecmascript.lemon"
+#line 188 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_IN, 2);
 }
-#line 1523 "ecmascript.c"
+#line 1534 "ecmascript.c"
         break;
       case 52: /* relational_expression ::= relational_expression MATCH shift_expression */
       case 130: /* adjust_match_expression ::= IDENTIFIER MATCH STRING */ yytestcase(yyruleno==130);
-#line 180 "ecmascript.lemon"
+#line 191 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MATCH, 2);
 }
-#line 1531 "ecmascript.c"
+#line 1542 "ecmascript.c"
         break;
       case 53: /* relational_expression ::= relational_expression NEAR shift_expression */
-#line 183 "ecmascript.lemon"
+#line 194 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR, 2);
 }
-#line 1538 "ecmascript.c"
+#line 1549 "ecmascript.c"
         break;
       case 54: /* relational_expression ::= relational_expression NEAR2 shift_expression */
-#line 186 "ecmascript.lemon"
+#line 197 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR2, 2);
 }
-#line 1545 "ecmascript.c"
+#line 1556 "ecmascript.c"
         break;
       case 55: /* relational_expression ::= relational_expression SIMILAR shift_expression */
-#line 189 "ecmascript.lemon"
+#line 200 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SIMILAR, 2);
 }
-#line 1552 "ecmascript.c"
+#line 1563 "ecmascript.c"
         break;
       case 56: /* relational_expression ::= relational_expression TERM_EXTRACT shift_expression */
-#line 192 "ecmascript.lemon"
+#line 203 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_TERM_EXTRACT, 2);
 }
-#line 1559 "ecmascript.c"
+#line 1570 "ecmascript.c"
         break;
       case 57: /* relational_expression ::= relational_expression LCP shift_expression */
-#line 195 "ecmascript.lemon"
+#line 206 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LCP, 2);
 }
-#line 1566 "ecmascript.c"
+#line 1577 "ecmascript.c"
         break;
       case 58: /* relational_expression ::= relational_expression PREFIX shift_expression */
-#line 198 "ecmascript.lemon"
+#line 209 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PREFIX, 2);
 }
-#line 1573 "ecmascript.c"
+#line 1584 "ecmascript.c"
         break;
       case 59: /* relational_expression ::= relational_expression SUFFIX shift_expression */
-#line 201 "ecmascript.lemon"
+#line 212 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SUFFIX, 2);
 }
-#line 1580 "ecmascript.c"
+#line 1591 "ecmascript.c"
         break;
       case 61: /* shift_expression ::= shift_expression SHIFTL additive_expression */
-#line 206 "ecmascript.lemon"
+#line 217 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTL, 2);
 }
-#line 1587 "ecmascript.c"
+#line 1598 "ecmascript.c"
         break;
       case 62: /* shift_expression ::= shift_expression SHIFTR additive_expression */
-#line 209 "ecmascript.lemon"
+#line 220 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTR, 2);
 }
-#line 1594 "ecmascript.c"
+#line 1605 "ecmascript.c"
         break;
       case 63: /* shift_expression ::= shift_expression SHIFTRR additive_expression */
-#line 212 "ecmascript.lemon"
+#line 223 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTRR, 2);
 }
-#line 1601 "ecmascript.c"
+#line 1612 "ecmascript.c"
         break;
       case 65: /* additive_expression ::= additive_expression PLUS multiplicative_expression */
       case 127: /* adjuster ::= adjuster PLUS adjust_expression */ yytestcase(yyruleno==127);
-#line 217 "ecmascript.lemon"
+#line 228 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS, 2);
 }
-#line 1609 "ecmascript.c"
+#line 1620 "ecmascript.c"
         break;
       case 66: /* additive_expression ::= additive_expression MINUS multiplicative_expression */
-#line 220 "ecmascript.lemon"
+#line 231 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS, 2);
 }
-#line 1616 "ecmascript.c"
+#line 1627 "ecmascript.c"
         break;
       case 68: /* multiplicative_expression ::= multiplicative_expression STAR unary_expression */
       case 129: /* adjust_expression ::= adjust_match_expression STAR DECIMAL */ yytestcase(yyruleno==129);
-#line 225 "ecmascript.lemon"
+#line 236 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_STAR, 2);
 }
-#line 1624 "ecmascript.c"
+#line 1635 "ecmascript.c"
         break;
       case 69: /* multiplicative_expression ::= multiplicative_expression SLASH unary_expression */
-#line 228 "ecmascript.lemon"
+#line 239 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SLASH, 2);
 }
-#line 1631 "ecmascript.c"
+#line 1642 "ecmascript.c"
         break;
       case 70: /* multiplicative_expression ::= multiplicative_expression MOD unary_expression */
-#line 231 "ecmascript.lemon"
+#line 242 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MOD, 2);
 }
-#line 1638 "ecmascript.c"
+#line 1649 "ecmascript.c"
         break;
       case 72: /* unary_expression ::= DELETE unary_expression */
-#line 236 "ecmascript.lemon"
+#line 247 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DELETE, 1);
 }
-#line 1645 "ecmascript.c"
+#line 1656 "ecmascript.c"
         break;
       case 73: /* unary_expression ::= INCR unary_expression */
-#line 239 "ecmascript.lemon"
+#line 250 "ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1662,10 +1673,10 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_INCR, 1);
   }
 }
-#line 1666 "ecmascript.c"
+#line 1677 "ecmascript.c"
         break;
       case 74: /* unary_expression ::= DECR unary_expression */
-#line 256 "ecmascript.lemon"
+#line 267 "ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1683,66 +1694,66 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DECR, 1);
   }
 }
-#line 1687 "ecmascript.c"
+#line 1698 "ecmascript.c"
         break;
       case 75: /* unary_expression ::= PLUS unary_expression */
-#line 273 "ecmascript.lemon"
+#line 284 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS, 1);
 }
-#line 1694 "ecmascript.c"
+#line 1705 "ecmascript.c"
         break;
       case 76: /* unary_expression ::= MINUS unary_expression */
-#line 276 "ecmascript.lemon"
+#line 287 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS, 1);
 }
-#line 1701 "ecmascript.c"
+#line 1712 "ecmascript.c"
         break;
       case 77: /* unary_expression ::= NOT unary_expression */
-#line 279 "ecmascript.lemon"
+#line 290 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NOT, 1);
 }
-#line 1708 "ecmascript.c"
+#line 1719 "ecmascript.c"
         break;
       case 78: /* unary_expression ::= BITWISE_NOT unary_expression */
-#line 282 "ecmascript.lemon"
+#line 293 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_NOT, 1);
 }
-#line 1715 "ecmascript.c"
+#line 1726 "ecmascript.c"
         break;
       case 79: /* unary_expression ::= ADJUST unary_expression */
-#line 285 "ecmascript.lemon"
+#line 296 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_ADJUST, 1);
 }
-#line 1722 "ecmascript.c"
+#line 1733 "ecmascript.c"
         break;
       case 80: /* unary_expression ::= EXACT unary_expression */
-#line 288 "ecmascript.lemon"
+#line 299 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_EXACT, 1);
 }
-#line 1729 "ecmascript.c"
+#line 1740 "ecmascript.c"
         break;
       case 81: /* unary_expression ::= PARTIAL unary_expression */
-#line 291 "ecmascript.lemon"
+#line 302 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PARTIAL, 1);
 }
-#line 1736 "ecmascript.c"
+#line 1747 "ecmascript.c"
         break;
       case 82: /* unary_expression ::= UNSPLIT unary_expression */
-#line 294 "ecmascript.lemon"
+#line 305 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_UNSPLIT, 1);
 }
-#line 1743 "ecmascript.c"
+#line 1754 "ecmascript.c"
         break;
       case 84: /* postfix_expression ::= lefthand_side_expression INCR */
-#line 299 "ecmascript.lemon"
+#line 310 "ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1760,10 +1771,10 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_INCR_POST, 1);
   }
 }
-#line 1764 "ecmascript.c"
+#line 1775 "ecmascript.c"
         break;
       case 85: /* postfix_expression ::= lefthand_side_expression DECR */
-#line 316 "ecmascript.lemon"
+#line 327 "ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_expr *e = (grn_expr *)(efsi->e);
@@ -1781,51 +1792,51 @@ static void yy_reduce(
     grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DECR_POST, 1);
   }
 }
-#line 1785 "ecmascript.c"
+#line 1796 "ecmascript.c"
         break;
       case 88: /* call_expression ::= member_expression arguments */
-#line 337 "ecmascript.lemon"
+#line 348 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_CALL, yymsp[0].minor.yy0);
 }
-#line 1792 "ecmascript.c"
+#line 1803 "ecmascript.c"
         break;
       case 113: /* member_expression_part ::= BRACKETL expression BRACKETR */
-#line 373 "ecmascript.lemon"
+#line 384 "ecmascript.lemon"
 {
   grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GET_MEMBER, 2);
 }
-#line 1799 "ecmascript.c"
+#line 1810 "ecmascript.c"
         break;
       case 115: /* arguments ::= PARENL argument_list PARENR */
-#line 378 "ecmascript.lemon"
+#line 389 "ecmascript.lemon"
 { yygotominor.yy0 = yymsp[-1].minor.yy0; }
-#line 1804 "ecmascript.c"
+#line 1815 "ecmascript.c"
         break;
       case 116: /* argument_list ::= */
-#line 379 "ecmascript.lemon"
+#line 390 "ecmascript.lemon"
 { yygotominor.yy0 = 0; }
-#line 1809 "ecmascript.c"
+#line 1820 "ecmascript.c"
         break;
       case 117: /* argument_list ::= assignment_expression */
-#line 380 "ecmascript.lemon"
+#line 391 "ecmascript.lemon"
 { yygotominor.yy0 = 1; }
-#line 1814 "ecmascript.c"
+#line 1825 "ecmascript.c"
         break;
       case 118: /* argument_list ::= argument_list COMMA assignment_expression */
-#line 381 "ecmascript.lemon"
+#line 392 "ecmascript.lemon"
 { yygotominor.yy0 = yymsp[-2].minor.yy0 + 1; }
-#line 1819 "ecmascript.c"
+#line 1830 "ecmascript.c"
         break;
       case 119: /* output_columns ::= */
-#line 383 "ecmascript.lemon"
+#line 394 "ecmascript.lemon"
 {
   yygotominor.yy0 = 0;
 }
-#line 1826 "ecmascript.c"
+#line 1837 "ecmascript.c"
         break;
       case 120: /* output_columns ::= output_column */
-#line 386 "ecmascript.lemon"
+#line 397 "ecmascript.lemon"
 {
   if (yymsp[0].minor.yy0) {
     yygotominor.yy0 = 0;
@@ -1833,10 +1844,10 @@ static void yy_reduce(
     yygotominor.yy0 = 1;
   }
 }
-#line 1837 "ecmascript.c"
+#line 1848 "ecmascript.c"
         break;
       case 121: /* output_columns ::= output_columns COMMA output_column */
-#line 394 "ecmascript.lemon"
+#line 405 "ecmascript.lemon"
 {
   if (yymsp[0].minor.yy0) {
     yygotominor.yy0 = yymsp[-2].minor.yy0;
@@ -1847,10 +1858,10 @@ static void yy_reduce(
     yygotominor.yy0 = 1;
   }
 }
-#line 1851 "ecmascript.c"
+#line 1862 "ecmascript.c"
         break;
       case 122: /* output_column ::= STAR */
-#line 405 "ecmascript.lemon"
+#line 416 "ecmascript.lemon"
 {
   grn_ctx *ctx = efsi->ctx;
   grn_obj *expr = efsi->e;
@@ -1888,21 +1899,21 @@ static void yy_reduce(
     yygotominor.yy0 = GRN_TRUE;
   }
 }
-#line 1892 "ecmascript.c"
+#line 1903 "ecmascript.c"
         break;
       case 123: /* output_column ::= NONEXISTENT_COLUMN */
-#line 442 "ecmascript.lemon"
+#line 453 "ecmascript.lemon"
 {
   yygotominor.yy0 = GRN_TRUE;
 }
-#line 1899 "ecmascript.c"
+#line 1910 "ecmascript.c"
         break;
       case 124: /* output_column ::= assignment_expression */
-#line 445 "ecmascript.lemon"
+#line 456 "ecmascript.lemon"
 {
   yygotominor.yy0 = GRN_FALSE;
 }
-#line 1906 "ecmascript.c"
+#line 1917 "ecmascript.c"
         break;
       default:
       /* (0) input ::= query */ yytestcase(yyruleno==0);
@@ -2038,7 +2049,7 @@ static void yy_syntax_error(
       GRN_OBJ_FIN(ctx, &message);
     }
   }
-#line 2042 "ecmascript.c"
+#line 2053 "ecmascript.c"
   grn_expr_parserARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }
 

  Modified: lib/ecmascript.lemon (+11 -0)
===================================================================
--- lib/ecmascript.lemon    2014-08-14 22:07:16 +0900 (9485057)
+++ lib/ecmascript.lemon    2014-08-14 22:11:41 +0900 (6692699)
@@ -67,6 +67,17 @@ query_element ::= IDENTIFIER RELATIVE_OP query_element. {
   grn_obj *c;
   GRN_PTR_POP(&efsi->column_stack, c);
   GRN_INT32_POP(&efsi->mode_stack, mode);
+  switch (mode) {
+  case GRN_OP_NEAR :
+  case GRN_OP_NEAR2 :
+    {
+      int max_interval;
+      GRN_INT32_POP(&efsi->max_interval_stack, max_interval);
+    }
+    break;
+  default :
+    break;
+  }
 }
 query_element ::= BRACEL expression BRACER. {
   efsi->flags = efsi->default_flags;

  Modified: lib/expr.c (+54 -13)
===================================================================
--- lib/expr.c    2014-08-14 22:07:16 +0900 (191fdd3)
+++ lib/expr.c    2014-08-14 22:11:41 +0900 (26f42d4)
@@ -4039,6 +4039,13 @@ grn_expr_get_value(grn_ctx *ctx, grn_obj *expr, int offset)
   GRN_API_RETURN(res);
 }
 
+#define DEFAULT_WEIGHT 5
+#define DEFAULT_DECAYSTEP 2
+#define DEFAULT_MAX_INTERVAL 10
+#define DEFAULT_SIMILARITY_THRESHOLD 10
+#define DEFAULT_TERM_EXTRACT_POLICY 0
+#define DEFAULT_WEIGHT_VECTOR_SIZE 4096
+
 struct _grn_scan_info {
   uint32_t start;
   uint32_t end;
@@ -4050,6 +4057,7 @@ struct _grn_scan_info {
   grn_obj index;
   grn_obj *query;
   grn_obj *args[8];
+  int max_interval;
 };
 
 #define SI_FREE(si) do {\
@@ -4070,6 +4078,7 @@ struct _grn_scan_info {
   (si)->logical_op = GRN_OP_OR;\
   (si)->flags = SCAN_PUSH;\
   (si)->nargs = 0;\
+  (si)->max_interval = DEFAULT_MAX_INTERVAL;\
   (si)->start = (st);\
 } while (0)
 
@@ -4492,7 +4501,21 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
               }
             }
           } else {
-            si->query = *p;
+            switch (c->op) {
+            case GRN_OP_NEAR :
+            case GRN_OP_NEAR2 :
+              if (si->nargs == 3 &&
+                  *p == si->args[2] &&
+                  (*p)->header.domain == GRN_DB_INT32) {
+                si->max_interval = GRN_INT32_VALUE(*p);
+              } else {
+                si->query = *p;
+              }
+              break;
+            default :
+              si->query = *p;
+              break;
+            }
           }
         }
       }
@@ -5103,9 +5126,7 @@ grn_table_select_index(grn_ctx *ctx, grn_obj *table, scan_info *si,
         switch (si->op) {
         case GRN_OP_NEAR :
         case GRN_OP_NEAR2 :
-#define DEFAULT_NEAR_MAX_INTERVAL 10
-          optarg.max_interval = DEFAULT_NEAR_MAX_INTERVAL;
-#undef DEFAULT_NEAR_MAX_INTERVAL
+          optarg.max_interval = si->max_interval;
           break;
         default :
           optarg.max_interval = 0;
@@ -5324,13 +5345,6 @@ grn_int32_value_at(grn_obj *obj, int offset)
 
 #include "snip.h"
 
-#define DEFAULT_WEIGHT 5
-#define DEFAULT_DECAYSTEP 2
-#define DEFAULT_MAX_INTERVAL 10
-#define DEFAULT_SIMILARITY_THRESHOLD 10
-#define DEFAULT_TERM_EXTRACT_POLICY 0
-#define DEFAULT_WEIGHT_VECTOR_SIZE 4096
-
 typedef struct {
   grn_ctx *ctx;
   grn_obj *e;
@@ -5345,6 +5359,7 @@ typedef struct {
   grn_obj column_stack;
   grn_obj op_stack;
   grn_obj mode_stack;
+  grn_obj max_interval_stack;
   grn_operator default_op;
   grn_select_optarg opt;
   grn_operator default_mode;
@@ -5881,6 +5896,7 @@ accept_query_string(grn_ctx *ctx, efs_info *efsi,
                     const char *str, unsigned int str_size)
 {
   grn_obj *column, *token;
+  grn_operator mode;
 
   GRN_PTR_PUT(ctx, &efsi->token_stack,
               grn_expr_add_str(ctx, efsi->e, str, str_size));
@@ -5893,8 +5909,23 @@ accept_query_string(grn_ctx *ctx, efs_info *efsi,
   column = grn_ptr_value_at(&efsi->column_stack, -1);
   grn_expr_append_const(efsi->ctx, efsi->e, column, GRN_OP_GET_VALUE, 1);
   grn_expr_append_obj(efsi->ctx, efsi->e, token, GRN_OP_PUSH, 1);
-  grn_expr_append_op(efsi->ctx, efsi->e,
-                     grn_int32_value_at(&efsi->mode_stack, -1), 2);
+
+  mode = grn_int32_value_at(&efsi->mode_stack, -1);
+  switch (mode) {
+  case GRN_OP_NEAR :
+  case GRN_OP_NEAR2 :
+    {
+      int max_interval;
+      max_interval = grn_int32_value_at(&efsi->max_interval_stack, -1);
+      grn_expr_append_const_int(efsi->ctx, efsi->e, max_interval,
+                                GRN_OP_PUSH, 1);
+      grn_expr_append_op(efsi->ctx, efsi->e, mode, 3);
+    }
+    break;
+  default :
+    grn_expr_append_op(efsi->ctx, efsi->e, mode, 2);
+    break;
+  }
 }
 
 static grn_rc
@@ -6062,6 +6093,14 @@ parse_query(grn_ctx *ctx, efs_info *q)
     case GRN_QUERY_PREFIX :
       q->cur++;
       if (get_op(q, op, &mode, &option)) {
+        switch (mode) {
+        case GRN_OP_NEAR :
+        case GRN_OP_NEAR2 :
+          GRN_INT32_PUT(ctx, &q->max_interval_stack, option);
+          break;
+        default :
+          break;
+        }
         GRN_INT32_PUT(ctx, &q->mode_stack, mode);
         PARSE(GRN_EXPR_TOKEN_RELATIVE_OP);
       } else {
@@ -6753,6 +6792,7 @@ grn_expr_parse(grn_ctx *ctx, grn_obj *expr,
     GRN_TEXT_INIT(&efsi.buf, 0);
     GRN_INT32_INIT(&efsi.op_stack, GRN_OBJ_VECTOR);
     GRN_INT32_INIT(&efsi.mode_stack, GRN_OBJ_VECTOR);
+    GRN_INT32_INIT(&efsi.max_interval_stack, GRN_OBJ_VECTOR);
     GRN_PTR_INIT(&efsi.column_stack, GRN_OBJ_VECTOR, GRN_ID_NIL);
     GRN_PTR_INIT(&efsi.token_stack, GRN_OBJ_VECTOR, GRN_ID_NIL);
     efsi.e = expr;
@@ -6801,6 +6841,7 @@ grn_expr_parse(grn_ctx *ctx, grn_obj *expr,
     */
     GRN_OBJ_FIN(ctx, &efsi.op_stack);
     GRN_OBJ_FIN(ctx, &efsi.mode_stack);
+    GRN_OBJ_FIN(ctx, &efsi.max_interval_stack);
     GRN_OBJ_FIN(ctx, &efsi.column_stack);
     GRN_OBJ_FIN(ctx, &efsi.token_stack);
     GRN_OBJ_FIN(ctx, &efsi.buf);

  Added: test/command/suite/select/query/near_search/custom_max_interval/match.expected (+47 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/query/near_search/custom_max_interval/match.expected    2014-08-14 22:11:41 +0900 (c1246ae)
@@ -0,0 +1,47 @@
+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"}
+]
+[[0,0.0,0.0],1]
+select --table Memos --match_columns content --query '*N5"a g"'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ],
+        [
+          "_key",
+          "ShortText"
+        ],
+        [
+          "content",
+          "ShortText"
+        ]
+      ],
+      [
+        1,
+        "alphabets",
+        "a b c d e f g i"
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/query/near_search/custom_max_interval/match.test (+14 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/query/near_search/custom_max_interval/match.test    2014-08-14 22:11:41 +0900 (6bfd5ce)
@@ -0,0 +1,14 @@
+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"}
+]
+
+select --table Memos --match_columns content --query '*N5"a g"'

  Added: test/command/suite/select/query/near_search/custom_max_interval/not_match.expected (+42 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/query/near_search/custom_max_interval/not_match.expected    2014-08-14 22:11:41 +0900 (11dc580)
@@ -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"}
+]
+[[0,0.0,0.0],1]
+select --table Memos --match_columns content --query '*N5"a i"'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        0
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ],
+        [
+          "_key",
+          "ShortText"
+        ],
+        [
+          "content",
+          "ShortText"
+        ]
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/query/near_search/custom_max_interval/not_match.test (+14 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/query/near_search/custom_max_interval/not_match.test    2014-08-14 22:11:41 +0900 (4ab892e)
@@ -0,0 +1,14 @@
+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"}
+]
+
+select --table Memos --match_columns content --query '*N5"a i"'
-------------- next part --------------
HTML����������������������������...
Download 



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