Skip to content

Commit

Permalink
Support prefix RK search by '&^~' with prefix_search_ops_v2
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Apr 7, 2016
1 parent 6903ceb commit fed2054
Show file tree
Hide file tree
Showing 11 changed files with 376 additions and 49 deletions.
23 changes: 23 additions & 0 deletions expected/prefix/text/prefix-rk/bitmapscan.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
CREATE TABLE readings (
katakana text
);
INSERT INTO readings VALUES ('ポストグレスキューエル');
INSERT INTO readings VALUES ('グルンガ');
INSERT INTO readings VALUES ('ピージールンガ');
INSERT INTO readings VALUES ('ピージーロジカル');
CREATE INDEX pgrn_index ON readings
USING pgroonga (katakana pgroonga.prefix_search_ops_v2);
SET enable_seqscan = off;
SET enable_indexscan = off;
SET enable_bitmapscan = on;
SELECT katakana
FROM readings
WHERE katakana &^~ 'p';
katakana
------------------------
ポストグレスキューエル
ピージールンガ
ピージーロジカル
(3 rows)

DROP TABLE readings;
23 changes: 23 additions & 0 deletions expected/prefix/text/prefix-rk/indexscan.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
CREATE TABLE readings (
katakana text
);
INSERT INTO readings VALUES ('ポストグレスキューエル');
INSERT INTO readings VALUES ('グルンガ');
INSERT INTO readings VALUES ('ピージールンガ');
INSERT INTO readings VALUES ('ピージーロジカル');
CREATE INDEX pgrn_index ON readings
USING pgroonga (katakana pgroonga.prefix_search_ops_v2);
SET enable_seqscan = off;
SET enable_indexscan = on;
SET enable_bitmapscan = off;
SELECT katakana
FROM readings
WHERE katakana &^~ 'p';
katakana
------------------------
ピージールンガ
ピージーロジカル
ポストグレスキューエル
(3 rows)

DROP TABLE readings;
21 changes: 21 additions & 0 deletions expected/prefix/text/prefix-rk/seqscan.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
CREATE TABLE readings (
katakana text
);
INSERT INTO readings VALUES ('ポストグレスキューエル');
INSERT INTO readings VALUES ('グルンガ');
INSERT INTO readings VALUES ('ピージールンガ');
INSERT INTO readings VALUES ('ピージーロジカル');
SET enable_seqscan = on;
SET enable_indexscan = off;
SET enable_bitmapscan = off;
SELECT katakana
FROM readings
WHERE katakana &^~ 'p';
katakana
------------------------
ポストグレスキューエル
ピージールンガ
ピージーロジカル
(3 rows)

DROP TABLE readings;
24 changes: 19 additions & 5 deletions pgroonga.sql
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ CREATE FUNCTION pgroonga.options(internal)
DELETE FROM pg_catalog.pg_am WHERE amname = 'pgroonga';
INSERT INTO pg_catalog.pg_am VALUES(
'pgroonga', -- amname
18, -- amstrategies
19, -- amstrategies
0, -- amsupport
true, -- amcanorder
true, -- amcanorderbyop
Expand Down Expand Up @@ -427,6 +427,19 @@ CREATE OPERATOR &^ (
RIGHTARG = text
);

CREATE FUNCTION pgroonga.prefix_rk_text(text, text)
RETURNS bool
AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_text'
LANGUAGE C
IMMUTABLE
STRICT;

CREATE OPERATOR &^~ (
PROCEDURE = pgroonga.prefix_rk_text,
LEFTARG = text,
RIGHTARG = text
);

CREATE FUNCTION pgroonga.script_text(text, text)
RETURNS bool
AS 'MODULE_PATHNAME', 'pgroonga_script_text'
Expand Down Expand Up @@ -473,10 +486,11 @@ CREATE OPERATOR CLASS pgroonga.text_full_text_search_ops_v2 FOR TYPE text
OPERATOR 12 &@,
OPERATOR 13 &?,
OPERATOR 14 &~?,
OPERATOR 16 &`,
OPERATOR 17 &@> (text, text[]),
OPERATOR 18 &?> (text, text[]);
OPERATOR 17 &`,
OPERATOR 18 &@> (text, text[]),
OPERATOR 19 &?> (text, text[]);

CREATE OPERATOR CLASS pgroonga.prefix_search_ops_v2 FOR TYPE text
USING pgroonga AS
OPERATOR 15 &^;
OPERATOR 15 &^,
OPERATOR 16 &^~;
21 changes: 21 additions & 0 deletions sql/prefix/text/prefix-rk/bitmapscan.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
CREATE TABLE readings (
katakana text
);

INSERT INTO readings VALUES ('ポストグレスキューエル');
INSERT INTO readings VALUES ('グルンガ');
INSERT INTO readings VALUES ('ピージールンガ');
INSERT INTO readings VALUES ('ピージーロジカル');

CREATE INDEX pgrn_index ON readings
USING pgroonga (katakana pgroonga.prefix_search_ops_v2);

SET enable_seqscan = off;
SET enable_indexscan = off;
SET enable_bitmapscan = on;

SELECT katakana
FROM readings
WHERE katakana &^~ 'p';

DROP TABLE readings;
21 changes: 21 additions & 0 deletions sql/prefix/text/prefix-rk/indexscan.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
CREATE TABLE readings (
katakana text
);

INSERT INTO readings VALUES ('ポストグレスキューエル');
INSERT INTO readings VALUES ('グルンガ');
INSERT INTO readings VALUES ('ピージールンガ');
INSERT INTO readings VALUES ('ピージーロジカル');

CREATE INDEX pgrn_index ON readings
USING pgroonga (katakana pgroonga.prefix_search_ops_v2);

SET enable_seqscan = off;
SET enable_indexscan = on;
SET enable_bitmapscan = off;

SELECT katakana
FROM readings
WHERE katakana &^~ 'p';

DROP TABLE readings;
18 changes: 18 additions & 0 deletions sql/prefix/text/prefix-rk/seqscan.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
CREATE TABLE readings (
katakana text
);

INSERT INTO readings VALUES ('ポストグレスキューエル');
INSERT INTO readings VALUES ('グルンガ');
INSERT INTO readings VALUES ('ピージールンガ');
INSERT INTO readings VALUES ('ピージーロジカル');

SET enable_seqscan = on;
SET enable_indexscan = off;
SET enable_bitmapscan = off;

SELECT katakana
FROM readings
WHERE katakana &^~ 'p';

DROP TABLE readings;
47 changes: 35 additions & 12 deletions src/pgrn_create.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,20 @@ void
PGrnCreateDataColumn(PGrnCreateData *data)
{
grn_obj_flags flags = 0;
grn_obj *range;
grn_id rangeID;

if (data->forPrefixSearch) {
char lexiconName[GRN_TABLE_MAX_KEY_SIZE];

snprintf(lexiconName, sizeof(lexiconName),
PGrnLexiconNameFormat, data->relNode, data->i);
range = PGrnLookup(lexiconName, ERROR);
rangeID = grn_obj_id(ctx, range);
} else {
rangeID = data->attributeTypeID;
range = grn_ctx_at(ctx, rangeID);
}

if (data->attributeFlags & GRN_OBJ_VECTOR)
{
Expand All @@ -47,7 +61,7 @@ PGrnCreateDataColumn(PGrnCreateData *data)

if (PGrnIsLZ4Available)
{
switch (data->attributeTypeID)
switch (rangeID)
{
case GRN_DB_SHORT_TEXT:
case GRN_DB_TEXT:
Expand All @@ -65,12 +79,12 @@ PGrnCreateDataColumn(PGrnCreateData *data)
PGrnCreateColumn(data->sourcesTable,
columnName,
flags,
grn_ctx_at(ctx, data->attributeTypeID));
range);
}
}

void
PGrnCreateIndexColumn(PGrnCreateData *data)
PGrnCreateLexicon(PGrnCreateData *data)
{
grn_id typeID = GRN_ID_NIL;
char lexiconName[GRN_TABLE_MAX_KEY_SIZE];
Expand Down Expand Up @@ -124,14 +138,23 @@ PGrnCreateIndexColumn(PGrnCreateData *data)
PGrnLookup(normalizerName, ERROR));
}
}
}

{
grn_obj_flags flags = GRN_OBJ_COLUMN_INDEX;
if (data->forFullTextSearch || data->forRegexpSearch)
flags |= GRN_OBJ_WITH_POSITION;
PGrnCreateColumn(lexicon,
PGrnIndexColumnName,
flags,
data->sourcesTable);
}
void
PGrnCreateIndexColumn(PGrnCreateData *data)
{
char lexiconName[GRN_TABLE_MAX_KEY_SIZE];
grn_obj *lexicon;
grn_obj_flags flags = GRN_OBJ_COLUMN_INDEX;

snprintf(lexiconName, sizeof(lexiconName),
PGrnLexiconNameFormat, data->relNode, data->i);
lexicon = PGrnLookup(lexiconName, ERROR);

if (data->forFullTextSearch || data->forRegexpSearch)
flags |= GRN_OBJ_WITH_POSITION;
PGrnCreateColumn(lexicon,
PGrnIndexColumnName,
flags,
data->sourcesTable);
}
1 change: 1 addition & 0 deletions src/pgrn_create.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ typedef struct PGrnCreateData

void PGrnCreateSourcesCtidColumn(PGrnCreateData *data);
void PGrnCreateSourcesTable(PGrnCreateData *data);
void PGrnCreateLexicon(PGrnCreateData *data);
void PGrnCreateDataColumn(PGrnCreateData *data);
void PGrnCreateIndexColumn(PGrnCreateData *data);
Loading

0 comments on commit fed2054

Please sign in to comment.