[Groonga-commit] groonga/groonga at 0bc8767 [master] grn_ts: implement grn_ts_sorter_parse()

Back to archive index

susumu.yata null+****@clear*****
Wed Nov 25 16:57:32 JST 2015


susumu.yata	2015-11-25 16:57:32 +0900 (Wed, 25 Nov 2015)

  New Revision: 0bc876710bd6ccdf80664fc3d75496d330676574
  https://github.com/groonga/groonga/commit/0bc876710bd6ccdf80664fc3d75496d330676574

  Message:
    grn_ts: implement grn_ts_sorter_parse()

  Modified files:
    lib/ts/ts_sorter.c

  Modified: lib/ts/ts_sorter.c (+52 -3)
===================================================================
--- lib/ts/ts_sorter.c    2015-11-25 14:37:55 +0900 (bd3d14b)
+++ lib/ts/ts_sorter.c    2015-11-25 16:57:32 +0900 (eab2ffc)
@@ -20,6 +20,7 @@
 
 #include <string.h>
 
+#include "ts_expr_parser.h"
 #include "ts_log.h"
 #include "ts_util.h"
 
@@ -144,8 +145,56 @@ grn_ts_sorter_parse(grn_ctx *ctx, grn_obj *table,
                     grn_ts_str str, grn_ts_int offset,
                     grn_ts_int limit, grn_ts_sorter **sorter)
 {
-  // TODO
-  return GRN_FUNCTION_NOT_IMPLEMENTED;
+  grn_rc rc;
+  grn_ts_sorter *new_sorter = NULL;
+  grn_ts_expr_parser *parser;
+  if (!ctx) {
+    return GRN_INVALID_ARGUMENT;
+  }
+  if (!table || !grn_ts_obj_is_table(ctx, table) || !str.size || !sorter) {
+    GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument");
+  }
+  rc = grn_ts_expr_parser_open(ctx, table, &parser);
+  if (rc == GRN_SUCCESS) {
+    grn_ts_sorter_builder *builder;
+    rc = grn_ts_sorter_builder_open(ctx, table, &builder);
+    if (rc == GRN_SUCCESS) {
+      grn_ts_str first, rest = str;
+      for ( ; ; ) {
+        grn_ts_expr *expr;
+        grn_ts_bool reverse = GRN_FALSE;
+        rc = grn_ts_expr_parser_split(ctx, parser, rest, &first, &rest);
+        if (rc == GRN_END_OF_DATA) {
+          rc = grn_ts_sorter_builder_complete(ctx, builder, offset, limit,
+                                              &new_sorter);
+          break;
+        } else if (rc != GRN_SUCCESS) {
+          break;
+        }
+        if (first.ptr[0] == '-') {
+          reverse = GRN_TRUE;
+          first.ptr++;
+          first.size--;
+        }
+        rc = grn_ts_expr_parser_parse(ctx, parser, first, &expr);
+        if (rc != GRN_SUCCESS) {
+          break;
+        }
+        rc = grn_ts_sorter_builder_push(ctx, builder, expr, reverse);
+        if (rc != GRN_SUCCESS) {
+          grn_ts_expr_close(ctx, expr);
+          break;
+        }
+      }
+      grn_ts_sorter_builder_close(ctx, builder);
+    }
+    grn_ts_expr_parser_close(ctx, parser);
+  }
+  if (rc != GRN_SUCCESS) {
+    return rc;
+  }
+  *sorter = new_sorter;
+  return GRN_SUCCESS;
 }
 
 grn_rc
@@ -281,7 +330,7 @@ grn_ts_sorter_builder_push(grn_ctx *ctx, grn_ts_sorter_builder *builder,
   if (!ctx) {
     return GRN_INVALID_ARGUMENT;
   }
-  if (!builder || !expr) {
+  if (!builder || !expr || expr->table != builder->table) {
     GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument");
   }
   rc = grn_ts_sorter_node_open(ctx, expr, reverse, &new_node);
-------------- next part --------------
HTML����������������������������...
Download 



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