/*
 * Description    : Fuzzy joins two datasets, DBLP and CSX, based on the similarity-jaccard function of their titles' word tokens.
 *                  DBLP has a keyword index on title, and we expect the join to be transformed into an indexed nested-loop join.
 *                  We test the inlining of variables that enable the select to be pushed into the join for subsequent optimization with an index.
 *                  We expect the top-level equi join introduced because of surrogate optimization to be removed, since it is not necessary.
 * Success        : Yes
 */

drop dataverse test if exists;
create dataverse test;
use dataverse test;

create type DBLPType as closed {
  id: int32, 
  dblpid: string,
  title: string,
  authors: string,
  misc: string
}

create type CSXType as closed {
  id: int32, 
  csxid: string,
  title: string,
  authors: string,
  misc: string
}

create dataset DBLP(DBLPType) partitioned by key id;

create dataset CSX(CSXType) partitioned by key id;

load dataset DBLP 
using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
(("path"="nc1://data/dblp-small/dblp-small-id.txt"),("format"="delimited-text"),("delimiter"=":")) pre-sorted;

load dataset CSX
using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
(("path"="nc1://data/pub-small/csx-small-id.txt"),("format"="delimited-text"),("delimiter"=":"));

create index keyword_index on DBLP(title) type keyword;

write output to nc1:"rttest/inverted-index-join-noeqjoin_word-jaccard-inline.adm";

for $a in dataset('DBLP')
for $b in dataset('CSX')
let $jacc := similarity-jaccard(word-tokens($a.title), word-tokens($b.title))
where $jacc >= 0.5f and $a.id < $b.id
order by $jacc, $a.id, $b.id
return { "a": $a.title, "b": $b.title, "jacc": $jacc }