Kouhei Sutou
null+****@clear*****
Thu Sep 25 21:40:28 JST 2014
Kouhei Sutou 2014-09-25 21:40:28 +0900 (Thu, 25 Sep 2014) New Revision: b552f2b235aa2a31cd88a3f59b7be805614614f2 https://github.com/groonga/groonga/commit/b552f2b235aa2a31cd88a3f59b7be805614614f2 Message: Support custom similarity threshold '*S10"..."' syntax TODO: Document me. Added files: test/command/suite/select/query/similar_search/threshold.expected test/command/suite/select/query/similar_search/threshold.test Modified files: lib/ecmascript.c lib/ecmascript.lemon lib/expr.c lib/expr.h lib/ii.c Modified: lib/ecmascript.c (+149 -143) =================================================================== --- lib/ecmascript.c 2014-09-25 21:28:42 +0900 (fd74f95) +++ lib/ecmascript.c 2014-09-25 21:40:28 +0900 (e973f12) @@ -4,7 +4,7 @@ /* First off, code is included that follows the "include" declaration ** in the input grammar file. */ #include <stdio.h> -#line 3 "ecmascript.lemon" +#line 4 "ecmascript.lemon" #define assert GRN_ASSERT #line 11 "ecmascript.c" @@ -867,7 +867,7 @@ static void yy_destructor( */ case 74: /* suppress_unused_variable_warning */ { -#line 10 "ecmascript.lemon" +#line 11 "ecmascript.lemon" (void)efsi; @@ -1295,7 +1295,7 @@ static void yy_reduce( ** break; */ case 5: /* query ::= query query_element */ -#line 45 "ecmascript.lemon" +#line 46 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, grn_int32_value_at(&efsi->op_stack, -1), 2); } @@ -1303,7 +1303,7 @@ static void yy_reduce( break; case 6: /* query ::= query LOGICAL_AND query_element */ case 35: /* logical_and_expression ::= logical_and_expression LOGICAL_AND bitwise_or_expression */ yytestcase(yyruleno==35); -#line 48 "ecmascript.lemon" +#line 49 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND, 2); } @@ -1311,7 +1311,7 @@ static void yy_reduce( break; case 7: /* query ::= query LOGICAL_AND_NOT query_element */ case 36: /* logical_and_expression ::= logical_and_expression LOGICAL_AND_NOT bitwise_or_expression */ yytestcase(yyruleno==36); -#line 51 "ecmascript.lemon" +#line 52 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND_NOT, 2); } @@ -1319,14 +1319,14 @@ static void yy_reduce( break; case 8: /* query ::= query LOGICAL_OR query_element */ case 33: /* logical_or_expression ::= logical_or_expression LOGICAL_OR logical_and_expression */ yytestcase(yyruleno==33); -#line 54 "ecmascript.lemon" +#line 55 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_OR, 2); } #line 1327 "ecmascript.c" break; case 11: /* query_element ::= RELATIVE_OP query_element */ -#line 61 "ecmascript.lemon" +#line 62 "ecmascript.lemon" { int mode; GRN_INT32_POP(&efsi->mode_stack, mode); @@ -1334,7 +1334,7 @@ static void yy_reduce( #line 1335 "ecmascript.c" break; case 12: /* query_element ::= IDENTIFIER RELATIVE_OP query_element */ -#line 65 "ecmascript.lemon" +#line 66 "ecmascript.lemon" { int mode; grn_obj *c; @@ -1348,314 +1348,320 @@ static void yy_reduce( GRN_INT32_POP(&efsi->max_interval_stack, max_interval); } break; + case GRN_OP_SIMILAR : + { + int similarity_threshold; + GRN_INT32_POP(&efsi->similarity_threshold_stack, similarity_threshold); + } + break; default : break; } } -#line 1356 "ecmascript.c" +#line 1362 "ecmascript.c" break; case 13: /* query_element ::= BRACEL expression BRACER */ case 14: /* query_element ::= EVAL primary_expression */ yytestcase(yyruleno==14); -#line 82 "ecmascript.lemon" +#line 89 "ecmascript.lemon" { efsi->flags = efsi->default_flags; } -#line 1364 "ecmascript.c" +#line 1370 "ecmascript.c" break; case 16: /* expression ::= expression COMMA assignment_expression */ -#line 90 "ecmascript.lemon" +#line 97 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_COMMA, 2); } -#line 1371 "ecmascript.c" +#line 1377 "ecmascript.c" break; case 18: /* assignment_expression ::= lefthand_side_expression ASSIGN assignment_expression */ -#line 95 "ecmascript.lemon" +#line 102 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_ASSIGN, 2); } -#line 1378 "ecmascript.c" +#line 1384 "ecmascript.c" break; case 19: /* assignment_expression ::= lefthand_side_expression STAR_ASSIGN assignment_expression */ -#line 98 "ecmascript.lemon" +#line 105 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_STAR_ASSIGN, 2); } -#line 1385 "ecmascript.c" +#line 1391 "ecmascript.c" break; case 20: /* assignment_expression ::= lefthand_side_expression SLASH_ASSIGN assignment_expression */ -#line 101 "ecmascript.lemon" +#line 108 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SLASH_ASSIGN, 2); } -#line 1392 "ecmascript.c" +#line 1398 "ecmascript.c" break; case 21: /* assignment_expression ::= lefthand_side_expression MOD_ASSIGN assignment_expression */ -#line 104 "ecmascript.lemon" +#line 111 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MOD_ASSIGN, 2); } -#line 1399 "ecmascript.c" +#line 1405 "ecmascript.c" break; case 22: /* assignment_expression ::= lefthand_side_expression PLUS_ASSIGN assignment_expression */ -#line 107 "ecmascript.lemon" +#line 114 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS_ASSIGN, 2); } -#line 1406 "ecmascript.c" +#line 1412 "ecmascript.c" break; case 23: /* assignment_expression ::= lefthand_side_expression MINUS_ASSIGN assignment_expression */ -#line 110 "ecmascript.lemon" +#line 117 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS_ASSIGN, 2); } -#line 1413 "ecmascript.c" +#line 1419 "ecmascript.c" break; case 24: /* assignment_expression ::= lefthand_side_expression SHIFTL_ASSIGN assignment_expression */ -#line 113 "ecmascript.lemon" +#line 120 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTL_ASSIGN, 2); } -#line 1420 "ecmascript.c" +#line 1426 "ecmascript.c" break; case 25: /* assignment_expression ::= lefthand_side_expression SHIFTR_ASSIGN assignment_expression */ -#line 116 "ecmascript.lemon" +#line 123 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTR_ASSIGN, 2); } -#line 1427 "ecmascript.c" +#line 1433 "ecmascript.c" break; case 26: /* assignment_expression ::= lefthand_side_expression SHIFTRR_ASSIGN assignment_expression */ -#line 119 "ecmascript.lemon" +#line 126 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTRR_ASSIGN, 2); } -#line 1434 "ecmascript.c" +#line 1440 "ecmascript.c" break; case 27: /* assignment_expression ::= lefthand_side_expression AND_ASSIGN assignment_expression */ -#line 122 "ecmascript.lemon" +#line 129 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_AND_ASSIGN, 2); } -#line 1441 "ecmascript.c" +#line 1447 "ecmascript.c" break; case 28: /* assignment_expression ::= lefthand_side_expression XOR_ASSIGN assignment_expression */ -#line 125 "ecmascript.lemon" +#line 132 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_XOR_ASSIGN, 2); } -#line 1448 "ecmascript.c" +#line 1454 "ecmascript.c" break; case 29: /* assignment_expression ::= lefthand_side_expression OR_ASSIGN assignment_expression */ -#line 128 "ecmascript.lemon" +#line 135 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_OR_ASSIGN, 2); } -#line 1455 "ecmascript.c" +#line 1461 "ecmascript.c" break; case 31: /* conditional_expression ::= logical_or_expression QUESTION assignment_expression COLON assignment_expression */ -#line 133 "ecmascript.lemon" +#line 140 "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 1464 "ecmascript.c" +#line 1470 "ecmascript.c" break; case 38: /* bitwise_or_expression ::= bitwise_or_expression BITWISE_OR bitwise_xor_expression */ -#line 153 "ecmascript.lemon" +#line 160 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_OR, 2); } -#line 1471 "ecmascript.c" +#line 1477 "ecmascript.c" break; case 40: /* bitwise_xor_expression ::= bitwise_xor_expression BITWISE_XOR bitwise_and_expression */ -#line 158 "ecmascript.lemon" +#line 165 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_XOR, 2); } -#line 1478 "ecmascript.c" +#line 1484 "ecmascript.c" break; case 42: /* bitwise_and_expression ::= bitwise_and_expression BITWISE_AND equality_expression */ -#line 163 "ecmascript.lemon" +#line 170 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_AND, 2); } -#line 1485 "ecmascript.c" +#line 1491 "ecmascript.c" break; case 44: /* equality_expression ::= equality_expression EQUAL relational_expression */ -#line 168 "ecmascript.lemon" +#line 175 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_EQUAL, 2); } -#line 1492 "ecmascript.c" +#line 1498 "ecmascript.c" break; case 45: /* equality_expression ::= equality_expression NOT_EQUAL relational_expression */ -#line 171 "ecmascript.lemon" +#line 178 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NOT_EQUAL, 2); } -#line 1499 "ecmascript.c" +#line 1505 "ecmascript.c" break; case 47: /* relational_expression ::= relational_expression LESS shift_expression */ -#line 176 "ecmascript.lemon" +#line 183 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LESS, 2); } -#line 1506 "ecmascript.c" +#line 1512 "ecmascript.c" break; case 48: /* relational_expression ::= relational_expression GREATER shift_expression */ -#line 179 "ecmascript.lemon" +#line 186 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GREATER, 2); } -#line 1513 "ecmascript.c" +#line 1519 "ecmascript.c" break; case 49: /* relational_expression ::= relational_expression LESS_EQUAL shift_expression */ -#line 182 "ecmascript.lemon" +#line 189 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LESS_EQUAL, 2); } -#line 1520 "ecmascript.c" +#line 1526 "ecmascript.c" break; case 50: /* relational_expression ::= relational_expression GREATER_EQUAL shift_expression */ -#line 185 "ecmascript.lemon" +#line 192 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GREATER_EQUAL, 2); } -#line 1527 "ecmascript.c" +#line 1533 "ecmascript.c" break; case 51: /* relational_expression ::= relational_expression IN shift_expression */ -#line 188 "ecmascript.lemon" +#line 195 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_IN, 2); } -#line 1534 "ecmascript.c" +#line 1540 "ecmascript.c" break; case 52: /* relational_expression ::= relational_expression MATCH shift_expression */ case 130: /* adjust_match_expression ::= IDENTIFIER MATCH STRING */ yytestcase(yyruleno==130); -#line 191 "ecmascript.lemon" +#line 198 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MATCH, 2); } -#line 1542 "ecmascript.c" +#line 1548 "ecmascript.c" break; case 53: /* relational_expression ::= relational_expression NEAR shift_expression */ -#line 194 "ecmascript.lemon" +#line 201 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR, 2); } -#line 1549 "ecmascript.c" +#line 1555 "ecmascript.c" break; case 54: /* relational_expression ::= relational_expression NEAR2 shift_expression */ -#line 197 "ecmascript.lemon" +#line 204 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NEAR2, 2); } -#line 1556 "ecmascript.c" +#line 1562 "ecmascript.c" break; case 55: /* relational_expression ::= relational_expression SIMILAR shift_expression */ -#line 200 "ecmascript.lemon" +#line 207 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SIMILAR, 2); } -#line 1563 "ecmascript.c" +#line 1569 "ecmascript.c" break; case 56: /* relational_expression ::= relational_expression TERM_EXTRACT shift_expression */ -#line 203 "ecmascript.lemon" +#line 210 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_TERM_EXTRACT, 2); } -#line 1570 "ecmascript.c" +#line 1576 "ecmascript.c" break; case 57: /* relational_expression ::= relational_expression LCP shift_expression */ -#line 206 "ecmascript.lemon" +#line 213 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_LCP, 2); } -#line 1577 "ecmascript.c" +#line 1583 "ecmascript.c" break; case 58: /* relational_expression ::= relational_expression PREFIX shift_expression */ -#line 209 "ecmascript.lemon" +#line 216 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PREFIX, 2); } -#line 1584 "ecmascript.c" +#line 1590 "ecmascript.c" break; case 59: /* relational_expression ::= relational_expression SUFFIX shift_expression */ -#line 212 "ecmascript.lemon" +#line 219 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SUFFIX, 2); } -#line 1591 "ecmascript.c" +#line 1597 "ecmascript.c" break; case 61: /* shift_expression ::= shift_expression SHIFTL additive_expression */ -#line 217 "ecmascript.lemon" +#line 224 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTL, 2); } -#line 1598 "ecmascript.c" +#line 1604 "ecmascript.c" break; case 62: /* shift_expression ::= shift_expression SHIFTR additive_expression */ -#line 220 "ecmascript.lemon" +#line 227 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTR, 2); } -#line 1605 "ecmascript.c" +#line 1611 "ecmascript.c" break; case 63: /* shift_expression ::= shift_expression SHIFTRR additive_expression */ -#line 223 "ecmascript.lemon" +#line 230 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SHIFTRR, 2); } -#line 1612 "ecmascript.c" +#line 1618 "ecmascript.c" break; case 65: /* additive_expression ::= additive_expression PLUS multiplicative_expression */ case 127: /* adjuster ::= adjuster PLUS adjust_expression */ yytestcase(yyruleno==127); -#line 228 "ecmascript.lemon" +#line 235 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS, 2); } -#line 1620 "ecmascript.c" +#line 1626 "ecmascript.c" break; case 66: /* additive_expression ::= additive_expression MINUS multiplicative_expression */ -#line 231 "ecmascript.lemon" +#line 238 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS, 2); } -#line 1627 "ecmascript.c" +#line 1633 "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 236 "ecmascript.lemon" +#line 243 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_STAR, 2); } -#line 1635 "ecmascript.c" +#line 1641 "ecmascript.c" break; case 69: /* multiplicative_expression ::= multiplicative_expression SLASH unary_expression */ -#line 239 "ecmascript.lemon" +#line 246 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_SLASH, 2); } -#line 1642 "ecmascript.c" +#line 1648 "ecmascript.c" break; case 70: /* multiplicative_expression ::= multiplicative_expression MOD unary_expression */ -#line 242 "ecmascript.lemon" +#line 249 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MOD, 2); } -#line 1649 "ecmascript.c" +#line 1655 "ecmascript.c" break; case 72: /* unary_expression ::= DELETE unary_expression */ -#line 247 "ecmascript.lemon" +#line 254 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DELETE, 1); } -#line 1656 "ecmascript.c" +#line 1662 "ecmascript.c" break; case 73: /* unary_expression ::= INCR unary_expression */ -#line 250 "ecmascript.lemon" +#line 257 "ecmascript.lemon" { grn_ctx *ctx = efsi->ctx; grn_expr *e = (grn_expr *)(efsi->e); @@ -1673,10 +1679,10 @@ static void yy_reduce( grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_INCR, 1); } } -#line 1677 "ecmascript.c" +#line 1683 "ecmascript.c" break; case 74: /* unary_expression ::= DECR unary_expression */ -#line 267 "ecmascript.lemon" +#line 274 "ecmascript.lemon" { grn_ctx *ctx = efsi->ctx; grn_expr *e = (grn_expr *)(efsi->e); @@ -1694,66 +1700,66 @@ static void yy_reduce( grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DECR, 1); } } -#line 1698 "ecmascript.c" +#line 1704 "ecmascript.c" break; case 75: /* unary_expression ::= PLUS unary_expression */ -#line 284 "ecmascript.lemon" +#line 291 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PLUS, 1); } -#line 1705 "ecmascript.c" +#line 1711 "ecmascript.c" break; case 76: /* unary_expression ::= MINUS unary_expression */ -#line 287 "ecmascript.lemon" +#line 294 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_MINUS, 1); } -#line 1712 "ecmascript.c" +#line 1718 "ecmascript.c" break; case 77: /* unary_expression ::= NOT unary_expression */ -#line 290 "ecmascript.lemon" +#line 297 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_NOT, 1); } -#line 1719 "ecmascript.c" +#line 1725 "ecmascript.c" break; case 78: /* unary_expression ::= BITWISE_NOT unary_expression */ -#line 293 "ecmascript.lemon" +#line 300 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_BITWISE_NOT, 1); } -#line 1726 "ecmascript.c" +#line 1732 "ecmascript.c" break; case 79: /* unary_expression ::= ADJUST unary_expression */ -#line 296 "ecmascript.lemon" +#line 303 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_ADJUST, 1); } -#line 1733 "ecmascript.c" +#line 1739 "ecmascript.c" break; case 80: /* unary_expression ::= EXACT unary_expression */ -#line 299 "ecmascript.lemon" +#line 306 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_EXACT, 1); } -#line 1740 "ecmascript.c" +#line 1746 "ecmascript.c" break; case 81: /* unary_expression ::= PARTIAL unary_expression */ -#line 302 "ecmascript.lemon" +#line 309 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_PARTIAL, 1); } -#line 1747 "ecmascript.c" +#line 1753 "ecmascript.c" break; case 82: /* unary_expression ::= UNSPLIT unary_expression */ -#line 305 "ecmascript.lemon" +#line 312 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_UNSPLIT, 1); } -#line 1754 "ecmascript.c" +#line 1760 "ecmascript.c" break; case 84: /* postfix_expression ::= lefthand_side_expression INCR */ -#line 310 "ecmascript.lemon" +#line 317 "ecmascript.lemon" { grn_ctx *ctx = efsi->ctx; grn_expr *e = (grn_expr *)(efsi->e); @@ -1771,10 +1777,10 @@ static void yy_reduce( grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_INCR_POST, 1); } } -#line 1775 "ecmascript.c" +#line 1781 "ecmascript.c" break; case 85: /* postfix_expression ::= lefthand_side_expression DECR */ -#line 327 "ecmascript.lemon" +#line 334 "ecmascript.lemon" { grn_ctx *ctx = efsi->ctx; grn_expr *e = (grn_expr *)(efsi->e); @@ -1792,51 +1798,51 @@ static void yy_reduce( grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_DECR_POST, 1); } } -#line 1796 "ecmascript.c" +#line 1802 "ecmascript.c" break; case 88: /* call_expression ::= member_expression arguments */ -#line 348 "ecmascript.lemon" +#line 355 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_CALL, yymsp[0].minor.yy0); } -#line 1803 "ecmascript.c" +#line 1809 "ecmascript.c" break; case 113: /* member_expression_part ::= BRACKETL expression BRACKETR */ -#line 384 "ecmascript.lemon" +#line 391 "ecmascript.lemon" { grn_expr_append_op(efsi->ctx, efsi->e, GRN_OP_GET_MEMBER, 2); } -#line 1810 "ecmascript.c" +#line 1816 "ecmascript.c" break; case 115: /* arguments ::= PARENL argument_list PARENR */ -#line 389 "ecmascript.lemon" +#line 396 "ecmascript.lemon" { yygotominor.yy0 = yymsp[-1].minor.yy0; } -#line 1815 "ecmascript.c" +#line 1821 "ecmascript.c" break; case 116: /* argument_list ::= */ -#line 390 "ecmascript.lemon" +#line 397 "ecmascript.lemon" { yygotominor.yy0 = 0; } -#line 1820 "ecmascript.c" +#line 1826 "ecmascript.c" break; case 117: /* argument_list ::= assignment_expression */ -#line 391 "ecmascript.lemon" +#line 398 "ecmascript.lemon" { yygotominor.yy0 = 1; } -#line 1825 "ecmascript.c" +#line 1831 "ecmascript.c" break; case 118: /* argument_list ::= argument_list COMMA assignment_expression */ -#line 392 "ecmascript.lemon" +#line 399 "ecmascript.lemon" { yygotominor.yy0 = yymsp[-2].minor.yy0 + 1; } -#line 1830 "ecmascript.c" +#line 1836 "ecmascript.c" break; case 119: /* output_columns ::= */ -#line 394 "ecmascript.lemon" +#line 401 "ecmascript.lemon" { yygotominor.yy0 = 0; } -#line 1837 "ecmascript.c" +#line 1843 "ecmascript.c" break; case 120: /* output_columns ::= output_column */ -#line 397 "ecmascript.lemon" +#line 404 "ecmascript.lemon" { if (yymsp[0].minor.yy0) { yygotominor.yy0 = 0; @@ -1844,10 +1850,10 @@ static void yy_reduce( yygotominor.yy0 = 1; } } -#line 1848 "ecmascript.c" +#line 1854 "ecmascript.c" break; case 121: /* output_columns ::= output_columns COMMA output_column */ -#line 405 "ecmascript.lemon" +#line 412 "ecmascript.lemon" { if (yymsp[0].minor.yy0) { yygotominor.yy0 = yymsp[-2].minor.yy0; @@ -1858,10 +1864,10 @@ static void yy_reduce( yygotominor.yy0 = 1; } } -#line 1862 "ecmascript.c" +#line 1868 "ecmascript.c" break; case 122: /* output_column ::= STAR */ -#line 416 "ecmascript.lemon" +#line 423 "ecmascript.lemon" { grn_ctx *ctx = efsi->ctx; grn_obj *expr = efsi->e; @@ -1899,21 +1905,21 @@ static void yy_reduce( yygotominor.yy0 = GRN_TRUE; } } -#line 1903 "ecmascript.c" +#line 1909 "ecmascript.c" break; case 123: /* output_column ::= NONEXISTENT_COLUMN */ -#line 453 "ecmascript.lemon" +#line 460 "ecmascript.lemon" { yygotominor.yy0 = GRN_TRUE; } -#line 1910 "ecmascript.c" +#line 1916 "ecmascript.c" break; case 124: /* output_column ::= assignment_expression */ -#line 456 "ecmascript.lemon" +#line 463 "ecmascript.lemon" { yygotominor.yy0 = GRN_FALSE; } -#line 1917 "ecmascript.c" +#line 1923 "ecmascript.c" break; default: /* (0) input ::= query */ yytestcase(yyruleno==0); @@ -2027,7 +2033,7 @@ static void yy_syntax_error( ){ grn_expr_parserARG_FETCH; #define TOKEN (yyminor.yy0) -#line 16 "ecmascript.lemon" +#line 17 "ecmascript.lemon" { grn_ctx *ctx = efsi->ctx; @@ -2049,7 +2055,7 @@ static void yy_syntax_error( GRN_OBJ_FIN(ctx, &message); } } -#line 2053 "ecmascript.c" +#line 2059 "ecmascript.c" grn_expr_parserARG_STORE; /* Suppress warning about unused %extra_argument variable */ } Modified: lib/ecmascript.lemon (+7 -0) =================================================================== --- lib/ecmascript.lemon 2014-09-25 21:28:42 +0900 (6692699) +++ lib/ecmascript.lemon 2014-09-25 21:40:28 +0900 (322d7ac) @@ -1,3 +1,4 @@ +/* -*- mode: c; c-basic-offset: 2 -*- */ %name grn_expr_parser %token_prefix GRN_EXPR_TOKEN_ %include { @@ -75,6 +76,12 @@ query_element ::= IDENTIFIER RELATIVE_OP query_element. { GRN_INT32_POP(&efsi->max_interval_stack, max_interval); } break; + case GRN_OP_SIMILAR : + { + int similarity_threshold; + GRN_INT32_POP(&efsi->similarity_threshold_stack, similarity_threshold); + } + break; default : break; } Modified: lib/expr.c (+44 -1) =================================================================== --- lib/expr.c 2014-09-25 21:28:42 +0900 (e899859) +++ lib/expr.c 2014-09-25 21:40:28 +0900 (1dfb540) @@ -4065,6 +4065,7 @@ struct _grn_scan_info { grn_obj *query; grn_obj *args[8]; int max_interval; + int similarity_threshold; }; #define SI_FREE(si) do {\ @@ -4086,6 +4087,7 @@ struct _grn_scan_info { (si)->flags = SCAN_PUSH;\ (si)->nargs = 0;\ (si)->max_interval = DEFAULT_MAX_INTERVAL;\ + (si)->similarity_threshold = DEFAULT_SIMILARITY_THRESHOLD;\ (si)->start = (st);\ } while (0) @@ -4226,6 +4228,7 @@ grn_scan_info_open(grn_ctx *ctx, int start) si->flags = SCAN_PUSH; si->nargs = 0; si->max_interval = DEFAULT_MAX_INTERVAL; + si->similarity_threshold = DEFAULT_SIMILARITY_THRESHOLD; si->start = start; return si; @@ -4316,6 +4319,18 @@ grn_scan_info_set_max_interval(scan_info *si, int max_interval) si->max_interval = max_interval; } +int +grn_scan_info_get_similarity_threshold(scan_info *si) +{ + return si->similarity_threshold; +} + +void +grn_scan_info_set_similarity_threshold(scan_info *si, int similarity_threshold) +{ + si->similarity_threshold = similarity_threshold; +} + grn_bool grn_scan_info_push_arg(scan_info *si, grn_obj *arg) { @@ -4532,6 +4547,15 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n, si->query = *p; } break; + case GRN_OP_SIMILAR : + if (si->nargs == 3 && + *p == si->args[2] && + (*p)->header.domain == GRN_DB_INT32) { + si->similarity_threshold = GRN_INT32_VALUE(*p); + } else { + si->query = *p; + } + break; default : si->query = *p; break; @@ -5142,14 +5166,17 @@ grn_table_select_index(grn_ctx *ctx, grn_obj *table, scan_info *si, } else { optarg.mode = si->op; } + optarg.max_interval = 0; optarg.similarity_threshold = 0; switch (si->op) { case GRN_OP_NEAR : case GRN_OP_NEAR2 : optarg.max_interval = si->max_interval; break; + case GRN_OP_SIMILAR : + optarg.similarity_threshold = si->similarity_threshold; + break; default : - optarg.max_interval = 0; break; } optarg.weight_vector = (int *)GRN_BULK_HEAD(&wv); @@ -5380,6 +5407,7 @@ typedef struct { grn_obj op_stack; grn_obj mode_stack; grn_obj max_interval_stack; + grn_obj similarity_threshold_stack; grn_operator default_op; grn_select_optarg opt; grn_operator default_mode; @@ -5942,6 +5970,16 @@ accept_query_string(grn_ctx *ctx, efs_info *efsi, grn_expr_append_op(efsi->ctx, efsi->e, mode, 3); } break; + case GRN_OP_SIMILAR : + { + int similarity_threshold; + similarity_threshold = + grn_int32_value_at(&efsi->similarity_threshold_stack, -1); + grn_expr_append_const_int(efsi->ctx, efsi->e, similarity_threshold, + 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; @@ -6118,6 +6156,9 @@ parse_query(grn_ctx *ctx, efs_info *q) case GRN_OP_NEAR2 : GRN_INT32_PUT(ctx, &q->max_interval_stack, option); break; + case GRN_OP_SIMILAR : + GRN_INT32_PUT(ctx, &q->similarity_threshold_stack, option); + break; default : break; } @@ -6813,6 +6854,7 @@ grn_expr_parse(grn_ctx *ctx, grn_obj *expr, 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_INT32_INIT(&efsi.similarity_threshold_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; @@ -6862,6 +6904,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.similarity_threshold_stack); GRN_OBJ_FIN(ctx, &efsi.column_stack); GRN_OBJ_FIN(ctx, &efsi.token_stack); GRN_OBJ_FIN(ctx, &efsi.buf); Modified: lib/expr.h (+2 -0) =================================================================== --- lib/expr.h 2014-09-25 21:28:42 +0900 (4b2aede) +++ lib/expr.h 2014-09-25 21:40:28 +0900 (a319400) @@ -57,6 +57,8 @@ void grn_scan_info_set_end(scan_info *si, uint32_t end); void grn_scan_info_set_query(scan_info *si, grn_obj *query); int grn_scan_info_get_max_interval(scan_info *si); void grn_scan_info_set_max_interval(scan_info *si, int max_interval); +int grn_scan_info_get_similarity_threshold(scan_info *si); +void grn_scan_info_set_similarity_threshold(scan_info *si, int similarity_threshold); grn_bool grn_scan_info_push_arg(scan_info *si, grn_obj *arg); grn_obj *grn_scan_info_get_arg(grn_ctx *ctx, scan_info *si, int i); Modified: lib/ii.c (+1 -0) =================================================================== --- lib/ii.c 2014-09-25 21:28:42 +0900 (81e7196) +++ lib/ii.c 2014-09-25 21:40:28 +0900 (d10b84d) @@ -6042,6 +6042,7 @@ grn_ii_sel(grn_ctx *ctx, grn_ii *ii, const char *string, unsigned int string_len break; case GRN_OP_SIMILAR : arg.mode = optarg->mode; + arg.similarity_threshold = optarg->similarity_threshold; break; default : break; Added: test/command/suite/select/query/similar_search/threshold.expected (+42 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/query/similar_search/threshold.expected 2014-09-25 21:40:28 +0900 (0707cad) @@ -0,0 +1,42 @@ +table_create Diaries TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Diaries 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 diaries_content COLUMN_INDEX|WITH_POSITION Diaries content +[[0,0.0,0.0],true] +load --table Diaries +[ +{"content": "a a a b b c d e f g h i j k"} +] +[[0,0.0,0.0],1] +select --table Diaries --match_columns content --query '*S2"a b c"' --output_columns content,_score --sortby _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 1 + ], + [ + [ + "content", + "ShortText" + ], + [ + "_score", + "Int32" + ] + ], + [ + "a a a b b c d e f g h i j k", + 2097155 + ] + ] + ] +] Added: test/command/suite/select/query/similar_search/threshold.test (+19 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/query/similar_search/threshold.test 2014-09-25 21:40:28 +0900 (352f6c7) @@ -0,0 +1,19 @@ +table_create Diaries TABLE_NO_KEY +column_create Diaries content COLUMN_SCALAR ShortText + +table_create Terms TABLE_PAT_KEY ShortText \ + --default_tokenizer TokenBigram \ + --normalizer NormalizerAuto +column_create Terms diaries_content COLUMN_INDEX|WITH_POSITION Diaries content + +load --table Diaries +[ +{"content": "a a a b b c d e f g h i j k"} +] + +select \ + --table Diaries \ + --match_columns content \ + --query '*S2"a b c"' \ + --output_columns content,_score \ + --sortby _id -------------- next part -------------- HTML����������������������������...Download