drop dataverse fuzzyjoin if exists;

create dataverse fuzzyjoin;

use dataverse fuzzyjoin;

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

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

create nodegroup group1  if not exists on nc1, nc2;

create dataset DBLP(DBLPType) partitioned by key id on group1;
create dataset CSX(CSXType) partitioned by key id on group1;

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

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"=":"));

write output to nc1:'rttest/fuzzyjoin_dblp-csx-3_5.3.1.adm';

//
// -- - Stage 3 - --
//
for $ridpair in 
    //
    // -- - Stage 2 - --
    //
    for $paperDBLP in dataset('DBLP')
    let $idDBLP := $paperDBLP.id
    let $tokensUnrankedDBLP := counthashed-word-tokens($paperDBLP.title)
    let $lenDBLP := len($tokensUnrankedDBLP)
    let $tokensDBLP :=
        for $tokenUnranked in $tokensUnrankedDBLP
        for $tokenRanked at $i in
            //
            // -- - Stage 1 - --
            //
            for $paper in dataset('DBLP')
            let $id := $paper.id
            for $token in counthashed-word-tokens($paper.title)
            /*+ hash */
            group by $tokenGrouped := $token with $id
            /*+ inmem 1 302 */
            order by count($id), $tokenGrouped
            return $tokenGrouped
        where $tokenUnranked = /*+ bcast */ $tokenRanked
        order by $i
        return $i
    for $prefixTokenDBLP in subset-collection(
                                $tokensDBLP,
                                0,
                                prefix-len-jaccard(len($tokensDBLP), .5f))

    for $paperCSX in dataset('CSX')
    let $idCSX := $paperCSX.id
    let $tokensUnrankedCSX := counthashed-word-tokens($paperCSX.title)
    let $lenCSX := len($tokensUnrankedCSX)
    let $tokensCSX :=
        for $tokenUnranked in $tokensUnrankedCSX
        for $tokenRanked at $i in
            //
            // -- - Stage 1 - --
            //
            for $paper in dataset('DBLP')
            let $id := $paper.id
            for $token in counthashed-word-tokens($paper.title)
            /*+ hash */
            group by $tokenGrouped := $token with $id
            /*+ inmem 1 302 */
            order by count($id), $tokenGrouped
            return $tokenGrouped
        where $tokenUnranked = /*+ bcast */ $tokenRanked
        order by $i
        return $i
    for $prefixTokenCSX in subset-collection(
                                $tokensCSX,
                                0,
                                prefix-len-jaccard(len($tokensCSX), .5f))

    where $prefixTokenDBLP = $prefixTokenCSX

    let $sim := similarity-jaccard-prefix(
                    $lenDBLP,
                    $tokensDBLP,
                    $lenCSX,
                    $tokensCSX,
                    $prefixTokenDBLP,
                    .5f)
    where $sim >= .5f
    /*+ hash*/ 
    group by $idDBLP := $idDBLP, $idCSX := $idCSX with $sim
    return {'idDBLP': $idDBLP, 'idCSX': $idCSX, 'sim': $sim[0]}

for $paperDBLP in dataset('DBLP')
for $paperCSX in dataset('CSX')
where $ridpair.idDBLP = $paperDBLP.id and $ridpair.idCSX = $paperCSX.id
order by $paperDBLP.id, $paperCSX.id
return {'dblp': $paperDBLP, 'csx': $paperCSX, 'sim': $ridpair.sim}
