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-2_5.1.adm';

    //
    // -- - 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
            order by count($id), $tokenGrouped
            return $tokenGrouped
        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)
            /*+ hash */
            group by $tokenGrouped := $token with $id
            order by count($id), $tokenGrouped
            return $tokenGrouped
        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 with $sim
    order by $idDBLP, $idCSX
    return {'idDBLP': $idDBLP, 'idCSX': $idCSX, 'sim': $sim[0]}
