[Groonga-commit] groonga/groonga at fff7d13 [master] grn_ts: support "." in tokenization

Back to archive index

susumu.yata null+****@clear*****
Thu Sep 24 11:07:54 JST 2015


susumu.yata	2015-09-24 11:07:54 +0900 (Thu, 24 Sep 2015)

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

  Message:
    grn_ts: support "." in tokenization
    
    Add grn_ts_expr_bridge_token which indicates a bridge to a subexpression
    
    GitHub: #408

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+41 -5)
===================================================================
--- lib/ts.c    2015-09-24 09:46:50 +0900 (8446de0)
+++ lib/ts.c    2015-09-24 11:07:54 +0900 (a8d00a2)
@@ -3931,6 +3931,7 @@ typedef enum {
   GRN_TS_EXPR_CONST_TOKEN,  /* +data_kind, content and buf. */
   GRN_TS_EXPR_NAME_TOKEN,   /* +name. */
   GRN_TS_EXPR_OP_TOKEN,     /* +op_type. */
+  GRN_TS_EXPR_BRIDGE_TOKEN, /* No extra data. */
   GRN_TS_EXPR_BRACKET_TOKEN /* No extra data. */
 } grn_ts_expr_token_type;
 
@@ -3960,6 +3961,7 @@ typedef struct {
   grn_ts_op_type op_type;     /* Operator type. */
 } grn_ts_expr_op_token;
 
+typedef grn_ts_expr_token grn_ts_expr_bridge_token;
 typedef grn_ts_expr_token grn_ts_expr_bracket_token;
 
 typedef struct {
@@ -4020,6 +4022,13 @@ grn_ts_expr_op_token_init(grn_ctx *ctx, grn_ts_expr_op_token *token,
   GRN_TS_EXPR_TOKEN_INIT(OP);
 }
 
+/* grn_ts_expr_bridge_token_init() initializes a token. */
+static void
+grn_ts_expr_bridge_token_init(grn_ctx *ctx, grn_ts_expr_bridge_token *token,
+                              grn_ts_str src) {
+  GRN_TS_EXPR_TOKEN_INIT(BRIDGE)
+}
+
 /* grn_ts_expr_bracket_token_init() initializes a token. */
 static void
 grn_ts_expr_bracket_token_init(grn_ctx *ctx, grn_ts_expr_bracket_token *token,
@@ -4064,6 +4073,12 @@ grn_ts_expr_op_token_fin(grn_ctx *ctx, grn_ts_expr_op_token *token) {
   /* Nothing to do. */
 }
 
+/* grn_ts_expr_bridge_token_fin() finalizes a token. */
+static void
+grn_ts_expr_bridge_token_fin(grn_ctx *ctx, grn_ts_expr_bridge_token *token) {
+  /* Nothing to do. */
+}
+
 /* grn_ts_expr_bracket_token_fin() finalizes a token. */
 static void
 grn_ts_expr_bracket_token_fin(grn_ctx *ctx, grn_ts_expr_bracket_token *token) {
@@ -4129,6 +4144,14 @@ grn_ts_expr_op_token_open(grn_ctx *ctx, grn_ts_str src, grn_ts_op_type op_type,
   return GRN_SUCCESS;
 }
 
+/* grn_ts_expr_bridge_token_open() creates a token. */
+static grn_rc
+grn_ts_expr_bridge_token_open(grn_ctx *ctx, grn_ts_str src,
+                              grn_ts_expr_bridge_token **token) {
+  GRN_TS_EXPR_TOKEN_OPEN(BRIDGE, bridge)
+  return GRN_SUCCESS;
+}
+
 /* grn_ts_expr_bracket_token_open() creates a token. */
 static grn_rc
 grn_ts_expr_bracket_token_open(grn_ctx *ctx, grn_ts_str src,
@@ -4156,6 +4179,7 @@ grn_ts_expr_token_close(grn_ctx *ctx, grn_ts_expr_token *token) {
     GRN_TS_EXPR_TOKEN_CLOSE_CASE(NAME, name)
     GRN_TS_EXPR_TOKEN_CLOSE_CASE(OP, op)
     GRN_TS_EXPR_TOKEN_CLOSE_CASE(BRACKET, bracket)
+    GRN_TS_EXPR_TOKEN_CLOSE_CASE(BRIDGE, bridge)
   }
   GRN_FREE(token);
 }
@@ -4372,6 +4396,20 @@ grn_ts_expr_parser_tokenize_name(grn_ctx *ctx, grn_ts_expr_parser *parser,
   return grn_ts_expr_name_token_open(ctx, token_str, token);
 }
 
+/* grn_ts_expr_parser_tokenize_bridge() tokenizes a bridge. */
+static grn_rc
+grn_ts_expr_parser_tokenize_bridge(grn_ctx *ctx, grn_ts_expr_parser *parser,
+                                   grn_ts_str str, grn_ts_expr_token **token) {
+  grn_ts_str token_str = { str.ptr, 1 };
+  grn_ts_expr_bridge_token *new_token;
+  grn_rc rc = grn_ts_expr_bridge_token_open(ctx, token_str, &new_token);
+  if (rc != GRN_SUCCESS) {
+    return rc;
+  }
+  *token = new_token;
+  return GRN_SUCCESS;
+}
+
 /* grn_ts_expr_parser_tokenize_bracket() tokenizes a bracket. */
 static grn_rc
 grn_ts_expr_parser_tokenize_bracket(grn_ctx *ctx, grn_ts_expr_parser *parser,
@@ -4513,11 +4551,6 @@ grn_ts_expr_parser_tokenize_op(grn_ctx *ctx, grn_ts_expr_parser *parser,
     GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('/', DIVISION)
     GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('%', MODULUS)
 #undef GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE
-    case '.': {
-      // TODO: Dereferencing is not supported yet.
-      rc = GRN_INVALID_ARGUMENT;
-      break;
-    }
     default: {
       rc = GRN_INVALID_ARGUMENT;
       break;
@@ -4556,6 +4589,9 @@ grn_ts_expr_parser_tokenize_next(grn_ctx *ctx, grn_ts_expr_parser *parser,
     case '(': case ')': case '[': case ']': {
       return grn_ts_expr_parser_tokenize_bracket(ctx, parser, rest, token);
     }
+    case '.': {
+      return grn_ts_expr_parser_tokenize_bridge(ctx, parser, rest, token);
+    }
     default: {
       return grn_ts_expr_parser_tokenize_op(ctx, parser, rest, token);
     }
-------------- next part --------------
HTML����������������������������...
Download 



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