package org.apache.rya.indexing.accumulo.entity;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.apache.accumulo.core.client.AccumuloException;
import org.apache.accumulo.core.client.AccumuloSecurityException;
import org.apache.accumulo.core.client.BatchWriter;
import org.apache.accumulo.core.client.BatchWriterConfig;
import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.TableExistsException;
import org.apache.accumulo.core.client.TableNotFoundException;
import org.apache.accumulo.core.client.mock.MockInstance;
import org.apache.accumulo.core.data.Mutation;
import org.apache.accumulo.core.data.Value;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.rya.accumulo.AccumuloRdfConfiguration;
import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
import org.apache.rya.api.persist.RdfEvalStatsDAO;
import org.apache.rya.indexing.accumulo.ConfigUtils;
import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.eclipse.rdf4j.query.QueryEvaluationException;
import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
import org.eclipse.rdf4j.query.algebra.QueryModelNode;
import org.eclipse.rdf4j.query.algebra.TupleExpr;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.FilterOptimizer;
import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
import org.eclipse.rdf4j.query.parser.ParsedQuery;
import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
import org.eclipse.rdf4j.repository.RepositoryException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

public class EntityOptimizerTest {

    private static final String DELIM = "\u0000";
    private final byte[] EMPTY_BYTE = new byte[0];
    private final Value EMPTY_VAL = new Value(EMPTY_BYTE);

    private String q1 = ""//
        + "SELECT ?h  " //
        + "{" //
        + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
        + "  ?h <uri:barksAt> <uri:cat> ."//
        + "  ?h <uri:peesOn> <uri:hydrant> . "//
        + "}";//


    private String q2 = ""//
        + "SELECT ?h ?m" //
        + "{" //
        + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
        + "  ?h <uri:barksAt> <uri:cat> ."//
        + "  ?h <uri:peesOn> <uri:hydrant> . "//
        + "  ?m <uri:eats>  <uri:chickens>. " //
        + "  ?m <uri:scratches> <uri:ears>. " //
        + "}";//

    private String Q2 = ""//
        + "SELECT ?h ?l ?m" //
        + "{" //
        + "  ?h <uri:peesOn> <uri:hydrant> . "//
        + "  ?h <uri:barksAt> <uri:cat> ."//
        + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
        + "  ?m <uri:eats>  <uri:chickens>. " //
        + "  ?m <uri:scratches> <uri:ears>. " //
        + "}";//

    private String q3 = ""//
        + "SELECT ?h ?l ?m" //
        + "{" //
        + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
        + "  ?h <uri:barksAt> <uri:cat> ."//
        + "  ?h <uri:peesOn> <uri:hydrant> . "//
        + "  {?m <uri:eats>  <uri:chickens>} OPTIONAL {?m <uri:scratches> <uri:ears>}. " //
        + "  {?m <uri:eats>  <uri:kibble>. ?m <uri:watches> <uri:television>.} UNION {?m <uri:rollsIn> <uri:mud>}. " //
        + "  ?l <uri:runsIn> <uri:field> ."//
        + "  ?l <uri:smells> <uri:butt> ."//
        + "  ?l <uri:eats> <uri:sticks> ."//
        + "}";//

    private String Q4 = ""//
        + "SELECT ?h ?l ?m" //
        + "{" //
        + "  ?h <uri:barksAt> <uri:cat> ."//
        + "  ?m <uri:scratches> <uri:ears>. " //
        + "  ?m <uri:eats>  <uri:chickens>. " //
        + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
        + "  ?h <uri:peesOn> <uri:hydrant> . "//
        + "}";//

    private String q5 = ""//
            + "SELECT ?h ?m" //
            + "{" //
            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
            + "  ?h <uri:barksAt> <uri:cat> ."//
            + "  ?h <uri:peesOn> ?m . "//
            + "  ?m <uri:eats>  <uri:chickens>. " //
            + "  ?m <uri:scratches> <uri:ears>. " //
            + "}";//
    
    
    
    private String q6 = ""//
            + "SELECT ?h ?i ?l ?m" //
            + "{" //
            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
            + "  ?h <uri:barksAt> <uri:cat> ."//
            + "  ?h <uri:peesOn> <uri:hydrant> . "//
            + "  {?m <uri:eats>  <uri:chickens>} OPTIONAL {?m <uri:scratches> <uri:ears>}. " //
            + "  {?m <uri:eats> <uri:kibble>. ?m <uri:watches> ?i. ?i <uri:runsIn> <uri:field> .} " //
            + "  UNION {?m <uri:rollsIn> <uri:mud>. ?l <uri:smells> ?m . ?l <uri:eats> <uri:sticks> . }. " //
            + "}";//
    
    
    private String q7 = ""//
            + "SELECT ?h ?m" //
            + "{" //
            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:chickens> ."//
            + "  ?h <uri:barksAt> <uri:chickens> ."//
            + "  ?h <uri:peesOn> ?m . "//
            + "  ?m <uri:eats>  <uri:chickens>. " //
            + "  ?m <uri:scratches> <uri:ears>. " //
            + "}";//
    
    
    private String q8 = ""//
            + "SELECT ?h ?m" //
            + "{" //
            + "  Filter(?h = \"Diego\") " //
            + "  Filter(?m = \"Rosie\") " //
            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:chickens> ."//
            + "  ?h <uri:barksAt> <uri:chickens> ."//
            + "  ?h <uri:peesOn> ?m . "//
            + "  ?m <uri:eats>  <uri:chickens>. " //
            + "  ?m <uri:scratches> <uri:ears>. " //
            + "}";//
    
    
    
    
    private String q9 = ""//
            + "SELECT ?h ?i ?l ?m" //
            + "{" //
            + "  Filter(?h = \"Diego\") " //
            + "  Filter(?m = \"Rosie\") " //
            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
            + "  ?h <uri:barksAt> <uri:cat> ."//
            + "  ?h <uri:peesOn> <uri:hydrant> . "//
            + "  {?m <uri:eats>  <uri:chickens>} OPTIONAL {?m <uri:scratches> <uri:ears>}. " //
            + "  {   Filter(?i = \"Bobo\").  ?m <uri:eats> <uri:kibble>. ?m <uri:watches> ?i. ?i <uri:runsIn> <uri:field> .} " //
            + "  UNION {?m <uri:rollsIn> <uri:mud>. ?l <uri:smells> ?m . ?l <uri:eats> <uri:sticks> . }. " //
            + "}";//
    
    

    private Connector accCon;
    AccumuloRdfConfiguration conf;
    BatchWriterConfig config;
    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res;
    
    
    
    @Before
    public void init() throws RepositoryException, TupleQueryResultHandlerException, QueryEvaluationException,
            MalformedQueryException, AccumuloException, AccumuloSecurityException, TableExistsException {

        
       
        accCon = new MockInstance("instance").getConnector("root", "".getBytes());
        
        config = new BatchWriterConfig();
        config.setMaxMemory(1000);
        config.setMaxLatency(1000, TimeUnit.SECONDS);
        config.setMaxWriteThreads(10);
        
        if (accCon.tableOperations().exists("rya_prospects")) {
            try {
                accCon.tableOperations().delete("rya_prospects");
            } catch (TableNotFoundException e) {
                e.printStackTrace();
            }
        }
        if (accCon.tableOperations().exists("rya_selectivity")) {
            try {
                accCon.tableOperations().delete("rya_selectivity");
            } catch (TableNotFoundException e) {
                e.printStackTrace();
            }
        }
          
        accCon.tableOperations().create("rya_prospects");
        accCon.tableOperations().create("rya_selectivity");
        
        Configuration con = new Configuration();
        con.set(ConfigUtils.CLOUDBASE_AUTHS, "U");
        con.set(ConfigUtils.CLOUDBASE_INSTANCE, "instance");
        con.set(ConfigUtils.CLOUDBASE_USER, "root");
        con.set(ConfigUtils.CLOUDBASE_PASSWORD, "");
        conf = new AccumuloRdfConfiguration(con);
        TablePrefixLayoutStrategy tps = new TablePrefixLayoutStrategy("rya_");
        conf.setTableLayoutStrategy(tps);
        conf.set(ConfigUtils.USE_MOCK_INSTANCE, "true");
        
        
        res = new ProspectorServiceEvalStatsDAO(accCon, conf);

    }
    

 @Test
    public void testOptimizeQ1SamePriority() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject");
      Mutation m1, m2, m3, m4;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      mList.add(m1);
      mList.add(m2);
      mList.add(m3);

      bw1.addMutations(mList);
      bw1.close();


      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m4.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      bw2.addMutations(mList2);
      bw2.close();


      TupleExpr te = getTupleExpr(q1);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      
      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      Assert.assertEquals(1, ccv.getCcNodes().size());
      
      System.out.println(te);

    }
    
    
    
    
    
 @Test
    public void testOptimizeQ2SamePriority() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
      String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
      String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject");
      Mutation m1, m2, m3, m4, m5, m6;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m4 = new Mutation(s4 + DELIM + "1");
      m4.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m5 = new Mutation(s5 + DELIM + "1");
      m5.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      mList.add(m1);
      mList.add(m2);
      mList.add(m3);
      mList.add(m4);
      mList.add(m5);

      bw1.addMutations(mList);
      bw1.close();

//      Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
//      scan.setRange(new Range());
//
//      for (Map.Entry<Key,Value> entry : scan) {
//        System.out.println("Key row string is " + entry.getKey().getRow().toString());
//        System.out.println("Key is " + entry.getKey());
//        System.out.println("Value is " + (new String(entry.getValue().get())));
//      }

      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(s4);
      m5 = new Mutation(s5);
      m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m4.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      mList2.add(m5);
      mList2.add(m6);
      bw2.addMutations(mList2);
      bw2.close();


      TupleExpr te = getTupleExpr(q2);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      Assert.assertEquals(2, ccv.getCcNodes().size());
      
      
      System.out.println(te);

    }
    
    
    
    
    
    
 @Test
    public void testOptimizeQ3SamePriority() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
      String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
      String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
      String s6 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:kibble";
      String s7 = "predicateobject" + DELIM + "uri:rollsIn" + DELIM + "uri:mud";
      String s8 = "predicateobject" + DELIM + "uri:runsIn" + DELIM + "uri:field";
      String s9 = "predicateobject" + DELIM + "uri:smells" + DELIM + "uri:butt";
      String s10 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:sticks";
      String s11 = "predicateobject" + DELIM + "uri:watches" + DELIM + "uri:television";
      

      
      
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject");
      Mutation m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m4 = new Mutation(s4 + DELIM + "1");
      m4.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m5 = new Mutation(s5 + DELIM + "1");
      m5.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m6 = new Mutation(s6 + DELIM + "1");
      m6.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m7 = new Mutation(s7 + DELIM + "1");
      m7.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m8 = new Mutation(s8 + DELIM + "1");
      m8.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m9 = new Mutation(s9 + DELIM + "1");
      m9.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m10 = new Mutation(s10 + DELIM + "1");
      m10.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m11 = new Mutation(s11 + DELIM + "1");
      m11.put(new Text("count"), new Text(""), new Value("1".getBytes()));

      mList.add(m1);
      mList.add(m2);
      mList.add(m3);
      mList.add(m4);
      mList.add(m5);
      mList.add(m6);
      mList.add(m7);
      mList.add(m8);
      mList.add(m9);
      mList.add(m10);
      mList.add(m11);

      bw1.addMutations(mList);
      bw1.close();


      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(s4);
      m5 = new Mutation(s5);
      m6 = new Mutation(s6);
      m7 = new Mutation(s7);
      m8 = new Mutation(s8);
      m9 = new Mutation(s9);
      m10 = new Mutation(s10);
      m11 = new Mutation(s11);
      m12 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m12.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m4.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m6.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m7.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m8.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m9.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m10.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m11.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);

       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      mList2.add(m5);
      mList2.add(m6);
      mList2.add(m7);
      mList2.add(m8);
      mList2.add(m9);
      mList2.add(m10);
      mList2.add(m11);
      mList2.add(m12);
      bw2.addMutations(mList2);
      bw2.close();



      TupleExpr te = getTupleExpr(q3);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      
      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      Assert.assertEquals(3, ccv.getCcNodes().size());
      
      System.out.println(te);

    }
    
    
    
    
   
    
 @Test
    public void testOptimizeQ2DiffPriority() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicate" + DELIM + "uri:peesOn";
      String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
      String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "objectsubject", "objectpredicate", "objectobject");
      Mutation m1, m2, m3, m4, m5, m6;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m4 = new Mutation(s4 + DELIM + "1");
      m4.put(new Text("count"), new Text(""), new Value("3".getBytes()));
      m5 = new Mutation(s5 + DELIM + "1");
      m5.put(new Text("count"), new Text(""), new Value("3".getBytes()));
      mList.add(m1);
      mList.add(m2);
      mList.add(m3);
      mList.add(m4);
      mList.add(m5);

      bw1.addMutations(mList);
      bw1.close();


      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(s4);
      m5 = new Mutation(s5);
      m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(3)), EMPTY_VAL);
        m4.put(new Text(s), new Text(Integer.toString(3)), EMPTY_VAL);
        m5.put(new Text(s), new Text(Integer.toString(3)), EMPTY_VAL);
       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      mList2.add(m5);
      mList2.add(m6);
      bw2.addMutations(mList2);
      bw2.close();


      TupleExpr te = getTupleExpr(q5);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      List<QueryModelNode> nodes = Lists.newArrayList(ccv.getCcNodes());
      
      Assert.assertEquals(2, nodes.size());
      
      for(QueryModelNode q: nodes) {
          
          if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 2) {
              Assert.assertEquals("h", ((EntityTupleSet)q).getStarQuery().getCommonVarName());
          } else if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 3) {
              Assert.assertEquals("m", ((EntityTupleSet)q).getStarQuery().getCommonVarName());
          } else {
              Assert.assertTrue(false);
          }
      }
      
     
      
     
      
      System.out.println(te);

    }
    
    
    
    
    
    
 @Test
    public void testOptimizeQ2DiffPriority2() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicate" + DELIM + "uri:peesOn";
      String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
      String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "objectsubject", "objectpredicate", "objectobject");
      Mutation m1, m2, m3, m4, m5, m6;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m4 = new Mutation(s4 + DELIM + "1");
      m4.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m5 = new Mutation(s5 + DELIM + "1");
      m5.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      mList.add(m1);
      mList.add(m2);
      mList.add(m3);
      mList.add(m4);
      mList.add(m5);

      bw1.addMutations(mList);
      bw1.close();


      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(s4);
      m5 = new Mutation(s5);
      m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m4.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      mList2.add(m5);
      mList2.add(m6);
      bw2.addMutations(mList2);
      bw2.close();


      TupleExpr te = getTupleExpr(q5);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      List<QueryModelNode> nodes = Lists.newArrayList(ccv.getCcNodes());
      
      Assert.assertEquals(2, nodes.size());
      
      
      for(QueryModelNode q: nodes) {
          
          if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 2) {
              Assert.assertEquals("m", ((EntityTupleSet)q).getStarQuery().getCommonVarName());
          } else if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 3) {
              Assert.assertEquals("h", ((EntityTupleSet)q).getStarQuery().getCommonVarName());
          } else {
              Assert.assertTrue(false);
          }
      }
      
      
      System.out.println(te);

    }
    
   
    

    
    
 @Test
    public void testOptimizeQ6DiffPriority() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
      String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
      String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
      String s6 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:kibble";
      String s7 = "predicateobject" + DELIM + "uri:rollsIn" + DELIM + "uri:mud";
      String s8 = "predicateobject" + DELIM + "uri:runsIn" + DELIM + "uri:field";
      String s9 = "predicate" + DELIM + "uri:smells" ;
      String s10 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:sticks";
      String s11 = "predicate" + DELIM + "uri:watches";
      

      
      
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject","objectsubject", "objectpredicate", "objectobject");
      Mutation m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m4 = new Mutation(s4 + DELIM + "1");
      m4.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m5 = new Mutation(s5 + DELIM + "1");
      m5.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m6 = new Mutation(s6 + DELIM + "1");
      m6.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m7 = new Mutation(s7 + DELIM + "1");
      m7.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m8 = new Mutation(s8 + DELIM + "1");
      m8.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m9 = new Mutation(s9 + DELIM + "1");
      m9.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m10 = new Mutation(s10 + DELIM + "1");
      m10.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m11 = new Mutation(s11 + DELIM + "1");
      m11.put(new Text("count"), new Text(""), new Value("2".getBytes()));

      mList.add(m1);
      mList.add(m2);
      mList.add(m3);
      mList.add(m4);
      mList.add(m5);
      mList.add(m6);
      mList.add(m7);
      mList.add(m8);
      mList.add(m9);
      mList.add(m10);
      mList.add(m11);

      bw1.addMutations(mList);
      bw1.close();


      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(s4);
      m5 = new Mutation(s5);
      m6 = new Mutation(s6);
      m7 = new Mutation(s7);
      m8 = new Mutation(s8);
      m9 = new Mutation(s9);
      m10 = new Mutation(s10);
      m11 = new Mutation(s11);
      m12 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m12.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m4.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m6.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m7.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m8.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m9.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m10.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m11.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);

       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      mList2.add(m5);
      mList2.add(m6);
      mList2.add(m7);
      mList2.add(m8);
      mList2.add(m9);
      mList2.add(m10);
      mList2.add(m11);
      mList2.add(m12);
      bw2.addMutations(mList2);
      bw2.close();



      TupleExpr te = getTupleExpr(q6);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      List<QueryModelNode> nodes = Lists.newArrayList(ccv.getCcNodes());
      
      Assert.assertEquals(3, nodes.size());
      List<String> cVarList = Lists.newArrayList();
      cVarList.add("i");
      cVarList.add("m");
      
      for(QueryModelNode q: nodes) {
          
          if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 2) {
              String s = ((EntityTupleSet)q).getStarQuery().getCommonVarName();
              System.out.println("node is " + q  + " and common var is " + s);
              System.out.println("star query is " + ((EntityTupleSet)q).getStarQuery());
              Assert.assertTrue(cVarList.contains(s));
              cVarList.remove(s);
          } else if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 3) {
              Assert.assertEquals("h", ((EntityTupleSet)q).getStarQuery().getCommonVarName());
          } else {
              Assert.assertTrue(false);
          }
      }
      
      
      System.out.println(te);

    }
    
    
    
    
 
 
 
 
 
 
 
    @Test
    public void testOptimizeConstantPriority() throws Exception {

        AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
        accc.setConf(conf);
        accc.setConnector(accCon);
        accc.setRdfEvalDAO(res);
        accc.init();

        BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
        BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

        String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:chickens";
        String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:chickens";
        String s3 = "predicate" + DELIM + "uri:peesOn";
        String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
        String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
        List<Mutation> mList = new ArrayList<Mutation>();
        List<Mutation> mList2 = new ArrayList<Mutation>();
        List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "objectsubject",
                "objectpredicate", "objectobject");
        Mutation m1, m2, m3, m4, m5, m6;

        m1 = new Mutation(s1 + DELIM + "1");
        m1.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m2 = new Mutation(s2 + DELIM + "1");
        m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m3 = new Mutation(s3 + DELIM + "1");
        m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m4 = new Mutation(s4 + DELIM + "1");
        m4.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m5 = new Mutation(s5 + DELIM + "1");
        m5.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        mList.add(m1);
        mList.add(m2);
        mList.add(m3);
        mList.add(m4);
        mList.add(m5);

        bw1.addMutations(mList);
        bw1.close();

        m1 = new Mutation(s1);
        m2 = new Mutation(s2);
        m3 = new Mutation(s3);
        m4 = new Mutation(s4);
        m5 = new Mutation(s5);
        m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
        m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);

        for (String s : sList) {

            m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m4.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);

        }
        mList2.add(m1);
        mList2.add(m2);
        mList2.add(m3);
        mList2.add(m4);
        mList2.add(m5);
        mList2.add(m6);
        bw2.addMutations(mList2);
        bw2.close();

        TupleExpr te = getTupleExpr(q7);

        EntityOptimizer cco = new EntityOptimizer(accc);
        System.out.println("Originial query is " + te);
        cco.optimize(te, null, null);

        EntityCentricVisitor ccv = new EntityCentricVisitor();
        te.visit(ccv);

        List<QueryModelNode> nodes = Lists.newArrayList(ccv.getCcNodes());
        System.out.println("Test 7 nodes are :" + nodes);
        
        Assert.assertEquals(2, nodes.size());

        for (QueryModelNode q : nodes) {
            final StarQuery starQuery = ((EntityTupleSet) q).getStarQuery();
            if (starQuery.getNodes().size() == 2) {
                Assert.assertEquals("m", starQuery.getCommonVarName());
            } else if (starQuery.getNodes().size() == 3) {
                Assert.assertEquals("uri:chickens", starQuery.getCommonVarValue());
            } else {
                Assert.assertTrue(false);
            }
        }

        System.out.println(te);

    }
 
 
 
 
    
    
    @Test
    public void testOptimizeFilters() throws Exception {

        AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
        accc.setConf(conf);
        accc.setConnector(accCon);
        accc.setRdfEvalDAO(res);
        accc.init();

        BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
        BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

        String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:chickens";
        String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:chickens";
        String s3 = "predicate" + DELIM + "uri:peesOn";
        String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
        String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
        List<Mutation> mList = new ArrayList<Mutation>();
        List<Mutation> mList2 = new ArrayList<Mutation>();
        List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "objectsubject",
                "objectpredicate", "objectobject");
        Mutation m1, m2, m3, m4, m5, m6;

        m1 = new Mutation(s1 + DELIM + "1");
        m1.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m2 = new Mutation(s2 + DELIM + "1");
        m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m3 = new Mutation(s3 + DELIM + "1");
        m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m4 = new Mutation(s4 + DELIM + "1");
        m4.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        m5 = new Mutation(s5 + DELIM + "1");
        m5.put(new Text("count"), new Text(""), new Value("2".getBytes()));
        mList.add(m1);
        mList.add(m2);
        mList.add(m3);
        mList.add(m4);
        mList.add(m5);

        bw1.addMutations(mList);
        bw1.close();

        m1 = new Mutation(s1);
        m2 = new Mutation(s2);
        m3 = new Mutation(s3);
        m4 = new Mutation(s4);
        m5 = new Mutation(s5);
        m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
        m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);

        for (String s : sList) {

            m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m4.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
            m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);

        }
        mList2.add(m1);
        mList2.add(m2);
        mList2.add(m3);
        mList2.add(m4);
        mList2.add(m5);
        mList2.add(m6);
        bw2.addMutations(mList2);
        bw2.close();

        TupleExpr te = getTupleExpr(q8);
        (new FilterOptimizer()).optimize(te,null,null);
        
        EntityOptimizer cco = new EntityOptimizer(accc);
        System.out.println("Originial query is " + te);
        cco.optimize(te, null, null);
        

        EntityCentricVisitor ccv = new EntityCentricVisitor();
        te.visit(ccv);

        List<QueryModelNode> nodes = Lists.newArrayList(ccv.getCcNodes());
        System.out.println("Test 8 nodes are :" + nodes);
        
        Assert.assertEquals(2, nodes.size());

        for (QueryModelNode q : nodes) {
            final StarQuery starQuery = ((EntityTupleSet) q).getStarQuery();
            if (starQuery.getNodes().size() == 2) {
                Assert.assertEquals("m", starQuery.getCommonVarName());
            } else if (starQuery.getNodes().size() == 3) {
                Assert.assertEquals("uri:chickens", starQuery.getCommonVarValue());
            } else {
                Assert.assertTrue(false);
            }
        }

        System.out.println(te);

    }
 
    
    
    
    
    
    @Test
    public void testOptimizeFilter2() throws Exception {

      AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
      accc.setConf(conf);
      accc.setConnector(accCon);
      accc.setRdfEvalDAO(res);
      accc.init();

      BatchWriter bw1 = accCon.createBatchWriter("rya_prospects", config);
      BatchWriter bw2 = accCon.createBatchWriter("rya_selectivity", config);

      String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
      String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
      String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
      String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
      String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
      String s6 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:kibble";
      String s7 = "predicateobject" + DELIM + "uri:rollsIn" + DELIM + "uri:mud";
      String s8 = "predicateobject" + DELIM + "uri:runsIn" + DELIM + "uri:field";
      String s9 = "predicate" + DELIM + "uri:smells" ;
      String s10 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:sticks";
      String s11 = "predicate" + DELIM + "uri:watches";
      

      
      
      List<Mutation> mList = new ArrayList<Mutation>();
      List<Mutation> mList2 = new ArrayList<Mutation>();
      List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject","objectsubject", "objectpredicate", "objectobject");
      Mutation m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12;

      m1 = new Mutation(s1 + DELIM + "1");
      m1.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m2 = new Mutation(s2 + DELIM + "1");
      m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m3 = new Mutation(s3 + DELIM + "1");
      m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m4 = new Mutation(s4 + DELIM + "1");
      m4.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m5 = new Mutation(s5 + DELIM + "1");
      m5.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m6 = new Mutation(s6 + DELIM + "1");
      m6.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m7 = new Mutation(s7 + DELIM + "1");
      m7.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m8 = new Mutation(s8 + DELIM + "1");
      m8.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m9 = new Mutation(s9 + DELIM + "1");
      m9.put(new Text("count"), new Text(""), new Value("2".getBytes()));
      m10 = new Mutation(s10 + DELIM + "1");
      m10.put(new Text("count"), new Text(""), new Value("1".getBytes()));
      m11 = new Mutation(s11 + DELIM + "1");
      m11.put(new Text("count"), new Text(""), new Value("2".getBytes()));

      mList.add(m1);
      mList.add(m2);
      mList.add(m3);
      mList.add(m4);
      mList.add(m5);
      mList.add(m6);
      mList.add(m7);
      mList.add(m8);
      mList.add(m9);
      mList.add(m10);
      mList.add(m11);

      bw1.addMutations(mList);
      bw1.close();


      m1 = new Mutation(s1);
      m2 = new Mutation(s2);
      m3 = new Mutation(s3);
      m4 = new Mutation(s4);
      m5 = new Mutation(s5);
      m6 = new Mutation(s6);
      m7 = new Mutation(s7);
      m8 = new Mutation(s8);
      m9 = new Mutation(s9);
      m10 = new Mutation(s10);
      m11 = new Mutation(s11);
      m12 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
      m12.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
     

      for (String s : sList) {
       
        m1.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m2.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m3.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m4.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m5.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m6.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m7.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m8.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m9.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);
        m10.put(new Text(s), new Text(Integer.toString(1)), EMPTY_VAL);
        m11.put(new Text(s), new Text(Integer.toString(2)), EMPTY_VAL);

       
      }
      mList2.add(m1);
      mList2.add(m2);
      mList2.add(m3);
      mList2.add(m4);
      mList2.add(m5);
      mList2.add(m6);
      mList2.add(m7);
      mList2.add(m8);
      mList2.add(m9);
      mList2.add(m10);
      mList2.add(m11);
      mList2.add(m12);
      bw2.addMutations(mList2);
      bw2.close();



      TupleExpr te = getTupleExpr(q9);
      System.out.println(te);
      (new FilterOptimizer()).optimize(te,null,null);

      EntityOptimizer cco = new EntityOptimizer(accc);
      System.out.println("Originial query is " + te);
      cco.optimize(te, null, null);

      EntityCentricVisitor ccv = new EntityCentricVisitor();
      te.visit(ccv);
      
      List<QueryModelNode> nodes = Lists.newArrayList(ccv.getCcNodes());
      
      Assert.assertEquals(3, nodes.size());
      List<String> cVarList = Lists.newArrayList();
      cVarList.add("i");
      cVarList.add("m");
      
      for(QueryModelNode q: nodes) {
          
          if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 2) {
              String s = ((EntityTupleSet)q).getStarQuery().getCommonVarName();
              System.out.println("node is " + q  + " and common var is " + s);
              System.out.println("star query is " + ((EntityTupleSet)q).getStarQuery());
              Assert.assertTrue(cVarList.contains(s));
              cVarList.remove(s);
          } else if(((EntityTupleSet)q).getStarQuery().getNodes().size() == 3) {
              Assert.assertEquals("h", ((EntityTupleSet)q).getStarQuery().getCommonVarName());
          } else {
              Assert.assertTrue(false);
          }
      }
      
      
      System.out.println(te);

    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    private TupleExpr getTupleExpr(String query) throws MalformedQueryException {

        SPARQLParser sp = new SPARQLParser();
        ParsedQuery pq = sp.parseQuery(query, null);

        return pq.getTupleExpr();
      }
    
    
    
    
    
    
    private class EntityCentricVisitor extends AbstractQueryModelVisitor<RuntimeException> {
        
        private Set<QueryModelNode> ccNodes = Sets.newHashSet();
        
        public Set<QueryModelNode> getCcNodes() {
            return ccNodes;
        }
        
        
        public void meetNode(QueryModelNode node) {
            
            if(node instanceof EntityTupleSet) {
                ccNodes.add(node);
            }
            
            super.meetNode(node);
        }
        
        
        
        
    }
    
    
    
    
    
    
    
    

}
