/*
 * Description    : Tests whether a keyword index is applied to optimize a selection query using the similarity-jaccard-check function on lists.
 *                  Tests that the optimizer rule correctly drills through the let clauses.
 *                  The index should be applied.
 * Success        : Yes
 */

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

create type AddressType as closed {
  number: int32, 
  street: string,
  city: string
}

create type CustomerType as closed {
  cid: int32, 
  name: string,
  age: int32?,
  address: AddressType?,
  interests: [string],
  children: [ { name: string, age: int32? } ]
}

create dataset Customers(CustomerType) partitioned by key cid;

load dataset Customers 
using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
(("path"="nc1://data/semistructured/co1k_olist/customer.adm"),("format"="adm"));

create index interests_index on Customers(interests) type keyword;

write output to nc1:"rttest/inverted-index-complex_olist-jaccard-check-let.adm";

for $c in dataset('Customers')
let $jacc := similarity-jaccard-check($c.interests, ["databases", "computers", "wine"], 0.7f)
where $jacc[0]
return $c
