Kouhei Sutou
null+****@clear*****
Tue May 2 16:13:11 JST 2017
Kouhei Sutou 2017-05-02 16:13:11 +0900 (Tue, 02 May 2017) New Revision: 6025df813a12cf4b188f963d2507c83265ff785a https://github.com/pgroonga/pgroonga/commit/6025df813a12cf4b188f963d2507c83265ff785a Message: All term search operator classes have &^, &^~, &^> and &^~> &^> and &^~> API is changed. It's an incompatible change. &^> and &^~> accepts array of text instead of text as the second arguments. It's for consistency. Added files: expected/term-search/text/prefix-in/bitmapscan.out expected/term-search/text/prefix-in/indexscan.out expected/term-search/text/prefix-in/seqscan.out expected/term-search/text/prefix-rk-in/bitmapscan.out expected/term-search/text/prefix-rk-in/indexscan.out expected/term-search/text/prefix-rk-in/seqscan.out sql/term-search/text/prefix-in/bitmapscan.sql sql/term-search/text/prefix-in/indexscan.sql sql/term-search/text/prefix-in/seqscan.sql sql/term-search/text/prefix-rk-in/bitmapscan.sql sql/term-search/text/prefix-rk-in/indexscan.sql sql/term-search/text/prefix-rk-in/seqscan.sql Copied files: expected/term-search/text-array/prefix-in/bitmapscan.out (from expected/term-search/text-array/prefix/bitmapscan.out) expected/term-search/text-array/prefix-in/indexscan.out (from expected/term-search/text-array/prefix/indexscan.out) expected/term-search/text-array/prefix-in/seqscan.out (from expected/term-search/text-array/prefix/seqscan.out) expected/term-search/text-array/prefix-rk-in/bitmapscan.out (from expected/term-search/text-array/prefix-rk/bitmapscan.out) expected/term-search/text-array/prefix-rk-in/indexscan.out (from expected/term-search/text-array/prefix-rk/indexscan.out) expected/term-search/text-array/prefix-rk-in/seqscan.out (from expected/term-search/text-array/prefix-rk/seqscan.out) sql/term-search/text-array/prefix-in/bitmapscan.sql (from sql/term-search/text-array/prefix/bitmapscan.sql) sql/term-search/text-array/prefix-in/indexscan.sql (from sql/term-search/text-array/prefix/indexscan.sql) sql/term-search/text-array/prefix-in/seqscan.sql (from sql/term-search/text-array/prefix/seqscan.sql) sql/term-search/text-array/prefix-rk-in/bitmapscan.sql (from sql/term-search/text-array/prefix-rk/bitmapscan.sql) sql/term-search/text-array/prefix-rk-in/indexscan.sql (from sql/term-search/text-array/prefix-rk/indexscan.sql) sql/term-search/text-array/prefix-rk-in/seqscan.sql (from sql/term-search/text-array/prefix-rk/seqscan.sql) Removed files: expected/term-search/text-array/combined/indexscan.out sql/term-search/text-array/combined/indexscan.sql Modified files: data/pgroonga--1.2.0--1.2.1.sql data/pgroonga.sql expected/term-search/text-array/combined/bitmapscan.out expected/term-search/text-array/combined/seqscan.out expected/term-search/text-array/prefix-rk/bitmapscan.out expected/term-search/text-array/prefix-rk/indexscan.out expected/term-search/text-array/prefix-rk/seqscan.out expected/term-search/text-array/prefix/bitmapscan.out expected/term-search/text-array/prefix/indexscan.out expected/term-search/text-array/prefix/seqscan.out sql/term-search/text-array/combined/bitmapscan.sql sql/term-search/text-array/combined/seqscan.sql sql/term-search/text-array/prefix-rk/bitmapscan.sql sql/term-search/text-array/prefix-rk/indexscan.sql sql/term-search/text-array/prefix-rk/seqscan.sql sql/term-search/text-array/prefix/bitmapscan.sql sql/term-search/text-array/prefix/indexscan.sql sql/term-search/text-array/prefix/seqscan.sql src/pgroonga.c Modified: data/pgroonga--1.2.0--1.2.1.sql (+100 -42) =================================================================== --- data/pgroonga--1.2.0--1.2.1.sql 2017-05-02 15:23:22 +0900 (2f07bc5) +++ data/pgroonga--1.2.0--1.2.1.sql 2017-05-02 16:13:11 +0900 (1f65834) @@ -4,48 +4,6 @@ ALTER OPERATOR FAMILY pgroonga.text_full_text_search_ops_v2 USING pgroonga OPERATOR 8 %% (text, text), OPERATOR 9 @@ (text, text); --- Remove "_contain" from function names of &^> and &^~>. -DROP OPERATOR CLASS pgroonga.text_array_term_search_ops_v2 USING pgroonga; - -DROP OPERATOR &^> (text[], text); - -DROP FUNCTION pgroonga.prefix_contain_text_array(text[], text); - -CREATE FUNCTION pgroonga.prefix_text_array(text[], text) - RETURNS bool - AS 'MODULE_PATHNAME', 'pgroonga_prefix_text_array' - LANGUAGE C - IMMUTABLE - STRICT; - -CREATE OPERATOR &^> ( - PROCEDURE = pgroonga.prefix_text_array, - LEFTARG = text[], - RIGHTARG = text -); - -DROP OPERATOR &^~> (text[], text); - -DROP FUNCTION pgroonga.prefix_rk_contain_text_array(text[], text); - -CREATE FUNCTION pgroonga.prefix_rk_text_array(text[], text) - RETURNS bool - AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_text_array' - LANGUAGE C - IMMUTABLE - STRICT; - -CREATE OPERATOR &^~> ( - PROCEDURE = pgroonga.prefix_rk_text_array, - LEFTARG = text[], - RIGHTARG = text -); - -CREATE OPERATOR CLASS pgroonga.text_array_term_search_ops_v2 FOR TYPE text[] - USING pgroonga AS - OPERATOR 20 &^> (text[], text), - OPERATOR 21 &^~> (text[], text); - -- Add pgroonga.text_array_full_text_search_ops_v2 CREATE FUNCTION pgroonga.match_text_array(text[], text) RETURNS bool @@ -233,3 +191,103 @@ ALTER OPERATOR FAMILY pgroonga.varchar_full_text_search_ops USING pgroonga ADD OPERATOR 12 &@ (varchar, varchar), OPERATOR 13 &? (varchar, varchar); + +-- Add &^> and &^~> to pgroonga.text_term_search_ops_v2. +-- Add &^ and &^~ to pgroonga.text_array_term_search_ops_v2. +-- &^> and &^~> signatures are changed to +-- (text[], text[]) and (text, text[]) from (text[], text). +DROP OPERATOR CLASS pgroonga.text_array_term_search_ops_v2 USING pgroonga; +DROP OPERATOR &^> (text[], text); +DROP OPERATOR &^~> (text[], text); +DROP FUNCTION pgroonga.prefix_contain_text_array(text[], text); +DROP FUNCTION pgroonga.prefix_rk_contain_text_array(text[], text); + +CREATE FUNCTION pgroonga.prefix_text_array(text[], text) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^ ( + PROCEDURE = pgroonga.prefix_text_array, + LEFTARG = text[], + RIGHTARG = text +); + +CREATE FUNCTION pgroonga.prefix_rk_text_array(text[], text) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^~ ( + PROCEDURE = pgroonga.prefix_rk_text_array, + LEFTARG = text[], + RIGHTARG = text +); + +CREATE FUNCTION pgroonga.prefix_in_text(text, text[]) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_in_text' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^> ( + PROCEDURE = pgroonga.prefix_in_text, + LEFTARG = text, + RIGHTARG = text[] +); + +CREATE FUNCTION pgroonga.prefix_in_text_array(text[], text[]) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_in_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^> ( + PROCEDURE = pgroonga.prefix_in_text_array, + LEFTARG = text[], + RIGHTARG = text[] +); + +CREATE FUNCTION pgroonga.prefix_rk_in_text(text, text[]) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_in_text' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^~> ( + PROCEDURE = pgroonga.prefix_rk_in_text, + LEFTARG = text, + RIGHTARG = text[] +); + +CREATE FUNCTION pgroonga.prefix_rk_in_text_array(text[], text[]) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_in_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^~> ( + PROCEDURE = pgroonga.prefix_rk_in_text_array, + LEFTARG = text[], + RIGHTARG = text[] +); + +ALTER OPERATOR FAMILY pgroonga.text_term_search_ops_v2 USING pgroonga + ADD + OPERATOR 20 &^> (text, text[]), + OPERATOR 21 &^~> (text, text[]); + +CREATE OPERATOR CLASS pgroonga.text_array_term_search_ops_v2 FOR TYPE text[] + USING pgroonga AS + OPERATOR 16 &^ (text[], text), + OPERATOR 17 &^~ (text[], text), + OPERATOR 20 &^> (text[], text[]), + OPERATOR 21 &^~> (text[], text[]); Modified: data/pgroonga.sql (+67 -11) =================================================================== --- data/pgroonga.sql 2017-05-02 15:23:22 +0900 (a57f275) +++ data/pgroonga.sql 2017-05-02 16:13:11 +0900 (e6a7746) @@ -409,6 +409,19 @@ CREATE OPERATOR &^ ( RIGHTARG = text ); +CREATE FUNCTION pgroonga.prefix_text_array(text[], text) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^ ( + PROCEDURE = pgroonga.prefix_text_array, + LEFTARG = text[], + RIGHTARG = text +); + CREATE FUNCTION pgroonga.prefix_rk_text(text, text) RETURNS bool AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_text' @@ -422,6 +435,19 @@ CREATE OPERATOR &^~ ( RIGHTARG = text ); +CREATE FUNCTION pgroonga.prefix_rk_text_array(text[], text) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^~ ( + PROCEDURE = pgroonga.prefix_rk_text_array, + LEFTARG = text[], + RIGHTARG = text +); + CREATE FUNCTION pgroonga.script_text(text, text) RETURNS bool AS 'MODULE_PATHNAME', 'pgroonga_script_text' @@ -539,30 +565,56 @@ CREATE OPERATOR &?> ( RIGHTARG = varchar[] ); -CREATE FUNCTION pgroonga.prefix_text_array(text[], text) +CREATE FUNCTION pgroonga.prefix_in_text(text, text[]) RETURNS bool - AS 'MODULE_PATHNAME', 'pgroonga_prefix_text_array' + AS 'MODULE_PATHNAME', 'pgroonga_prefix_in_text' LANGUAGE C IMMUTABLE STRICT; CREATE OPERATOR &^> ( - PROCEDURE = pgroonga.prefix_text_array, + PROCEDURE = pgroonga.prefix_in_text, + LEFTARG = text, + RIGHTARG = text[] +); + +CREATE FUNCTION pgroonga.prefix_in_text_array(text[], text[]) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_in_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^> ( + PROCEDURE = pgroonga.prefix_in_text_array, LEFTARG = text[], - RIGHTARG = text + RIGHTARG = text[] ); -CREATE FUNCTION pgroonga.prefix_rk_text_array(text[], text) +CREATE FUNCTION pgroonga.prefix_rk_in_text(text, text[]) RETURNS bool - AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_text_array' + AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_in_text' LANGUAGE C IMMUTABLE STRICT; CREATE OPERATOR &^~> ( - PROCEDURE = pgroonga.prefix_rk_text_array, + PROCEDURE = pgroonga.prefix_rk_in_text, + LEFTARG = text, + RIGHTARG = text[] +); + +CREATE FUNCTION pgroonga.prefix_rk_in_text_array(text[], text[]) + RETURNS bool + AS 'MODULE_PATHNAME', 'pgroonga_prefix_rk_in_text_array' + LANGUAGE C + IMMUTABLE + STRICT; + +CREATE OPERATOR &^~> ( + PROCEDURE = pgroonga.prefix_rk_in_text_array, LEFTARG = text[], - RIGHTARG = text + RIGHTARG = text[] ); @@ -852,9 +904,13 @@ CREATE OPERATOR CLASS pgroonga.varchar_full_text_search_ops_v2 CREATE OPERATOR CLASS pgroonga.text_term_search_ops_v2 FOR TYPE text USING pgroonga AS OPERATOR 16 &^, - OPERATOR 17 &^~; + OPERATOR 17 &^~, + OPERATOR 20 &^> (text, text[]), + OPERATOR 21 &^~> (text, text[]); CREATE OPERATOR CLASS pgroonga.text_array_term_search_ops_v2 FOR TYPE text[] USING pgroonga AS - OPERATOR 20 &^> (text[], text), - OPERATOR 21 &^~> (text[], text); + OPERATOR 16 &^ (text[], text), + OPERATOR 17 &^~ (text[], text), + OPERATOR 20 &^> (text[], text[]), + OPERATOR 21 &^~> (text[], text[]); Modified: expected/term-search/text-array/combined/bitmapscan.out (+18 -2) =================================================================== --- expected/term-search/text-array/combined/bitmapscan.out 2017-05-02 15:23:22 +0900 (67efa5e) +++ expected/term-search/text-array/combined/bitmapscan.out 2017-05-02 16:13:11 +0900 (ba1331e) @@ -19,10 +19,26 @@ CREATE INDEX pgrn_tags_index ON tags SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT names, pgroonga.score(tags) FROM tags - WHERE names &^> 'Groon' OR - readings &^~> 'posu'; + WHERE names &^ 'Groon' OR + readings &^~ 'posu'; + QUERY PLAN +--------------------------------------------------------------------------- + Bitmap Heap Scan on tags + Recheck Cond: ((names &^ 'Groon'::text) OR (readings &^~ 'posu'::text)) + -> BitmapOr + -> Bitmap Index Scan on pgrn_tags_index + Index Cond: (names &^ 'Groon'::text) + -> Bitmap Index Scan on pgrn_tags_index + Index Cond: (readings &^~ 'posu'::text) +(7 rows) + +SELECT names, pgroonga.score(tags) + FROM tags + WHERE names &^ 'Groon' OR + readings &^~ 'posu'; names | score -----------------+------- {PostgreSQL,PG} | 2 Deleted: expected/term-search/text-array/combined/indexscan.out (+0 -32) 100644 =================================================================== --- expected/term-search/text-array/combined/indexscan.out 2017-05-02 15:23:22 +0900 (258ab10) +++ /dev/null @@ -1,32 +0,0 @@ -CREATE TABLE tags ( - id int PRIMARY KEY, - names text[], - readings text[] -); -INSERT INTO tags VALUES (1, - ARRAY['PostgreSQL', 'PG'], - ARRAY['ポストグレスキューエル', 'ポスグレ']); -INSERT INTO tags VALUES (2, - ARRAY['Groonga', 'grn'], - ARRAY['グルンガ', 'グルン']); -INSERT INTO tags VALUES (3, - ARRAY['PGroonga', 'pgrn'], - ARRAY['ピージールンガ', 'ピーグルン']); -CREATE INDEX pgrn_tags_index ON tags - USING pgroonga (id, - names pgroonga.text_array_term_search_ops_v2, - readings pgroonga.text_array_term_search_ops_v2); -SET enable_seqscan = off; -SET enable_indexscan = on; -SET enable_bitmapscan = off; -SELECT names, pgroonga.score(tags) - FROM tags - WHERE names &^> 'Groon' OR - readings &^~> 'posu'; - names | score ------------------+------- - {PostgreSQL,PG} | 0 - {Groonga,grn} | 0 -(2 rows) - -DROP TABLE tags; Modified: expected/term-search/text-array/combined/seqscan.out (+2 -2) =================================================================== --- expected/term-search/text-array/combined/seqscan.out 2017-05-02 15:23:22 +0900 (a282ad6) +++ expected/term-search/text-array/combined/seqscan.out 2017-05-02 16:13:11 +0900 (2745f9a) @@ -17,8 +17,8 @@ SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT names, pgroonga.score(tags) FROM tags - WHERE names &^> 'Groon' OR - readings &^~> 'posu'; + WHERE names &^ 'Groon' OR + readings &^~ 'posu'; names | score -----------------+------- {PostgreSQL,PG} | 0 Copied: expected/term-search/text-array/prefix-in/bitmapscan.out (+14 -2) 53% =================================================================== --- expected/term-search/text-array/prefix/bitmapscan.out 2017-05-02 15:23:22 +0900 (a284426) +++ expected/term-search/text-array/prefix-in/bitmapscan.out 2017-05-02 16:13:11 +0900 (e15c5a7) @@ -9,13 +9,25 @@ CREATE INDEX pgrn_index ON tags SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^> ARRAY['gro', 'pos']; + QUERY PLAN +----------------------------------------------------- + Bitmap Heap Scan on tags + Recheck Cond: (names &^> '{gro,pos}'::text[]) + -> Bitmap Index Scan on pgrn_index + Index Cond: (names &^> '{gro,pos}'::text[]) +(4 rows) + +SELECT names + FROM tags + WHERE names &^> ARRAY['gro', 'pos']; names ----------------- {PostgreSQL,PG} - {PGroonga,pgrn} + {Groonga,grn} (2 rows) DROP TABLE tags; Copied: expected/term-search/text-array/prefix-in/indexscan.out (+12 -2) 59% =================================================================== --- expected/term-search/text-array/prefix/indexscan.out 2017-05-02 15:23:22 +0900 (2ce7f75) +++ expected/term-search/text-array/prefix-in/indexscan.out 2017-05-02 16:13:11 +0900 (27db30e) @@ -9,12 +9,22 @@ CREATE INDEX pgrn_index ON tags SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^> ARRAY['gro', 'pos']; + QUERY PLAN +----------------------------------------------- + Index Scan using pgrn_index on tags + Index Cond: (names &^> '{gro,pos}'::text[]) +(2 rows) + +SELECT names + FROM tags + WHERE names &^> ARRAY['gro', 'pos']; names ----------------- - {PGroonga,pgrn} + {Groonga,grn} {PostgreSQL,PG} (2 rows) Copied: expected/term-search/text-array/prefix-in/seqscan.out (+2 -2) 87% =================================================================== --- expected/term-search/text-array/prefix/seqscan.out 2017-05-02 15:23:22 +0900 (aedd8f9) +++ expected/term-search/text-array/prefix-in/seqscan.out 2017-05-02 16:13:11 +0900 (b1251ce) @@ -9,11 +9,11 @@ SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^> ARRAY['gro', 'pos']; names ----------------- {PostgreSQL,PG} - {PGroonga,pgrn} + {Groonga,grn} (2 rows) DROP TABLE tags; Copied: expected/term-search/text-array/prefix-rk-in/bitmapscan.out (+14 -2) 58% =================================================================== --- expected/term-search/text-array/prefix-rk/bitmapscan.out 2017-05-02 15:23:22 +0900 (9221a74) +++ expected/term-search/text-array/prefix-rk-in/bitmapscan.out 2017-05-02 16:13:11 +0900 (58304a5) @@ -9,13 +9,25 @@ CREATE INDEX pgrn_index ON readings SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~> ARRAY['po', 'gu']; + QUERY PLAN +-------------------------------------------------------- + Bitmap Heap Scan on readings + Recheck Cond: (katakanas &^~> '{po,gu}'::text[]) + -> Bitmap Index Scan on pgrn_index + Index Cond: (katakanas &^~> '{po,gu}'::text[]) +(4 rows) + +SELECT katakanas + FROM readings + WHERE katakanas &^~> ARRAY['po', 'gu']; katakanas ----------------------------------- {ポストグレスキューエル,ポスグレ} - {ピージールンガ,ピーグルン} + {グルンガ,グルン} (2 rows) DROP TABLE readings; Copied: expected/term-search/text-array/prefix-rk-in/indexscan.out (+12 -2) 64% =================================================================== --- expected/term-search/text-array/prefix-rk/indexscan.out 2017-05-02 15:23:22 +0900 (c02cc3d) +++ expected/term-search/text-array/prefix-rk-in/indexscan.out 2017-05-02 16:13:11 +0900 (68b2691) @@ -9,13 +9,23 @@ CREATE INDEX pgrn_index ON readings SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~> ARRAY['po', 'gu']; + QUERY PLAN +-------------------------------------------------- + Index Scan using pgrn_index on readings + Index Cond: (katakanas &^~> '{po,gu}'::text[]) +(2 rows) + +SELECT katakanas + FROM readings + WHERE katakanas &^~> ARRAY['po', 'gu']; katakanas ----------------------------------- - {ピージールンガ,ピーグルン} {ポストグレスキューエル,ポスグレ} + {グルンガ,グルン} (2 rows) DROP TABLE readings; Copied: expected/term-search/text-array/prefix-rk-in/seqscan.out (+2 -2) 89% =================================================================== --- expected/term-search/text-array/prefix-rk/seqscan.out 2017-05-02 15:23:22 +0900 (2e39994) +++ expected/term-search/text-array/prefix-rk-in/seqscan.out 2017-05-02 16:13:11 +0900 (1f8cd6c) @@ -9,11 +9,11 @@ SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~> ARRAY['po', 'gu']; katakanas ----------------------------------- {ポストグレスキューエル,ポスグレ} - {ピージールンガ,ピーグルン} + {グルンガ,グルン} (2 rows) DROP TABLE readings; Modified: expected/term-search/text-array/prefix-rk/bitmapscan.out (+13 -1) =================================================================== --- expected/term-search/text-array/prefix-rk/bitmapscan.out 2017-05-02 15:23:22 +0900 (9221a74) +++ expected/term-search/text-array/prefix-rk/bitmapscan.out 2017-05-02 16:13:11 +0900 (e2ea6ee) @@ -9,9 +9,21 @@ CREATE INDEX pgrn_index ON readings SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~ 'p'; + QUERY PLAN +----------------------------------------------- + Bitmap Heap Scan on readings + Recheck Cond: (katakanas &^~ 'p'::text) + -> Bitmap Index Scan on pgrn_index + Index Cond: (katakanas &^~ 'p'::text) +(4 rows) + +SELECT katakanas + FROM readings + WHERE katakanas &^~ 'p'; katakanas ----------------------------------- {ポストグレスキューエル,ポスグレ} Modified: expected/term-search/text-array/prefix-rk/indexscan.out (+11 -1) =================================================================== --- expected/term-search/text-array/prefix-rk/indexscan.out 2017-05-02 15:23:22 +0900 (c02cc3d) +++ expected/term-search/text-array/prefix-rk/indexscan.out 2017-05-02 16:13:11 +0900 (c3733a3) @@ -9,9 +9,19 @@ CREATE INDEX pgrn_index ON readings SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~ 'p'; + QUERY PLAN +----------------------------------------- + Index Scan using pgrn_index on readings + Index Cond: (katakanas &^~ 'p'::text) +(2 rows) + +SELECT katakanas + FROM readings + WHERE katakanas &^~ 'p'; katakanas ----------------------------------- {ピージールンガ,ピーグルン} Modified: expected/term-search/text-array/prefix-rk/seqscan.out (+1 -1) =================================================================== --- expected/term-search/text-array/prefix-rk/seqscan.out 2017-05-02 15:23:22 +0900 (2e39994) +++ expected/term-search/text-array/prefix-rk/seqscan.out 2017-05-02 16:13:11 +0900 (b0fe3e0) @@ -9,7 +9,7 @@ SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~ 'p'; katakanas ----------------------------------- {ポストグレスキューエル,ポスグレ} Modified: expected/term-search/text-array/prefix/bitmapscan.out (+13 -1) =================================================================== --- expected/term-search/text-array/prefix/bitmapscan.out 2017-05-02 15:23:22 +0900 (a284426) +++ expected/term-search/text-array/prefix/bitmapscan.out 2017-05-02 16:13:11 +0900 (37f91b7) @@ -9,9 +9,21 @@ CREATE INDEX pgrn_index ON tags SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^ 'pG'; + QUERY PLAN +------------------------------------------- + Bitmap Heap Scan on tags + Recheck Cond: (names &^ 'pG'::text) + -> Bitmap Index Scan on pgrn_index + Index Cond: (names &^ 'pG'::text) +(4 rows) + +SELECT names + FROM tags + WHERE names &^ 'pG'; names ----------------- {PostgreSQL,PG} Modified: expected/term-search/text-array/prefix/indexscan.out (+11 -1) =================================================================== --- expected/term-search/text-array/prefix/indexscan.out 2017-05-02 15:23:22 +0900 (2ce7f75) +++ expected/term-search/text-array/prefix/indexscan.out 2017-05-02 16:13:11 +0900 (a3d37a3) @@ -9,9 +9,19 @@ CREATE INDEX pgrn_index ON tags SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^ 'pG'; + QUERY PLAN +------------------------------------- + Index Scan using pgrn_index on tags + Index Cond: (names &^ 'pG'::text) +(2 rows) + +SELECT names + FROM tags + WHERE names &^ 'pG'; names ----------------- {PGroonga,pgrn} Modified: expected/term-search/text-array/prefix/seqscan.out (+1 -1) =================================================================== --- expected/term-search/text-array/prefix/seqscan.out 2017-05-02 15:23:22 +0900 (aedd8f9) +++ expected/term-search/text-array/prefix/seqscan.out 2017-05-02 16:13:11 +0900 (d927967) @@ -9,7 +9,7 @@ SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^ 'pG'; names ----------------- {PostgreSQL,PG} Added: expected/term-search/text/prefix-in/bitmapscan.out (+34 -0) 100644 =================================================================== --- /dev/null +++ expected/term-search/text/prefix-in/bitmapscan.out 2017-05-02 16:13:11 +0900 (22a2f16) @@ -0,0 +1,34 @@ +CREATE TABLE tags ( + name text +); +INSERT INTO tags VALUES ('PostgreSQL'); +INSERT INTO tags VALUES ('Groonga'); +INSERT INTO tags VALUES ('PGroonga'); +INSERT INTO tags VALUES ('pglogical'); +CREATE INDEX pgrn_index ON tags + USING pgroonga (name pgroonga.text_term_search_ops_v2); +SET enable_seqscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + QUERY PLAN +---------------------------------------------------- + Bitmap Heap Scan on tags + Recheck Cond: (name &^> '{gro,pos}'::text[]) + -> Bitmap Index Scan on pgrn_index + Index Cond: (name &^> '{gro,pos}'::text[]) +(4 rows) + +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + name +------------ + PostgreSQL + Groonga +(2 rows) + +DROP TABLE tags; Added: expected/term-search/text/prefix-in/indexscan.out (+32 -0) 100644 =================================================================== --- /dev/null +++ expected/term-search/text/prefix-in/indexscan.out 2017-05-02 16:13:11 +0900 (0ec1f6b) @@ -0,0 +1,32 @@ +CREATE TABLE tags ( + name text +); +INSERT INTO tags VALUES ('PostgreSQL'); +INSERT INTO tags VALUES ('Groonga'); +INSERT INTO tags VALUES ('PGroonga'); +INSERT INTO tags VALUES ('pglogical'); +CREATE INDEX pgrn_index ON tags + USING pgroonga (name pgroonga.text_term_search_ops_v2); +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + QUERY PLAN +---------------------------------------------- + Index Scan using pgrn_index on tags + Index Cond: (name &^> '{gro,pos}'::text[]) +(2 rows) + +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + name +------------ + Groonga + PostgreSQL +(2 rows) + +DROP TABLE tags; Added: expected/term-search/text/prefix-in/seqscan.out (+20 -0) 100644 =================================================================== --- /dev/null +++ expected/term-search/text/prefix-in/seqscan.out 2017-05-02 16:13:11 +0900 (c444b50) @@ -0,0 +1,20 @@ +CREATE TABLE tags ( + name text +); +INSERT INTO tags VALUES ('PostgreSQL'); +INSERT INTO tags VALUES ('Groonga'); +INSERT INTO tags VALUES ('PGroonga'); +INSERT INTO tags VALUES ('pglogical'); +SET enable_seqscan = on; +SET enable_indexscan = off; +SET enable_bitmapscan = off; +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + name +------------ + PostgreSQL + Groonga +(2 rows) + +DROP TABLE tags; Added: expected/term-search/text/prefix-rk-in/bitmapscan.out (+34 -0) 100644 =================================================================== --- /dev/null +++ expected/term-search/text/prefix-rk-in/bitmapscan.out 2017-05-02 16:13:11 +0900 (728ad3b) @@ -0,0 +1,34 @@ +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.text_term_search_ops_v2); +SET enable_seqscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + QUERY PLAN +------------------------------------------------------- + Bitmap Heap Scan on readings + Recheck Cond: (katakana &^~> '{po,gu}'::text[]) + -> Bitmap Index Scan on pgrn_index + Index Cond: (katakana &^~> '{po,gu}'::text[]) +(4 rows) + +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + katakana +------------------------ + ポストグレスキューエル + グルンガ +(2 rows) + +DROP TABLE readings; Added: expected/term-search/text/prefix-rk-in/indexscan.out (+32 -0) 100644 =================================================================== --- /dev/null +++ expected/term-search/text/prefix-rk-in/indexscan.out 2017-05-02 16:13:11 +0900 (b9e848b) @@ -0,0 +1,32 @@ +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.text_term_search_ops_v2); +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + QUERY PLAN +------------------------------------------------- + Index Scan using pgrn_index on readings + Index Cond: (katakana &^~> '{po,gu}'::text[]) +(2 rows) + +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + katakana +------------------------ + ポストグレスキューエル + グルンガ +(2 rows) + +DROP TABLE readings; Added: expected/term-search/text/prefix-rk-in/seqscan.out (+20 -0) 100644 =================================================================== --- /dev/null +++ expected/term-search/text/prefix-rk-in/seqscan.out 2017-05-02 16:13:11 +0900 (1c8a271) @@ -0,0 +1,20 @@ +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 &^~> ARRAY['po', 'gu']; + katakana +------------------------ + ポストグレスキューエル + グルンガ +(2 rows) + +DROP TABLE readings; Modified: sql/term-search/text-array/combined/bitmapscan.sql (+8 -2) =================================================================== --- sql/term-search/text-array/combined/bitmapscan.sql 2017-05-02 15:23:22 +0900 (5e76b0d) +++ sql/term-search/text-array/combined/bitmapscan.sql 2017-05-02 16:13:11 +0900 (dd396b0) @@ -23,9 +23,15 @@ SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT names, pgroonga.score(tags) FROM tags - WHERE names &^> 'Groon' OR - readings &^~> 'posu'; + WHERE names &^ 'Groon' OR + readings &^~ 'posu'; + +SELECT names, pgroonga.score(tags) + FROM tags + WHERE names &^ 'Groon' OR + readings &^~ 'posu'; DROP TABLE tags; Deleted: sql/term-search/text-array/combined/indexscan.sql (+0 -31) 100644 =================================================================== --- sql/term-search/text-array/combined/indexscan.sql 2017-05-02 15:23:22 +0900 (bd91b82) +++ /dev/null @@ -1,31 +0,0 @@ -CREATE TABLE tags ( - id int PRIMARY KEY, - names text[], - readings text[] -); - -INSERT INTO tags VALUES (1, - ARRAY['PostgreSQL', 'PG'], - ARRAY['ポストグレスキューエル', 'ポスグレ']); -INSERT INTO tags VALUES (2, - ARRAY['Groonga', 'grn'], - ARRAY['グルンガ', 'グルン']); -INSERT INTO tags VALUES (3, - ARRAY['PGroonga', 'pgrn'], - ARRAY['ピージールンガ', 'ピーグルン']); - -CREATE INDEX pgrn_tags_index ON tags - USING pgroonga (id, - names pgroonga.text_array_term_search_ops_v2, - readings pgroonga.text_array_term_search_ops_v2); - -SET enable_seqscan = off; -SET enable_indexscan = on; -SET enable_bitmapscan = off; - -SELECT names, pgroonga.score(tags) - FROM tags - WHERE names &^> 'Groon' OR - readings &^~> 'posu'; - -DROP TABLE tags; Modified: sql/term-search/text-array/combined/seqscan.sql (+2 -2) =================================================================== --- sql/term-search/text-array/combined/seqscan.sql 2017-05-02 15:23:22 +0900 (98639f3) +++ sql/term-search/text-array/combined/seqscan.sql 2017-05-02 16:13:11 +0900 (537d7c7) @@ -20,7 +20,7 @@ SET enable_bitmapscan = off; SELECT names, pgroonga.score(tags) FROM tags - WHERE names &^> 'Groon' OR - readings &^~> 'posu'; + WHERE names &^ 'Groon' OR + readings &^~ 'posu'; DROP TABLE tags; Copied: sql/term-search/text-array/prefix-in/bitmapscan.sql (+6 -1) 77% =================================================================== --- sql/term-search/text-array/prefix/bitmapscan.sql 2017-05-02 15:23:22 +0900 (e4c5a2a) +++ sql/term-search/text-array/prefix-in/bitmapscan.sql 2017-05-02 16:13:11 +0900 (d5ba243) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^> ARRAY['gro', 'pos']; + +SELECT names + FROM tags + WHERE names &^> ARRAY['gro', 'pos']; DROP TABLE tags; Copied: sql/term-search/text-array/prefix-in/indexscan.sql (+6 -1) 77% =================================================================== --- sql/term-search/text-array/prefix/indexscan.sql 2017-05-02 15:23:22 +0900 (f3a079d) +++ sql/term-search/text-array/prefix-in/indexscan.sql 2017-05-02 16:13:11 +0900 (7caf6b7) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^> ARRAY['gro', 'pos']; + +SELECT names + FROM tags + WHERE names &^> ARRAY['gro', 'pos']; DROP TABLE tags; Copied: sql/term-search/text-array/prefix-in/seqscan.sql (+1 -1) 89% =================================================================== --- sql/term-search/text-array/prefix/seqscan.sql 2017-05-02 15:23:22 +0900 (520d495) +++ sql/term-search/text-array/prefix-in/seqscan.sql 2017-05-02 16:13:11 +0900 (908adb6) @@ -12,6 +12,6 @@ SET enable_bitmapscan = off; SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^> ARRAY['gro', 'pos']; DROP TABLE tags; Copied: sql/term-search/text-array/prefix-rk-in/bitmapscan.sql (+6 -1) 79% =================================================================== --- sql/term-search/text-array/prefix-rk/bitmapscan.sql 2017-05-02 15:23:22 +0900 (f2c157c) +++ sql/term-search/text-array/prefix-rk-in/bitmapscan.sql 2017-05-02 16:13:11 +0900 (5a4b4ef) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~> ARRAY['po', 'gu']; + +SELECT katakanas + FROM readings + WHERE katakanas &^~> ARRAY['po', 'gu']; DROP TABLE readings; Copied: sql/term-search/text-array/prefix-rk-in/indexscan.sql (+6 -1) 79% =================================================================== --- sql/term-search/text-array/prefix-rk/indexscan.sql 2017-05-02 15:23:22 +0900 (af5b5ee) +++ sql/term-search/text-array/prefix-rk-in/indexscan.sql 2017-05-02 16:13:11 +0900 (eaa292d) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~> ARRAY['po', 'gu']; + +SELECT katakanas + FROM readings + WHERE katakanas &^~> ARRAY['po', 'gu']; DROP TABLE readings; Copied: sql/term-search/text-array/prefix-rk-in/seqscan.sql (+1 -1) 91% =================================================================== --- sql/term-search/text-array/prefix-rk/seqscan.sql 2017-05-02 15:23:22 +0900 (c16b755) +++ sql/term-search/text-array/prefix-rk-in/seqscan.sql 2017-05-02 16:13:11 +0900 (8d3aec4) @@ -12,6 +12,6 @@ SET enable_bitmapscan = off; SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~> ARRAY['po', 'gu']; DROP TABLE readings; Modified: sql/term-search/text-array/prefix-rk/bitmapscan.sql (+6 -1) =================================================================== --- sql/term-search/text-array/prefix-rk/bitmapscan.sql 2017-05-02 15:23:22 +0900 (f2c157c) +++ sql/term-search/text-array/prefix-rk/bitmapscan.sql 2017-05-02 16:13:11 +0900 (358c47f) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~ 'p'; + +SELECT katakanas + FROM readings + WHERE katakanas &^~ 'p'; DROP TABLE readings; Modified: sql/term-search/text-array/prefix-rk/indexscan.sql (+6 -1) =================================================================== --- sql/term-search/text-array/prefix-rk/indexscan.sql 2017-05-02 15:23:22 +0900 (af5b5ee) +++ sql/term-search/text-array/prefix-rk/indexscan.sql 2017-05-02 16:13:11 +0900 (2efabad) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~ 'p'; + +SELECT katakanas + FROM readings + WHERE katakanas &^~ 'p'; DROP TABLE readings; Modified: sql/term-search/text-array/prefix-rk/seqscan.sql (+1 -1) =================================================================== --- sql/term-search/text-array/prefix-rk/seqscan.sql 2017-05-02 15:23:22 +0900 (c16b755) +++ sql/term-search/text-array/prefix-rk/seqscan.sql 2017-05-02 16:13:11 +0900 (63fcad9) @@ -12,6 +12,6 @@ SET enable_bitmapscan = off; SELECT katakanas FROM readings - WHERE katakanas &^~> 'p'; + WHERE katakanas &^~ 'p'; DROP TABLE readings; Modified: sql/term-search/text-array/prefix/bitmapscan.sql (+6 -1) =================================================================== --- sql/term-search/text-array/prefix/bitmapscan.sql 2017-05-02 15:23:22 +0900 (e4c5a2a) +++ sql/term-search/text-array/prefix/bitmapscan.sql 2017-05-02 16:13:11 +0900 (a958186) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^ 'pG'; + +SELECT names + FROM tags + WHERE names &^ 'pG'; DROP TABLE tags; Modified: sql/term-search/text-array/prefix/indexscan.sql (+6 -1) =================================================================== --- sql/term-search/text-array/prefix/indexscan.sql 2017-05-02 15:23:22 +0900 (f3a079d) +++ sql/term-search/text-array/prefix/indexscan.sql 2017-05-02 16:13:11 +0900 (4665ed3) @@ -13,8 +13,13 @@ SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; +EXPLAIN (COSTS OFF) SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^ 'pG'; + +SELECT names + FROM tags + WHERE names &^ 'pG'; DROP TABLE tags; Modified: sql/term-search/text-array/prefix/seqscan.sql (+1 -1) =================================================================== --- sql/term-search/text-array/prefix/seqscan.sql 2017-05-02 15:23:22 +0900 (520d495) +++ sql/term-search/text-array/prefix/seqscan.sql 2017-05-02 16:13:11 +0900 (ac5ea89) @@ -12,6 +12,6 @@ SET enable_bitmapscan = off; SELECT names FROM tags - WHERE names &^> 'pG'; + WHERE names &^ 'pG'; DROP TABLE tags; Added: sql/term-search/text/prefix-in/bitmapscan.sql (+26 -0) 100644 =================================================================== --- /dev/null +++ sql/term-search/text/prefix-in/bitmapscan.sql 2017-05-02 16:13:11 +0900 (803b501) @@ -0,0 +1,26 @@ +CREATE TABLE tags ( + name text +); + +INSERT INTO tags VALUES ('PostgreSQL'); +INSERT INTO tags VALUES ('Groonga'); +INSERT INTO tags VALUES ('PGroonga'); +INSERT INTO tags VALUES ('pglogical'); + +CREATE INDEX pgrn_index ON tags + USING pgroonga (name pgroonga.text_term_search_ops_v2); + +SET enable_seqscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; + +EXPLAIN (COSTS OFF) +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + +DROP TABLE tags; Added: sql/term-search/text/prefix-in/indexscan.sql (+26 -0) 100644 =================================================================== --- /dev/null +++ sql/term-search/text/prefix-in/indexscan.sql 2017-05-02 16:13:11 +0900 (004d8e8) @@ -0,0 +1,26 @@ +CREATE TABLE tags ( + name text +); + +INSERT INTO tags VALUES ('PostgreSQL'); +INSERT INTO tags VALUES ('Groonga'); +INSERT INTO tags VALUES ('PGroonga'); +INSERT INTO tags VALUES ('pglogical'); + +CREATE INDEX pgrn_index ON tags + USING pgroonga (name pgroonga.text_term_search_ops_v2); + +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; + +EXPLAIN (COSTS OFF) +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + +DROP TABLE tags; Added: sql/term-search/text/prefix-in/seqscan.sql (+18 -0) 100644 =================================================================== --- /dev/null +++ sql/term-search/text/prefix-in/seqscan.sql 2017-05-02 16:13:11 +0900 (8a57bd1) @@ -0,0 +1,18 @@ +CREATE TABLE tags ( + name text +); + +INSERT INTO tags VALUES ('PostgreSQL'); +INSERT INTO tags VALUES ('Groonga'); +INSERT INTO tags VALUES ('PGroonga'); +INSERT INTO tags VALUES ('pglogical'); + +SET enable_seqscan = on; +SET enable_indexscan = off; +SET enable_bitmapscan = off; + +SELECT name + FROM tags + WHERE name &^> ARRAY['gro', 'pos']; + +DROP TABLE tags; Added: sql/term-search/text/prefix-rk-in/bitmapscan.sql (+26 -0) 100644 =================================================================== --- /dev/null +++ sql/term-search/text/prefix-rk-in/bitmapscan.sql 2017-05-02 16:13:11 +0900 (2428abc) @@ -0,0 +1,26 @@ +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.text_term_search_ops_v2); + +SET enable_seqscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; + +EXPLAIN (COSTS OFF) +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + +DROP TABLE readings; Added: sql/term-search/text/prefix-rk-in/indexscan.sql (+26 -0) 100644 =================================================================== --- /dev/null +++ sql/term-search/text/prefix-rk-in/indexscan.sql 2017-05-02 16:13:11 +0900 (4479590) @@ -0,0 +1,26 @@ +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.text_term_search_ops_v2); + +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; + +EXPLAIN (COSTS OFF) +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + +SELECT katakana + FROM readings + WHERE katakana &^~> ARRAY['po', 'gu']; + +DROP TABLE readings; Added: sql/term-search/text/prefix-rk-in/seqscan.sql (+18 -0) 100644 =================================================================== --- /dev/null +++ sql/term-search/text/prefix-rk-in/seqscan.sql 2017-05-02 16:13:11 +0900 (286d16e) @@ -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 &^~> ARRAY['po', 'gu']; + +DROP TABLE readings; Modified: src/pgroonga.c (+159 -50) =================================================================== --- src/pgroonga.c 2017-05-02 15:23:22 +0900 (f7612c3) +++ src/pgroonga.c 2017-05-02 16:13:11 +0900 (101304d) @@ -198,17 +198,21 @@ PGRN_FUNCTION_INFO_V1(pgroonga_script_text); PGRN_FUNCTION_INFO_V1(pgroonga_script_text_array); PGRN_FUNCTION_INFO_V1(pgroonga_script_varchar); PGRN_FUNCTION_INFO_V1(pgroonga_prefix_text); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_text_array); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_contain_text_array); PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_text); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_text_array); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_contain_text_array); PGRN_FUNCTION_INFO_V1(pgroonga_match_in_text); PGRN_FUNCTION_INFO_V1(pgroonga_match_in_text_array); PGRN_FUNCTION_INFO_V1(pgroonga_match_in_varchar); PGRN_FUNCTION_INFO_V1(pgroonga_query_in_text); PGRN_FUNCTION_INFO_V1(pgroonga_query_in_text_array); PGRN_FUNCTION_INFO_V1(pgroonga_query_in_varchar); -PGRN_FUNCTION_INFO_V1(pgroonga_prefix_text_array); -PGRN_FUNCTION_INFO_V1(pgroonga_prefix_contain_text_array); -PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_text_array); -PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_contain_text_array); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_in_text); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_in_text_array); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_in_text); +PGRN_FUNCTION_INFO_V1(pgroonga_prefix_rk_in_text_array); PGRN_FUNCTION_INFO_V1(pgroonga_insert); PGRN_FUNCTION_INFO_V1(pgroonga_beginscan); @@ -2101,6 +2105,35 @@ pgroonga_prefix_text(PG_FUNCTION_ARGS) PG_RETURN_BOOL(matched); } +/** + * pgroonga.prefix_text_array(targets text[], prefix text) : bool + */ +Datum +pgroonga_prefix_text_array(PG_FUNCTION_ARGS) +{ + ArrayType *targets = PG_GETARG_ARRAYTYPE_P(0); + text *prefix = PG_GETARG_TEXT_PP(1); + bool matched; + + matched = + pgroonga_execute_binary_operator_string_array(targets, + VARDATA_ANY(prefix), + VARSIZE_ANY_EXHDR(prefix), + pgroonga_prefix_raw); + PG_RETURN_BOOL(matched); +} + +/** + * pgroonga.prefix_contain_text_array(targets text[], prefix text) : bool + * + * It's deprecated since 1.2.1. Just for backward compatibility. + */ +Datum +pgroonga_prefix_contain_text_array(PG_FUNCTION_ARGS) +{ + return pgroonga_prefix_text_array(fcinfo); +} + static bool pgroonga_prefix_rk_raw(const char *text, unsigned int textSize, const char *prefix, unsigned int prefixSize) @@ -2173,6 +2206,35 @@ pgroonga_prefix_rk_text(PG_FUNCTION_ARGS) } /** + * pgroonga.prefix_rk_text_array(targets text[], prefix text) : bool + */ +Datum +pgroonga_prefix_rk_text_array(PG_FUNCTION_ARGS) +{ + ArrayType *targets = PG_GETARG_ARRAYTYPE_P(0); + text *prefix = PG_GETARG_TEXT_PP(1); + bool matched; + + matched = + pgroonga_execute_binary_operator_string_array(targets, + VARDATA_ANY(prefix), + VARSIZE_ANY_EXHDR(prefix), + pgroonga_prefix_rk_raw); + PG_RETURN_BOOL(matched); +} + +/** + * pgroonga.prefix_rk_contain_text_array(targets text[], prefix text) : bool + * + * It's deprecated since 1.2.1. Just for backward compatibility. + */ +Datum +pgroonga_prefix_rk_contain_text_array(PG_FUNCTION_ARGS) +{ + return pgroonga_prefix_rk_text_array(fcinfo); +} + +/** * pgroonga.match_in_text(target text, keywords text[]) : bool */ Datum @@ -2279,63 +2341,76 @@ pgroonga_query_in_varchar(PG_FUNCTION_ARGS) } /** - * pgroonga.prefix_text_array(targets text[], prefix text) : bool + * pgroonga.prefix_in_text(target text, prefixes text[]) : bool */ Datum -pgroonga_prefix_text_array(PG_FUNCTION_ARGS) +pgroonga_prefix_in_text(PG_FUNCTION_ARGS) { - ArrayType *targets = PG_GETARG_ARRAYTYPE_P(0); - text *prefix = PG_GETARG_TEXT_PP(1); - bool matched; + text *target = PG_GETARG_TEXT_PP(0); + ArrayType *prefixes = PG_GETARG_ARRAYTYPE_P(1); + bool matched = false; matched = - pgroonga_execute_binary_operator_string_array(targets, - VARDATA_ANY(prefix), - VARSIZE_ANY_EXHDR(prefix), - pgroonga_prefix_raw); + pgroonga_execute_binary_operator_in_string(VARDATA_ANY(target), + VARSIZE_ANY_EXHDR(target), + prefixes, + pgroonga_prefix_raw); PG_RETURN_BOOL(matched); } /** - * pgroonga.prefix_contain_text_array(targets text[], prefix text) : bool - * - * It's deprecated since 1.2.1. Just for backward compatibility. + * pgroonga.prefix_in_text_array(targets text[], prefixes text[]) : bool */ Datum -pgroonga_prefix_contain_text_array(PG_FUNCTION_ARGS) +pgroonga_prefix_in_text_array(PG_FUNCTION_ARGS) { - return pgroonga_prefix_text_array(fcinfo); + ArrayType *targets = PG_GETARG_ARRAYTYPE_P(0); + ArrayType *prefixes = PG_GETARG_ARRAYTYPE_P(1); + bool matched; + + matched = + pgroonga_execute_binary_operator_in_string_array(targets, + prefixes, + pgroonga_prefix_raw); + PG_RETURN_BOOL(matched); } /** - * pgroonga.prefix_rk_text_array(targets text[], prefix text) : bool + * pgroonga.prefix_rk_in_text(target text, prefixes text[]) : bool */ Datum -pgroonga_prefix_rk_text_array(PG_FUNCTION_ARGS) +pgroonga_prefix_rk_in_text(PG_FUNCTION_ARGS) { - ArrayType *targets = PG_GETARG_ARRAYTYPE_P(0); - text *prefix = PG_GETARG_TEXT_PP(1); - bool matched; + text *target = PG_GETARG_TEXT_PP(0); + ArrayType *prefixes = PG_GETARG_ARRAYTYPE_P(1); + bool matched = false; matched = - pgroonga_execute_binary_operator_string_array(targets, - VARDATA_ANY(prefix), - VARSIZE_ANY_EXHDR(prefix), - pgroonga_prefix_rk_raw); + pgroonga_execute_binary_operator_in_string(VARDATA_ANY(target), + VARSIZE_ANY_EXHDR(target), + prefixes, + pgroonga_prefix_rk_raw); PG_RETURN_BOOL(matched); } /** - * pgroonga.prefix_rk_contain_text_array(targets text[], prefix text) : bool - * - * It's deprecated since 1.2.1. Just for backward compatibility. + * pgroonga.prefix_rk_in_text_array(targets text[], prefixes text[]) : bool */ Datum -pgroonga_prefix_rk_contain_text_array(PG_FUNCTION_ARGS) +pgroonga_prefix_rk_in_text_array(PG_FUNCTION_ARGS) { - return pgroonga_prefix_rk_text_array(fcinfo); + ArrayType *targets = PG_GETARG_ARRAYTYPE_P(0); + ArrayType *prefixes = PG_GETARG_ARRAYTYPE_P(1); + bool matched; + + matched = + pgroonga_execute_binary_operator_in_string_array(targets, + prefixes, + pgroonga_prefix_rk_raw); + PG_RETURN_BOOL(matched); } + static bool PGrnNeedMaxRecordSizeUpdate(Relation index) { @@ -3155,13 +3230,34 @@ PGrnSearchBuildCondition(Relation index, return PGrnJSONBBuildSearchCondition(data, key, targetColumn); valueTypeID = attribute->atttypid; - switch (valueTypeID) + switch (key->sk_strategy) { - case VARCHARARRAYOID: - valueTypeID = VARCHAROID; + case PGrnPrefixInStrategyV2Number: + case PGrnPrefixRKInStrategyV2Number: + case PGrnQueryInStrategyV2Number: + case PGrnMatchInStrategyV2Number: + switch (valueTypeID) + { + case VARCHAROID: + case VARCHARARRAYOID: + valueTypeID = VARCHARARRAYOID; + break; + case TEXTOID: + case TEXTARRAYOID: + valueTypeID = TEXTARRAYOID; + break; + } break; - case TEXTARRAYOID: - valueTypeID = TEXTOID; + default: + switch (valueTypeID) + { + case VARCHARARRAYOID: + valueTypeID = VARCHAROID; + break; + case TEXTARRAYOID: + valueTypeID = TEXTOID; + break; + } break; } @@ -3208,18 +3304,9 @@ PGrnSearchBuildCondition(Relation index, operator = GRN_OP_REGEXP; break; case PGrnQueryInStrategyV2Number: + break; case PGrnMatchInStrategyV2Number: - switch (attribute->atttypid) - { - case VARCHAROID: - case VARCHARARRAYOID: - valueTypeID = VARCHARARRAYOID; - break; - case TEXTOID: - case TEXTARRAYOID: - valueTypeID = TEXTARRAYOID; - break; - } + operator = GRN_OP_REGEXP; break; default: ereport(ERROR, @@ -3262,12 +3349,33 @@ PGrnSearchBuildCondition(Relation index, GRN_TEXT_LEN(&(buffers->general))); break; case PGrnPrefixRKStrategyV2Number: - case PGrnPrefixRKInStrategyV2Number: PGrnSearchBuildConditionPrefixRK(data, targetColumn, GRN_TEXT_VALUE(&(buffers->general)), GRN_TEXT_LEN(&(buffers->general))); break; + case PGrnPrefixRKInStrategyV2Number: + { + grn_obj *prefixes = &(buffers->general); + unsigned int i, n; + + n = grn_vector_size(ctx, prefixes); + for (i = 0; i < n; i++) + { + const char *prefix; + unsigned int prefixSize; + + prefixSize = grn_vector_get_element(ctx, prefixes, i, + &prefix, NULL, NULL); + PGrnSearchBuildConditionPrefixRK(data, + targetColumn, + prefix, + prefixSize); + if (i > 0) + grn_expr_append_op(ctx, data->expression, GRN_OP_OR, 2); + } + break; + } case PGrnQueryInStrategyV2Number: { grn_obj *queries = &(buffers->general); @@ -3290,6 +3398,7 @@ PGrnSearchBuildCondition(Relation index, } break; } + case PGrnPrefixInStrategyV2Number: case PGrnMatchInStrategyV2Number: { grn_obj *keywords = &(buffers->general); @@ -3309,7 +3418,7 @@ PGrnSearchBuildCondition(Relation index, PGrnSearchBuildConditionBinaryOperation(data, targetColumn, &keywordBuffer, - GRN_OP_MATCH); + operator); if (i > 0) grn_expr_append_op(ctx, data->expression, GRN_OP_OR, 2); } -------------- next part -------------- HTML����������������������������...Download