[Groonga-commit] pgroonga/pgroonga at 99324d1 [master] Support seqscan match

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Jan 18 00:04:40 JST 2015


Kouhei Sutou	2015-01-18 00:04:40 +0900 (Sun, 18 Jan 2015)

  New Revision: 99324d19da4ea53a0d67f449ea38152d1d7408f0
  https://github.com/pgroonga/pgroonga/commit/99324d19da4ea53a0d67f449ea38152d1d7408f0

  Message:
    Support seqscan match

  Modified files:
    pgroonga.c
    pgroonga.h
    pgroonga_types.c

  Modified: pgroonga.c (+51 -6)
===================================================================
--- pgroonga.c    2015-01-18 00:03:21 +0900 (059c466)
+++ pgroonga.c    2015-01-18 00:04:40 +0900 (801c01a)
@@ -413,15 +413,55 @@ GrnUnlock(Relation index, LOCKMODE mode)
 						 mode);
 }
 
+static grn_bool
+pgroonga_contains_raw(const char *text, unsigned int text_size,
+					  const char *key, unsigned int key_size)
+{
+	grn_bool contained = GRN_FALSE;
+	grn_obj buffer;
+	grn_obj *expression, *expressionVariable;
+
+	GRN_EXPR_CREATE_FOR_QUERY(ctx, NULL, expression, expressionVariable);
+
+	GRN_TEXT_INIT(&buffer, 0);
+
+	GRN_TEXT_SET(ctx, &buffer, text, text_size);
+	grn_expr_append_const(ctx, expression, &buffer, GRN_OP_PUSH, 1);
+
+	GRN_TEXT_SET(ctx, &buffer, key, key_size);
+	grn_expr_append_const(ctx, expression, &buffer, GRN_OP_PUSH, 1);
+
+	grn_expr_append_op(ctx, expression, GRN_OP_MATCH, 2);
+
+	{
+		grn_obj *result;
+		result = grn_expr_exec(ctx, expression, 0);
+		if (ctx->rc) {
+			goto exit;
+		}
+		contained = GRN_INT32_VALUE(result) != 0;
+	}
+
+exit:
+	grn_obj_unlink(ctx, expression);
+	GRN_OBJ_FIN(ctx, &buffer);
+
+	return contained;
+}
+
 /**
  * pgroonga.contains(doc text, key text) : bool
  */
 Datum
 pgroonga_contains_text(PG_FUNCTION_ARGS)
 {
-	ereport(ERROR,
-			(errmsg("groonga: 'text %%%% text' requires index.")));
-	PG_RETURN_BOOL(false);
+	text *doc = PG_GETARG_TEXT_PP(0);
+	text *key = PG_GETARG_TEXT_PP(1);
+	grn_bool contained;
+
+	contained = pgroonga_contains_raw(VARDATA_ANY(doc), VARSIZE_ANY_EXHDR(doc),
+									  VARDATA_ANY(key), VARSIZE_ANY_EXHDR(key));
+	PG_RETURN_BOOL(contained);
 }
 
 /**
@@ -430,9 +470,14 @@ pgroonga_contains_text(PG_FUNCTION_ARGS)
 Datum
 pgroonga_contains_bpchar(PG_FUNCTION_ARGS)
 {
-	ereport(ERROR,
-			(errmsg("groonga: 'bpchar %%%% bpchar' requires index.")));
-	PG_RETURN_BOOL(false);
+	BpChar *doc = PG_GETARG_BPCHAR_PP(0);
+	BpChar *key = PG_GETARG_BPCHAR_PP(1);
+	grn_bool contained;
+
+	contained =
+		pgroonga_contains_raw(VARDATA_ANY(doc), pgroonga_bpchar_size(doc),
+							  VARDATA_ANY(key), pgroonga_bpchar_size(key));
+	PG_RETURN_BOOL(contained);
 }
 
 static void

  Modified: pgroonga.h (+2 -0)
===================================================================
--- pgroonga.h    2015-01-18 00:03:21 +0900 (0f458e7)
+++ pgroonga.h    2015-01-18 00:04:40 +0900 (31039a7)
@@ -53,6 +53,8 @@ extern Datum PGDLLEXPORT pgroonga_costestimate(PG_FUNCTION_ARGS);
 extern Datum PGDLLEXPORT pgroonga_options(PG_FUNCTION_ARGS);
 
 /* in groonga_types.c */
+int pgroonga_bpchar_size(const BpChar *bpchar);
+
 extern Datum PGDLLEXPORT pgroonga_typeof(PG_FUNCTION_ARGS);
 extern Datum PGDLLEXPORT pgroonga_get_text(PG_FUNCTION_ARGS);
 extern Datum PGDLLEXPORT pgroonga_get_bpchar(PG_FUNCTION_ARGS);

  Modified: pgroonga_types.c (+4 -4)
===================================================================
--- pgroonga_types.c    2015-01-18 00:03:21 +0900 (f8a74f8)
+++ pgroonga_types.c    2015-01-18 00:04:40 +0900 (33affb0)
@@ -10,8 +10,8 @@
 
 #include <groonga.h>
 
-static int
-bpchar_size(const BpChar *arg)
+int
+pgroonga_bpchar_size(const BpChar *arg)
 {
 	char	   *s = VARDATA_ANY(arg);
 	int			i;
@@ -126,7 +126,7 @@ pgroonga_get_bpchar(PG_FUNCTION_ARGS)
 	grn_ctx	*ctx = (grn_ctx *)PG_GETARG_POINTER(1);
 	grn_obj *buffer = (grn_obj *)PG_GETARG_POINTER(2);
 
-	GRN_TEXT_PUT(ctx, buffer, VARDATA_ANY(var), bpchar_size(var));
+	GRN_TEXT_PUT(ctx, buffer, VARDATA_ANY(var), pgroonga_bpchar_size(var));
 
 	PG_RETURN_VOID();
 }
@@ -237,7 +237,7 @@ pgroonga_set_bpchar(PG_FUNCTION_ARGS)
 	grn_obj	   *obj = (grn_obj *) PG_GETARG_POINTER(1);
 	BpChar	   *var = PG_GETARG_BPCHAR_PP(2);
 
-	GRN_TEXT_SET(ctx, obj, VARDATA_ANY(var), bpchar_size(var));
+	GRN_TEXT_SET(ctx, obj, VARDATA_ANY(var), pgroonga_bpchar_size(var));
 	PG_RETURN_VOID();
 }
 
-------------- next part --------------
HTML����������������������������...
Download 



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