[Groonga-commit] groonga/groonga at 5f2a354 [master] grn_ts: reuse grn_ts_expr_parser

Back to archive index

susumu.yata null+****@clear*****
Wed Nov 25 14:37:55 JST 2015


susumu.yata	2015-11-25 14:37:55 +0900 (Wed, 25 Nov 2015)

  New Revision: 5f2a35478f4a8285cc3349823cff0342fe820c9a
  https://github.com/groonga/groonga/commit/5f2a35478f4a8285cc3349823cff0342fe820c9a

  Message:
    grn_ts: reuse grn_ts_expr_parser

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+16 -97)
===================================================================
--- lib/ts.c    2015-11-25 14:24:17 +0900 (c718eee)
+++ lib/ts.c    2015-11-25 14:37:55 +0900 (7bb8b21)
@@ -26,6 +26,7 @@
 #include "ts/ts_buf.h"
 #include "ts/ts_cursor.h"
 #include "ts/ts_expr.h"
+#include "ts/ts_expr_parser.h"
 #include "ts/ts_log.h"
 #include "ts/ts_str.h"
 #include "ts/ts_types.h"
@@ -168,6 +169,7 @@ grn_ts_geo_vector_output(grn_ctx *ctx, grn_ts_geo_vector value)
  */
 
 typedef struct {
+  grn_ts_expr_parser *parser;
   grn_ts_expr **exprs;
   size_t n_exprs;
   size_t max_n_exprs;
@@ -181,6 +183,7 @@ static void
 grn_ts_writer_init(grn_ctx *ctx, grn_ts_writer *writer)
 {
   memset(writer, 0, sizeof(*writer));
+  writer->parser = NULL;
   writer->exprs = NULL;
   GRN_TEXT_INIT(&writer->name_buf, GRN_OBJ_VECTOR);
   writer->names = NULL;
@@ -208,95 +211,9 @@ grn_ts_writer_fin(grn_ctx *ctx, grn_ts_writer *writer)
     }
     GRN_FREE(writer->exprs);
   }
-}
-
-/*
- * grn_ts_writer_tokenize() extracts the first expression string.
- * If the input is empty, this function returns GRN_END_OF_DATA.
- */
-static grn_rc
-grn_ts_writer_tokenize(grn_ctx *ctx, grn_ts_writer *writer,
-                       grn_ts_str in, grn_ts_str *token, grn_ts_str *rest)
-{
-  size_t i;
-  char stack_top;
-  grn_rc rc = GRN_SUCCESS;
-  grn_ts_str str = in;
-  grn_ts_buf stack;
-
-  /* Find a non-empty token. */
-  grn_ts_buf_init(ctx, &stack);
-  for ( ; ; ) {
-    str = grn_ts_str_trim_left(str);
-    if (!str.size) {
-      rc = GRN_END_OF_DATA;
-      break;
-    }
-    for (i = 0; i < str.size; i++) {
-      if (stack.pos) {
-        if (str.ptr[i] == stack_top) {
-          if (--stack.pos) {
-            stack_top = ((char *)stack.ptr)[stack.pos - 1];
-          }
-          continue;
-        }
-        if (stack_top == '"') {
-          /* Skip the next byte of an escape character. */
-          if ((str.ptr[i] == '\\') && (i < (str.size - 1))) {
-            i++;
-          }
-          continue;
-        }
-      } else if (str.ptr[i] == ',') {
-        break;
-      }
-      switch (str.ptr[i]) {
-        case '(': {
-          stack_top = ')';
-          rc = grn_ts_buf_write(ctx, &stack, &stack_top, 1);
-          break;
-        }
-        case '[': {
-          stack_top = ']';
-          rc = grn_ts_buf_write(ctx, &stack, &stack_top, 1);
-          break;
-        }
-        case '{': {
-          stack_top = '}';
-          rc = grn_ts_buf_write(ctx, &stack, &stack_top, 1);
-          break;
-        }
-        case '"': {
-          stack_top = '"';
-          rc = grn_ts_buf_write(ctx, &stack, &stack_top, 1);
-          break;
-        }
-      }
-      if (rc != GRN_SUCCESS) {
-        break;
-      }
-    }
-    if (rc != GRN_SUCCESS) {
-      break;
-    }
-    if (i) {
-      /* Output the result. */
-      token->ptr = str.ptr;
-      token->size = i;
-      if (token->size == str.size) {
-        rest->ptr = str.ptr + str.size;
-        rest->size = 0;
-      } else {
-        rest->ptr = str.ptr + token->size + 1;
-        rest->size = str.size - token->size - 1;
-      }
-      break;
-    }
-    str.ptr++;
-    str.size--;
+  if (writer->parser) {
+    grn_ts_expr_parser_close(ctx, writer->parser);
   }
-  grn_ts_buf_fin(ctx, &stack);
-  return rc;
 }
 
 /* grn_ts_writer_expand() expands a wildcard. */
@@ -354,19 +271,20 @@ grn_ts_writer_parse(grn_ctx *ctx, grn_ts_writer *writer,
 {
   grn_rc rc;
   grn_ts_str rest = str;
+  rc = grn_ts_expr_parser_open(ctx, table, &writer->parser);
   for ( ; ; ) {
-    grn_ts_str token = { NULL, 0 };
-    rc = grn_ts_writer_tokenize(ctx, writer, rest, &token, &rest);
+    grn_ts_str first = { NULL, 0 };
+    rc = grn_ts_expr_parser_split(ctx, writer->parser, rest, &first, &rest);
     if (rc != GRN_SUCCESS) {
       return (rc == GRN_END_OF_DATA) ? GRN_SUCCESS : rc;
     }
-    if ((token.ptr[token.size - 1] == '*') &&
-        grn_ts_str_is_name_prefix((grn_ts_str){ token.ptr, token.size - 1 })) {
-      rc = grn_ts_writer_expand(ctx, writer, table, token);
+    if ((first.ptr[first.size - 1] == '*') &&
+        grn_ts_str_is_name_prefix((grn_ts_str){ first.ptr, first.size - 1 })) {
+      rc = grn_ts_writer_expand(ctx, writer, table, first);
       if (rc != GRN_SUCCESS) {
         return rc;
       }
-    } else if (grn_ts_str_is_key_name(token) &&
+    } else if (grn_ts_str_is_key_name(first) &&
                !grn_ts_table_has_key(ctx, table)) {
       /*
        * Skip _key if the table has no _key, because the default output_columns
@@ -375,7 +293,7 @@ grn_ts_writer_parse(grn_ctx *ctx, grn_ts_writer *writer,
       GRN_TS_DEBUG("skip \"_key\" because the table has no _key");
     } else {
       rc = grn_vector_add_element(ctx, &writer->name_buf,
-                                  token.ptr, token.size, 0, GRN_DB_TEXT);
+                                  first.ptr, first.size, 0, GRN_DB_TEXT);
       if (rc != GRN_SUCCESS) {
         return rc;
       }
@@ -410,8 +328,9 @@ grn_ts_writer_build(grn_ctx *ctx, grn_ts_writer *writer, grn_obj *table)
     const char *name_ptr;
     size_t name_size = grn_vector_get_element(ctx, &writer->name_buf, i,
                                               &name_ptr, NULL, NULL);
-    rc = grn_ts_expr_parse(ctx, table, (grn_ts_str){ name_ptr, name_size },
-                           &new_expr);
+    rc = grn_ts_expr_parser_parse(ctx, writer->parser,
+                                  (grn_ts_str){ name_ptr, name_size },
+                                  &new_expr);
     if (rc != GRN_SUCCESS) {
       return rc;
     }
-------------- next part --------------
HTML����������������������������...
Download 



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