Navigation Menu

Skip to content

Commit

Permalink
Support seqscan match
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Jan 17, 2015
1 parent 5b28c73 commit 99324d1
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 10 deletions.
57 changes: 51 additions & 6 deletions pgroonga.c
Expand Up @@ -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);
}

/**
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions pgroonga.h
Expand Up @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions pgroonga_types.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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();
}

Expand Down

0 comments on commit 99324d1

Please sign in to comment.