Tin,

1. There is no support for SQL++ in templates. Just AQL.  And AQL is now deprecated, in a mode where it is only supported to keep that one fuzzy join rule alive via AQL+.  The most recent public release of AsterixDB is the last one where AQL+ will work - and then AQL will completely disappear from the code base (as will the scripting framework) going forward, as it is totally unsupported.  (Its inventor left with his PhD in 2011.  Taewoo Kim, below, did a really nice refactoring revision of the framework more recently, to remove lots of replicated code between AQL and AQL+, but he is also no longer focused on AsterixDB work - his post-PhD day job seems to be a distraction. :-))

2. More information about the scripting framework and its use for the fuzzy join rule is in Chapter 5 of the aforementioned PhD student's thesis: http://asterix.ics.uci.edu//thesis/Rares_Vernica_PhD_thesis_2011.pdf.

3. I suspect it would be significantly messy work to create a SQL++ alternative to AQL as the basis for the template framework...  If you want to explore a template-based approach, I'd stick with AQL+ and just be aware that it's kind of a "dead end" approach long-term in the AsterixDB code base - but could be explored as a research branch using 0.9.5 as the branching point.

I think a native approach to spatial joins would be better than a template-based approach - along the lines of what Preston Carmon et al are doing for interval joins up at Walla Walla U in Washington state.

Cheers,

Mike

On 8/24/20 11:11 AM, Taewoo Kim wrote:
Hi Tin,

Here is a paper that explains FuzzyJoinRule in general. Hope this helps.

https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=Similarity+query+support+in+big+data+management+systems&btnG=

1. What is the syntax to make placeholders for input operators and
variables in a SQL++ template? In the FuzzyJoinRule
<
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
implementation
<
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
,
I saw that it is using ##LEFT_0 for left input operator and $$LEFT_0 for
left input variable. Is it similar in SQL++?
You need to implement an extended version of SQL++ (maybe SQL+++) that
recognizes ##LEFT_0, etc. FuzzyJoinRule uses AQL+.
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/javacc/AQLPlusExtension.jj
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlPlusExpressionToPlanTranslator.java

2. Does the query template for substitution must be a (full) compilable
query? Or it can be just a part of a full query?
It has to be a complete query that is executable in SQL+++ (if you create
one).

3. Can the substitute query contain UDF functions?
Whatever support that SQL++ has, SQL+++ inherits since SQL++ is an extended
version.

Best,
Taewoo


On Mon, Aug 24, 2020 at 10:55 AM Tin Vu <[email protected]> wrote:

Hi all,

I'm working on a project which aims to improve performance of spatial join
query in AsterixDB.

The problem can be described as follows:

Assume that we have 2 dataset ParkSet(id, geom) and LakeSet(id, geom) with
geom is a spatial data type (point, rectangle, polygon). This is a join
query to list all intersected pairs of these two datasets:
```

*SELECT COUNT(*) FROM ParkSet AS ps, LakeSet AS lsWHERE
spatial_intersect(ps.geom, ls.geom);*
*```*

I rewrote this query in a more complicated SQL++ query(*) but has a better
performance.

I took a look at FuzzyJoinRule
<
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
implementation
<
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
(a
rule for AQL+) in AsterixDB and I'm trying to make a similar implementation
called SpatalJoinRule
<
https://github.com/tinvukhac/asterixdb/blob/cartilage/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SpatialJoinRule.java
(a
rule for SQL++). Now I'm stuck with some questions and I would
really appreciate if you can help me to answer them:

1. What is the syntax to make placeholders for input operators and
variables in a SQL++ template? In the FuzzyJoinRule
<
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
implementation
<
https://github.com/apache/asterixdb/blob/master/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
,
I saw that it is using ##LEFT_0 for left input operator and $$LEFT_0 for
left input variable. Is it similar in SQL++?

2. Does the query template for substitution must be a (full) compilable
query? Or it can be just a part of a full query?

3. Can the substitute query contain UDF functions?

Thanks,

Tin

(*) Rewitten query: in short, it partitioned the datasets by a grid (red
statement) then we compute the intersection pairs for each cell of the
grid.
- 'mytileids' UDF function returns the corresponding cell ID of a spatial
object.
- 'referencepointtileid' UDF function is used to ignore the duplications in
the final result.
- (-180.0,83.0,180.0,90.0) is space MBR.
- (100,100) is grid size (rows x columns).

```





*SELECT COUNT(*) FROM (SELECT parksPartitioned.tile as tile1,
lakesPartitioned.tile as tile2,
test#referencepointtileid(parksPartitioned.geom,
lakesPartitioned.geom,-180.0,83.0,180.0,90.0,100,100) as
ref_tileFROM(SELECT tile, p.ps.id <http://p.ps.id/>, p.ps.geom FROM
(SELECT
test#mytileids(ps.geom,-180.0,-83.0,180.0,90.0,100,100) AS tileids, ps FROM
ParkSet as ps) AS p UNNEST p.tileids AS tile) AS parksPartitioned,(SELECT
tile, p.ps.id <http://p.ps.id/>, p.ps.geom FROM (SELECT
test#mytileids(ps.geom,-180.0,-83.0,180.0,90.0,100,100) AS tileids, ps FROM
LakeSet as ps) AS p UNNEST p.tileids AS tile) AS lakesPartitionedWHERE
parksPartitioned.tile = lakesPartitioned.tileAND
spatial_intersect(parksPartitioned.geom, lakesPartitioned.geom)) AS result
WHERE result.tile1 = result.ref_tile;*
*```*

Reply via email to