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 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/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.4.1.adm';

//
// -- - Stage 3 - --
//
for $paperCSX in dataset('CSX')
for $paperDBLPridpair in
for $paperDBLP in dataset('DBLP')
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]}

where $ridpair.idDBLP = $paperDBLP.id
return {'idDBLP': $paperDBLP.id, 'idCSX': $ridpair.idCSX, 'paperDBLP': $paperDBLP, 'sim': $ridpair.sim}

where $paperDBLPridpair.idCSX = $paperCSX.id
order by $paperDBLPridpair.idDBLP, $paperDBLPridpair.idCSX
return {'dblp': $paperDBLPridpair.paperDBLP, 'csx': $paperCSX, 'sim': $paperDBLPridpair.sim}
