# LogicTest: 5node

statement ok
CREATE TABLE geo_table (
  k INT PRIMARY KEY,
  s STRING,
  geom GEOMETRY,
  INVERTED INDEX geom_index (geom)
)

statement ok
INSERT INTO geo_table VALUES
  (1, 'foo', 'POINT(1 1)'),
  (2, 'foo', 'LINESTRING(1 1, 2 2)'),
  (3, 'foo', 'POINT(3 3)'),
  (4, 'bar', 'LINESTRING(4 4, 5 5)'),
  (5, 'bar', 'LINESTRING(40 40, 41 41)'),
  (6, 'bar', 'POLYGON((1 1, 5 1, 5 5, 1 5, 1 1))'),
  (7, 'foo', 'LINESTRING(1 1, 3 3)')

# Not distributed.
query I
SELECT k FROM geo_table@geom_index WHERE ST_Intersects('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
3
6
7

query I
SELECT k FROM geo_table@geom_index WHERE ST_CoveredBy('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
6
7


# The inverted filterer handles five inverted index rows with decoded
# datums, where the first column is the PK (k) and the second is the cellid
# and is sorted in cellid order.
#  7, 1152921521786716160
#  2, 1152921526081683456
#  6, 1152921573326323712
#  7, 1152921574400065536
#  3, 1152921574740070469
# To test distribution, we inject a split after the third row and relocate
# the second part of the inverted index. Both inverted filterers will produce 7,
# which will need to be de-duplicated.

statement ok
ALTER INDEX geo_table@geom_index SPLIT AT VALUES (1152921574000000000)

query TI colnames,rowsort
SELECT replicas, lease_holder FROM [SHOW RANGES FROM INDEX geo_table@geom_index WITH DETAILS]
----
replicas  lease_holder
{1}       1
{1}       1

statement ok
ALTER INDEX geo_table@geom_index EXPERIMENTAL_RELOCATE VALUES (ARRAY[2], 1152921574000000000)

query TTTI colnames,rowsort
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW RANGES FROM INDEX geo_table@geom_index WITH DETAILS]
ORDER BY 1
----
start_key              end_key                replicas  lease_holder
<before:/Table/72>     …/1152921574000000000  {1}       1
…/1152921574000000000  <after:/Max>           {2}       2

# Distributed.
query I
SELECT k FROM geo_table@geom_index WHERE ST_Intersects('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
3
6
7

# Data is distributed, but the filterer can't be distributed since it is not a union.
query I
SELECT k FROM geo_table@geom_index WHERE ST_CoveredBy('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
6
7

# Move all the index data that will be read to node 2 while the query executes
# at node 1. The filtering moves to node 2 when it is distributable.

statement ok
ALTER INDEX geo_table@geom_index EXPERIMENTAL_RELOCATE VALUES (ARRAY[2], 1)

query TTTI colnames,rowsort
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW RANGES FROM INDEX geo_table@geom_index WITH DETAILS]
ORDER BY 1
----
start_key              end_key                replicas  lease_holder
<before:/Table/72>     …/1152921574000000000  {2}       2
…/1152921574000000000  <after:/Max>           {2}       2

query I
SELECT k FROM geo_table@geom_index WHERE ST_Intersects('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
3
6
7

# Filtering is placed at node 2.
query I
SELECT k FROM geo_table@geom_index WHERE ST_CoveredBy('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
6
7

statement ok
DROP INDEX geom_index;

# Test for multi-column geo-spatial indexes.
statement ok
CREATE INVERTED INDEX geom_index2 ON geo_table(s, geom)

query TI colnames,rowsort
SELECT replicas, lease_holder FROM [SHOW RANGES FROM INDEX geo_table@geom_index2 WITH DETAILS]
----
replicas  lease_holder
{2}       2

# Not distributed.
query I
SELECT k FROM geo_table@geom_index2 WHERE s = 'foo' AND ST_Intersects('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
3
7

query I
SELECT k FROM geo_table@geom_index2 WHERE s = 'foo' AND ST_CoveredBy('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
7

statement ok
ALTER INDEX geo_table@geom_index2 SPLIT AT VALUES ('foo', 1152921574000000000)

query TI colnames,rowsort
SELECT replicas, lease_holder FROM [SHOW RANGES FROM INDEX geo_table@geom_index2 WITH DETAILS]
----
replicas  lease_holder
{2}       2
{2}       2

statement ok
ALTER INDEX geo_table@geom_index2 EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 'foo', 1152921574000000000)

query TTTI colnames,rowsort
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW RANGES FROM INDEX geo_table@geom_index2 WITH DETAILS]
----
start_key                    end_key                      replicas  lease_holder
…/<IndexMin>                 …/"foo"/1152921574000000000  {2}       2
…/"foo"/1152921574000000000  …/<IndexMax>                 {1}       1

# Distributed.
query I
SELECT k FROM geo_table@geom_index2 WHERE s = 'foo' AND ST_Intersects('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
3
7

# Data is distributed, but the filterer can't be distributed since it is not a union.
query I
SELECT k FROM geo_table@geom_index2 WHERE s = 'foo' AND ST_CoveredBy('MULTIPOINT((2.2 2.2), (3.0 3.0))'::geometry, geom) ORDER BY k
----
7
