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.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)
            group by $tokenGroupped := $token with $id
            order by count($id), $tokenGroupped
            return $tokenGroupped
        where $tokenUnranked = $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)
            group by $tokenGroupped := $token with $id
            order by count($id), $tokenGroupped
            return $tokenGroupped
        where $tokenUnranked = $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
    group by $idDBLP := $idDBLP, $idCSX := $idCSX, $sim := $sim 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}
