[ 
https://issues.apache.org/jira/browse/ASTERIXDB-2176?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Taewoo Kim updated ASTERIXDB-2176:
----------------------------------
    Description: 
This is a simplified version of "upsert/primary-secondary-tree" AQL test case.

spatialData.json file
{ "id": 12, "point": point("6.0,3.0") }

moreSpatialData.json file
{"id": 12, "point": point("4.1,7.0")}


DDL: 

{code}
drop dataverse test if exists;
create dataverse test;
use dataverse test;

create type MyRecord as closed {
  id: int64,
  point: point
}

create dataset UpsertTo(MyRecord)
 primary key id;

create dataset UpsertFrom(MyRecord)
 primary key id;

create index rtree_index_point on UpsertTo(point) type rtree;
{code}

DML
{code}
load dataset UpsertTo
using localfs
(("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm"));

load dataset UpsertFrom
using localfs
(("path"="asterix_nc1://data/spatial/moreSpatialData.json"),("format"="adm"));

upsert into dataset UpsertTo(
for $x in dataset UpsertFrom
return $x
);

for $o in dataset('UpsertTo')
where spatial-intersect($o.point, 
create-polygon([4.0,1.0,4.0,4.0,12.0,4.0,12.0,1.0]))
order by $o.id
return $o;
{code}

This DML returns the new record correctly. But, the issue is that the indexed 
value in RTree has not been updated.

When searching the rtree_index_point index, the searcher sees the previous 
value - point("6.0,3.0"), not the new value - point("4.1,7.0"). So, this record 
will be fetched from the primary index. However, the primary index search 
returns the updated value and the select() verifies the value. It returns true 
by coincidence because the new value satisfies the spatial-intersect() 
condition.

The secondary index search should see the updated value, not the previous 
value. And this is an issue for the index-only plan case since it only uses the 
value from a secondary index.

 





  was:
This is a simplified version of "upsert/primary-secondary-tree" AQL test case.

spatialData.json file
{ "id": 12, "point": point("6.0,3.0") }

moreSpatialData.json file
{"id": 12, "point": point("4.1,7.0")}


DDL: 

{code}
drop dataverse test if exists;
create dataverse test;
use dataverse test;

create type MyRecord as closed {
  id: int64,
  point: point
}

create dataset UpsertTo(MyRecord)
 primary key id;

create dataset UpsertFrom(MyRecord)
 primary key id;

create index rtree_index_point on UpsertTo(point) type rtree;
{code}

DML
{code}
load dataset UpsertTo
using localfs
(("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm"));

load dataset UpsertFrom
using localfs
(("path"="asterix_nc1://data/spatial/moreSpatialData.json"),("format"="adm"));

upsert into dataset UpsertTo(
for $x in dataset UpsertFrom
return $x
);

for $o in dataset('UpsertTo')
where spatial-intersect($o.point, 
create-polygon([4.0,1.0,4.0,4.0,12.0,4.0,12.0,1.0]))
order by $o.id
return $o;
{code}

This DML returns the new record correctly. But, the issue is that the indexed 
value in RTree has not been updated.

when searching the rtree_index_point index, the searcher sees the previous 
value - point("6.0,3.0"), not the new value - point("4.1,7.0"). So, this record 
will be fetched from the primary index. However, the primary index search 
returns the updated value and the select() verifies the value. It returns true 
by coincidence because the new value satisfies the spatial-intersect() 
condition.

The secondary index search should see the updated value, not the previous 
value. And this is an issue for the index-only plan case since it only uses the 
value from a secondary index.

 






> Upsert doesn't work on the RTree index.
> ---------------------------------------
>
>                 Key: ASTERIXDB-2176
>                 URL: https://issues.apache.org/jira/browse/ASTERIXDB-2176
>             Project: Apache AsterixDB
>          Issue Type: Bug
>            Reporter: Taewoo Kim
>
> This is a simplified version of "upsert/primary-secondary-tree" AQL test case.
> spatialData.json file
> { "id": 12, "point": point("6.0,3.0") }
> moreSpatialData.json file
> {"id": 12, "point": point("4.1,7.0")}
> DDL: 
> {code}
> drop dataverse test if exists;
> create dataverse test;
> use dataverse test;
> create type MyRecord as closed {
>   id: int64,
>   point: point
> }
> create dataset UpsertTo(MyRecord)
>  primary key id;
> create dataset UpsertFrom(MyRecord)
>  primary key id;
> create index rtree_index_point on UpsertTo(point) type rtree;
> {code}
> DML
> {code}
> load dataset UpsertTo
> using localfs
> (("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm"));
> load dataset UpsertFrom
> using localfs
> (("path"="asterix_nc1://data/spatial/moreSpatialData.json"),("format"="adm"));
> upsert into dataset UpsertTo(
> for $x in dataset UpsertFrom
> return $x
> );
> for $o in dataset('UpsertTo')
> where spatial-intersect($o.point, 
> create-polygon([4.0,1.0,4.0,4.0,12.0,4.0,12.0,1.0]))
> order by $o.id
> return $o;
> {code}
> This DML returns the new record correctly. But, the issue is that the indexed 
> value in RTree has not been updated.
> When searching the rtree_index_point index, the searcher sees the previous 
> value - point("6.0,3.0"), not the new value - point("4.1,7.0"). So, this 
> record will be fetched from the primary index. However, the primary index 
> search returns the updated value and the select() verifies the value. It 
> returns true by coincidence because the new value satisfies the 
> spatial-intersect() condition.
> The secondary index search should see the updated value, not the previous 
> value. And this is an issue for the index-only plan case since it only uses 
> the value from a secondary index.
>  



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to