[Groonga-commit] pgroonga/pgroonga at 6025df8 [master] All term search operator classes have &^, &^~, &^> and &^~>

Zurück zum Archiv-Index

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 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index