/*
 * 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.
 */
/*
 * Created on Nov 15, 2005
 *
 * TODO To change the template for this generated file go to Window - Preferences - Java - Code
 * Style - Code Templates
 */
package org.apache.geode.cache.query.internal;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;

import org.apache.geode.LogWriter;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.query.CacheUtils;
import org.apache.geode.cache.query.IndexType;
import org.apache.geode.cache.query.QueryService;
import org.apache.geode.cache.query.data.Address;
import org.apache.geode.cache.query.data.Employee;
import org.apache.geode.cache.query.data.Portfolio;
import org.apache.geode.cache.query.internal.index.IndexManager;
import org.apache.geode.cache.query.internal.parse.OQLLexerTokenTypes;
import org.apache.geode.internal.cache.LocalRegion;
import org.apache.geode.test.junit.categories.IntegrationTest;

/**
 *
 *
 */
@Category(IntegrationTest.class)
public class CompiledJunctionInternalsJUnitTest {

  Region region;
  QueryService qs;

  @Before
  public void setUp() throws Exception {
    CacheUtils.startCache();
    region = CacheUtils.createRegion("portfolio", Portfolio.class);
    region.put("0", new Portfolio(0));
    region.put("1", new Portfolio(1));
    region.put("2", new Portfolio(2));
    region.put("3", new Portfolio(3));
    qs = CacheUtils.getQueryService();
  }

  /*************************************************
   * AND JUNCTION TESTS. RangeJunction related tests when part of GroupJunction,
   * CompositeGroupJunction or AllGroupJunction
   **************************************************/

  // Case 1: When a Single GroupJunction contains multiple
  // RangeJunctionEvaluators for AND
  @Test
  public void testMultipleRangeJunctionsInAGroupJunction() {
    QCompiler compiler = new QCompiler();
    List list = compiler.compileFromClause("/portfolio p, p.positions");
    ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
    context.newScope(context.associateScopeID());
    try {
      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }

      // case id > 7 and id < 10 and status > abc and status < xyz
      CompiledComparison cv[] = new CompiledComparison[4];

      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("abc")), OQLLexerTokenTypes.TOK_GT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral("xyz"), OQLLexerTokenTypes.TOK_LT);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("The Organized operand object is null", oo);
      assertTrue("Filter Operand  did not happen to be an instance of GroupJunction",
          oo.filterOperand instanceof GroupJunction);
      assertNull("Iterate Operand  not coming out to be null", oo.iterateOperand);
      assertTrue("The Conditions in GroupJunction not equal to 2",
          ((GroupJunction) oo.filterOperand).getOperands().size() == 2);
      GroupJunction gj = (GroupJunction) oo.filterOperand;
      assertTrue(gj.getOperands().get(0) instanceof RangeJunction);
      assertTrue(gj.getOperands().get(1) instanceof RangeJunction);
      RangeJunction r1 = (RangeJunction) gj.getOperands().get(0);
      RangeJunction r2 = (RangeJunction) gj.getOperands().get(1);
      assertEquals(2, r1._operands.length);
      assertEquals(2, r2._operands.length);
      OrganizedOperands oo2 = r1.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator(oo2.filterOperand));
      oo2 = r2.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator(oo2.filterOperand));

    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }


  // Case 2: When a Single GroupJunction contains multiple
  // RangeJunctions and a sinlge indexable compiledcomparison for AND
  @Test
  public void testMultipleRangeJunctionsAndAnIndexableConditionInAGroupJunction() {
    QCompiler compiler = new QCompiler();
    List list = compiler.compileFromClause("/portfolio p, p.positions");
    ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
    context.newScope(context.associateScopeID());
    try {
      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      qs.createIndex("createTime", IndexType.FUNCTIONAL, "createTime", "/portfolio");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }

      // case id > 7 and id < 10 and status > abc and status < xyz and
      // createTime >7
      CompiledComparison cv[] = new CompiledComparison[5];

      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("abc")), OQLLexerTokenTypes.TOK_GT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral("xyz"), OQLLexerTokenTypes.TOK_LT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "createTime"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("The Organized operand object is null", oo);
      assertTrue("Filter Operand  did not happen to be an instance of GroupJunction",
          oo.filterOperand instanceof GroupJunction);
      assertNull("Iterate Operand  not coming out to be null", oo.iterateOperand);
      assertTrue("The Conditions in GroupJunction not equal to 3",
          ((GroupJunction) oo.filterOperand).getOperands().size() == 3);
      GroupJunction gj = (GroupJunction) oo.filterOperand;
      CompiledValue ops[] = gj._operands;
      int index = -1;
      int one = -1;
      int two = -1;
      if (ops[0] == cv[4]) {
        index = 0;
        one = 1;
        two = 2;
      } else if (ops[1] == cv[4]) {
        index = 1;
        one = 0;
        two = 2;
      } else if (ops[2] == cv[4]) {
        index = 2;
        one = 0;
        two = 1;
      } else {
        fail("Missing single condition");
      }
      assertTrue(ops[index] == cv[4]);
      assertTrue(ops[one] instanceof RangeJunction);
      assertTrue(ops[two] instanceof RangeJunction);

      RangeJunction r1 = (RangeJunction) gj._operands[one];
      RangeJunction r2 = (RangeJunction) gj._operands[two];
      assertEquals(2, r1._operands.length);
      assertEquals(2, r2._operands.length);
      OrganizedOperands oo2 = r1.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator(oo2.filterOperand));
      oo2 = r2.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator(oo2.filterOperand));

    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Case 3: A Composite GroupJunction containing just a single RangeJunction
  // FOR AND clause. In such case a CompisteGroupJunction should contain a
  // GroupJunction and the GroupJunction should contain a CompiledJunction as
  // iter operand
  // portfolio.id= employee.id and p.id > 3 and p.id <10 and p.status =active
  // and p.type=abc
  // and emp.age = 1
  @Test
  public void testSingleRangeJunctionInACompositeGroupJunction() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      // qs.createIndex("statusIndex",
      // IndexType.FUNCTIONAL,"status","/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      qs.createIndex("empid", IndexType.FUNCTIONAL, "empId", "/employees");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[6];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "age"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_EQ);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(3)), OQLLexerTokenTypes.TOK_GT);
      cv[5] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LT);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter operand of OO not CompositeGroupJunction",
          oo.filterOperand instanceof CompositeGroupJunction);
      CompositeGroupJunction cgj = (CompositeGroupJunction) oo.filterOperand;
      List filterableCC = cgj.getFilterableCCList();
      assertTrue("No. of filterable CC  not equal to 1", filterableCC.size() == 1);
      assertNotNull("1 RangeJunction inside CompositeGroupJunction should have existed",
          cgj.getGroupJunctionList());
      assertTrue(" Complete expansion flag should have been true", cgj.getExpansionFlag());
      assertNotNull("Iter operands list in CGJ should  be not null", cgj.getIterOperands());
      List ietrOps = cgj.getIterOperands();
      assertTrue(ietrOps.contains(cv[2]));
      assertTrue(cgj.getGroupJunctionList().size() == 1);
      assertTrue(cgj.getGroupJunctionList().get(0) instanceof RangeJunction);
      RangeJunction rg = (RangeJunction) cgj.getGroupJunctionList().get(0);
      OrganizedOperands oo1 = rg.organizeOperands(context);
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[0]));
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[1]));
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator(oo1.filterOperand));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorGreaterKey(oo1.filterOperand)
          .equals(new Integer(3)));
      assertTrue(
          RangeJunction.getDoubleCondnEvaluatorLESSKey(oo1.filterOperand).equals(new Integer(10)));
      /*
       * assertTrue( " The size of itr operands should be 3 but size happens to be = " +
       * cgj.getIterOperands().size(), cgj.getIterOperands().size() == 3);
       */
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  /**
   * Tests that the organized operands work correctly whether it is multiple GroupJunctions as part
   * of AllGroupJunction or a RangeJunction and GroupJunction. Since where previously it used to be
   * only Group can now be Group or Range , the source code needs to ensure that it does not type
   * cast wrongly a RangeJunction into a GroupJunction. Instead the source code should only type
   * cast it to AbstractGroupOrRangeJunction Case p.status = active and p.type = type1 and emp.id
   * >10 and p.id > 10 and p.id > 15
   */
  @Test
  public void testMultipleIndependentRegionsWithOnlyOneRegionHavingFilterEvaluatableCondition() {
    // Here there will be a single RangeJunction with the iter evaluatable
    // conditions of the other
    // independent iterator becoming the part of this single RangeJunction
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio p");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);

      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(15)), OQLLexerTokenTypes.TOK_GT);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter operand of OO not a RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[0]));
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[1]));
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[2]));
      assertTrue(oo1.filterOperand == cv[4]);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  /**
   * Tests that the organized operands work correctly whether it is multiple GroupJunctions as part
   * of AllGroupJunction or a RangeJunction and GroupJunction. Since where previously it used to be
   * only Group can now be Group or Range , the source code needs to ensure that it does not type
   * cast wrongly a RangeJunction into a GroupJunction. Instead the source code should only type
   * cast it to AbstractGroupOrRangeJunction Case p.status = active and p.type = type1 and emp.id
   * >10 and p.id > 10 and p.id > 15
   */
  @Test
  public void testMultipleIndependentRegionsWithRangeJunction() {

    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      // qs.createIndex("statusIndex",
      // IndexType.FUNCTIONAL,"status","/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio p");
      qs.createIndex("empid", IndexType.FUNCTIONAL, "empId", "/employees e");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);

      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(15)), OQLLexerTokenTypes.TOK_GT);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter operand of OO not AllGroupJunction",
          oo.filterOperand instanceof AllGroupJunction);
      AllGroupJunction agj = (AllGroupJunction) oo.filterOperand;
      List filterableCC = agj.getGroupOperands();
      assertTrue(agj.getIterOperands().isEmpty());
      assertTrue(agj.getGroupOperands().size() == 2);
      assertTrue(agj.getGroupOperands().get(0) instanceof GroupJunction
          || agj.getGroupOperands().get(1) instanceof GroupJunction);
      assertTrue(agj.getGroupOperands().get(0) instanceof RangeJunction
          || agj.getGroupOperands().get(1) instanceof RangeJunction);
      RangeJunction rj = null;
      if (agj.getGroupOperands().get(0) instanceof RangeJunction) {
        rj = (RangeJunction) agj.getGroupOperands().get(0);
      } else {
        rj = (RangeJunction) agj.getGroupOperands().get(1);
      }

      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[4]);
      assertNotNull(oo1.iterateOperand);
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[0]));
      assertTrue(((CompiledJunction) oo1.iterateOperand).getOperands().contains(cv[1]));
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }

  }

  /** ********************************************************************** */
  // Asif: Since this is a single region & part fropm Group Junction
  // no other filter is there , we shoudl get a SingleGroupJucntion as
  // filter operand of CompiledJunction & not iter operand in Compiled
  // Juncion
  @Test
  public void testOrganizedOperandsSingleGroupJunctionSingleFilter() {
    // compileFromClause returns a List<CompiledIteratorDef>
    QCompiler compiler = new QCompiler();
    List list = compiler.compileFromClause("/portfolio p, p.positions");
    ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
    context.newScope(context.associateScopeID());
    try {
      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("The Organized operand object is null", oo);
      assertTrue("Filter Operand  did not happen to be an instance of GroupJunction",
          oo.filterOperand instanceof GroupJunction);
      assertNull("Iterate Operand  not coming out to be null", oo.iterateOperand);
      assertTrue("The Conditions in GroupJunction not equal to 3",
          ((GroupJunction) oo.filterOperand).getOperands().size() == 3);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Asif: Since this is a single region & apart from GroupJunction
  // there exists another filter , We shoudl get two Filter operands
  // One as GroupJunction & the other one the other Filter operand.
  // The un indexed condition should become part of iter operand
  // of CompiledJunction
  @Test
  public void testOrganizedOperandsSingleGroupJunctionMultipleFilter() {
    // compileFromClause returns a List<CompiledIteratorDef>
    QCompiler compiler = new QCompiler();
    List list = compiler.compileFromClause("/portfolio p, p.positions");
    ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
    context.newScope(context.associateScopeID());
    try {
      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledLiteral(Boolean.TRUE),
          new CompiledLiteral(Boolean.TRUE), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type CompiledJunction",
          oo.filterOperand instanceof CompiledJunction);
      CompiledJunction temp = (CompiledJunction) oo.filterOperand;
      List operands = temp.getOperands();
      assertTrue("The number of Filter operands not coming to be 2", operands.size() == 2);
      assertTrue(
          "The independent operand shoudl be the first operand of the set of Filter Operands",
          operands.get(0) == cv[3]);
      assertTrue(operands.get(1) instanceof GroupJunction);
      List temp1 = ((GroupJunction) operands.get(1)).getOperands();
      assertTrue("The number & nature of CompiledComparison of Group Junction not as expected",
          temp1.get(0) == cv[0]);
      assertTrue("The number & nature of CompiledComparison of Group Junction not as expected",
          temp1.get(1) == cv[1]);
      assertNotNull("The iter operand of OO is null", oo.iterateOperand);
      assertTrue("IterOperand of OO not as expectd", oo.iterateOperand == cv[2]);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Asif: There are two regions in query but since the conditions in where
  // clause
  // pertain to single region , we still will have a GroupJunction as a filter
  // operand.
  // Since there is only One Filter condition , we should have iter operand
  // as null;
  @Test
  public void testOrganizedOperandsGroupJunctionSingleFilterDoubleRegion() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO turning out to be null", oo);
      assertTrue("Filter operand of OO not a GroupJunction",
          oo.filterOperand instanceof GroupJunction);
      GroupJunction temp = (GroupJunction) oo.filterOperand;
      List operands = temp.getOperands();
      assertTrue("No. of conditions in Group Junction not as expected of size 3",
          operands.size() == 3);
      assertNull("The iter operand of OO should have bee null", oo.iterateOperand);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed due to Exception = " + e);
    }
  }

  // Asif: There are two regions in query with a equi join condition. The other
  // conditions do not have index
  // on them. In such case we should have single CompositeGroupJunction . The
  // filterable cc list
  // size should be 1.
  @Test
  public void testOrganizedOperandsSingleCompositeGroupJunctionSingleFilterDoubleRegionWithNoGroupJunction() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      // qs.createIndex("statusIndex",
      // IndexType.FUNCTIONAL,"status","/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      qs.createIndex("empid", IndexType.FUNCTIONAL, "empId", "/employees");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "age"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter operand of OO not CompositeGroupJunction",
          oo.filterOperand instanceof CompositeGroupJunction);
      CompositeGroupJunction cgj = (CompositeGroupJunction) oo.filterOperand;
      List filterableCC = cgj.getFilterableCCList();
      assertTrue("No. of filterable CC  not equal to 1", filterableCC.size() == 1);
      assertNull("No GroupJunction inside CompositeGroupJunction should have existed",
          cgj.getGroupJunctionList());
      assertTrue(" Complete expansion flag should have been true", cgj.getExpansionFlag());
      assertNotNull("Iter operands list in CGJ should not be null", cgj.getIterOperands());
      assertTrue(" The size of itr operands should be 3 but size happens to be = "
          + cgj.getIterOperands().size(), cgj.getIterOperands().size() == 3);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Asif: There are two regions in query with the conditions in where clause
  // for both the regions ,but as only conditions belonging to only
  // one group is filter evaluatable , we will have a GroupJunction as a filter
  // operand.
  // Since there are two filter operands, the iter operands belonging to the
  // other Group ( which
  // is not filter evaluatable , should get added to the iter operands of
  // CompiledJunction
  // So the iter operand of CompiledJunction should
  // have one value ( which originally would have gone to GroupJunction)
  @Test
  public void testOrganizedOperandsGroupJunctionDoubleFilterDoubleRegion() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "age"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_EQ);
      cv[4] = new CompiledComparison(new CompiledLiteral(Boolean.TRUE),
          new CompiledLiteral(Boolean.TRUE), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter Operand of OO is not CompiledJunction",
          oo.filterOperand instanceof CompiledJunction);
      CompiledJunction cj1 = ((CompiledJunction) oo.filterOperand);
      assertTrue("Filter opreands of OO not of size 2", cj1.getOperands().size() == 2);
      assertTrue("Indpenednet operand is not the first operand of OO filter",
          cj1.getOperands().get(0) == cv[4]);
      assertTrue("Second Operand of OO Filter not a GroupJunction ",
          cj1.getOperands().get(1) instanceof GroupJunction);
      GroupJunction gj = ((GroupJunction) cj1.getOperands().get(1));
      List opsGJ = gj.getOperands();
      // List its = agj.getIterOperands();
      assertTrue("Operands in GroupJunction not of size 3", opsGJ.size() == 3);
      assertTrue("Complete expansion flag of GroupJunction should be true", gj.getExpansionFlag());
      assertNotNull("Iter operand of OO is null", oo.iterateOperand);
      assertTrue("IterOperand of OO not the condition which was expected",
          oo.iterateOperand == cv[3]);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Asif: There are two regions in query with the conditions in where clause
  // for both the regions such that both the GroupJunctions are filter
  // evaluatable
  // So we should get an AllGroupJunction as a result of organizeOperands of
  // CompiledJunction
  @Test
  public void testOrganizedOperandsAllGroupJunctionWithTwoGroupJunctions() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause("/portfolio p, p.positions,/employees e");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      qs.createIndex("empidIndex", IndexType.FUNCTIONAL, "empId", "/employees");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "age"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_EQ);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter Operand of OO is not AllGroupJunction",
          oo.filterOperand instanceof AllGroupJunction);
      AllGroupJunction agj = ((AllGroupJunction) oo.filterOperand);
      assertTrue("No of GroupJunctions should be2", agj.getGroupOperands().size() == 2);
      assertNull("Iter operand of OO is not null", oo.iterateOperand);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Asif: There are 3 regions in the query. Two regionsare tied by a join which
  // will create
  // a CompositeGroupJunction . One region has an independent condition & so it
  // will
  // form a GroupJunction . Sinc ethis GroupJunction is outside
  // CompositeGroupJunction
  // we will have an AllGroupJunction. Within the CompositeGroupJunction , we
  // will have one
  // GroupJunction. One Filterable CC & no iter operand. Howver th eiet operand
  // of
  // allGroupJunction will be null & will contain one operand
  @Test
  public void testOrganizedOperandsAllGroupJunctionWithOneGroupJunctionAndOneCompositeGroupJunction() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      Region r4 = CacheUtils.createRegion("portfolio1", Portfolio.class);
      for (int i = 0; i < 4; i++) {
        r4.put(i + "", new Portfolio(i));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list =
          compiler.compileFromClause("/portfolio p, p.positions,/employees e, /portfolio1 p1");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      qs.createIndex("idIndex1", IndexType.FUNCTIONAL, "ID", "/portfolio1");
      qs.createIndex("empidIndex", IndexType.FUNCTIONAL, "empId", "/employees");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"),
          new CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "type"),
          new CompiledLiteral(new String("type1")), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "age"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_EQ);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p1"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter Operand of OO is not AllGroupJunction",
          oo.filterOperand instanceof AllGroupJunction);
      AllGroupJunction agj = ((AllGroupJunction) oo.filterOperand);
      assertTrue("No of GroupJunctions should be 2", agj.getGroupOperands().size() == 2);
      assertNotNull("The Iter operand should be not null", agj.getIterOperands());
      assertTrue("The Iter operand should be of size = 1", agj.getIterOperands().size() == 1);
      assertTrue("The Iter operand not matching the correct compiled comaprison",
          agj.getIterOperands().get(0) == cv[2]);
      // The List below should have two elements . One a GroupJunction & another
      // a CompositeGroupJunction
      List groupOps = agj.getGroupOperands();
      Iterator itr = groupOps.iterator();
      CompositeGroupJunction cgj = null;
      GroupJunction gj = null;
      while (itr.hasNext()) {
        Object temp = itr.next();
        if (temp instanceof CompositeGroupJunction) {
          cgj = (CompositeGroupJunction) temp;
        } else if (temp instanceof GroupJunction) {
          gj = (GroupJunction) temp;
        } else {
          fail(" The junction list in AllGroupJunction is not correct");
        }
      }
      assertTrue(" The CGJ formed is incorrect",
          cgj.getGroupJunctionList() != null && cgj.getGroupJunctionList().size() == 1
              && cgj.getIterOperands() == null && cgj.getFilterableCCList().get(0) == cv[3]
              && !cgj.getExpansionFlag());
      assertTrue(" The GJ inside CGJ is incorrect",
          ((GroupJunction) cgj.getGroupJunctionList().get(0)).getOperands().size() == 2
              && !((GroupJunction) cgj.getGroupJunctionList().get(0)).getExpansionFlag());
      assertTrue(" The GJ of AllGroupJunction is incorrect", !gj.getExpansionFlag()
          && gj.getOperands().size() == 1 && gj.getOperands().get(0) == cv[4]);
      assertNull("Iter operand of OO is not null", oo.iterateOperand);
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }

  // Asif: There are two regions in query with a equi join condition. The other
  // conditions do not have index
  // on them. In such case we should have single CompositeGroupJunction . The
  // filterable cc list
  // size should be 1.
  @Test
  public void testOrganizedOperandsSingleCompositeGroupJunctionSingleFilterFourRegionsWithNoGroupJunction() {
    try {
      Region r3 = CacheUtils.createRegion("employees", Employee.class);
      Set add1 = new HashSet();
      add1.add(new Address("411045", "Baner"));
      add1.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      Region r2 = CacheUtils.createRegion("employees1", Employee.class);
      Set add2 = new HashSet();
      add2.add(new Address("411045", "Baner"));
      add2.add(new Address("411001", "DholePatilRd"));
      for (int i = 0; i < 4; i++) {
        r2.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1));
      }
      Region r4 = CacheUtils.createRegion("portfolio1", Portfolio.class);
      for (int i = 0; i < 4; i++) {
        r4.put(i + "", new Portfolio(i));
      }
      // compileFromClause returns a List<CompiledIteratorDef>
      QCompiler compiler = new QCompiler();
      List list = compiler.compileFromClause(
          "/portfolio p, p.positions,/employees e, /employees1 e1, /portfolio p1");
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      context.newScope(context.associateScopeID());

      // qs.createIndex("statusIndex",
      // IndexType.FUNCTIONAL,"status","/portfolio");
      qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
      qs.createIndex("empid", IndexType.FUNCTIONAL, "empId", "/employees");
      qs.createIndex("empid1", IndexType.FUNCTIONAL, "empId", "/employees1");
      qs.createIndex("idIndex1", IndexType.FUNCTIONAL, "ID", "/portfolio1");
      Iterator iter = list.iterator();
      while (iter.hasNext()) {
        CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
        context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
        RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
        context.bindIterator(rIter);
        context.addToIndependentRuntimeItrMap(iterDef);
      }
      CompiledComparison cv[] = new CompiledComparison[3];
      /*
       * cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "status"), new
       * CompiledLiteral(new String("active")), OQLLexerTokenTypes.TOK_EQ); cv[1] = new
       * CompiledComparison(new CompiledPath(new CompiledID("p"), "type"), new CompiledLiteral(new
       * String("type1")), OQLLexerTokenTypes.TOK_EQ); cv[2] = new CompiledComparison(new
       * CompiledPath(new CompiledID("e"), "age"), new CompiledLiteral(new Integer(1)),
       * OQLLexerTokenTypes.TOK_EQ);
       */
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("e"), "empId"),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("e1"), "empId"),
          new CompiledPath(new CompiledID("p1"), "ID"), OQLLexerTokenTypes.TOK_EQ);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("e1"), "empId"),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_EQ);
      CompiledJunction cj = new CompiledJunction(cv, OQLLexerTokenTypes.LITERAL_and);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      OrganizedOperands oo = cj.testOrganizedOperands(context);
      assertNotNull("OO is null", oo);
      assertTrue("Filter operand of OO not CompositeGroupJunction",
          oo.filterOperand instanceof CompositeGroupJunction);
      CompositeGroupJunction cgj = (CompositeGroupJunction) oo.filterOperand;
      List filterableCC = cgj.getFilterableCCList();
      assertTrue("No. of filterable CC  not equal to 3", filterableCC.size() == 3);
      assertNull("No GroupJunction inside CompositeGroupJunction should have existed",
          cgj.getGroupJunctionList());
      assertTrue(" Complete expansion flag should have been true", cgj.getExpansionFlag());
      /*
       * assertNotNull("Iter operands list in CGJ should not be null", cgj .getIterOperands());
       * assertTrue( " The size of itr operands should be 3 but size happens to be = " +
       * cgj.getIterOperands().size(), cgj.getIterOperands().size() == 3);
       */
    } catch (Exception e) {
      e.printStackTrace();
      fail("Test failed sue to Exception = " + e);
    }
  }


  // Tests for plain creation of RangeJunction ( single or within a Group or CompositeGroup or
  // AllGroup )
  // which is agnostic of whether the RangeJunction is of type AND or OR
  //////////////////////////////////////////////////////////////////////////////////////
  /**
   * Tests the creation of a single RangeJunction if the CompiledJunction only contains same index
   * condition without iter operand for AND
   */
  @Test
  public void testOrganizedOperandsSingleRangeJunctionCreationWithNoIterOperandForAND() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      CompiledComparison cv[] = null;
      cv = new CompiledComparison[12];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[5] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[7] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[8] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[9] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[10] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[11] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the creation of a single RangeJunction if the CompiledJunction only contains same index
   * condition and an iter operand for AND
   */
  @Test
  public void testOrganizedOperandsSingleRangeJunctionCreationWithIterOperandForAND() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[13];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[5] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[7] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[8] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[9] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[10] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[11] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[12] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "createTime"),
          new CompiledLiteral(new Long(7)), OQLLexerTokenTypes.TOK_NE);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the creation of a single RangeJunction if the CompiledJunction only contains same index
   * condition without iter operand for OR
   */
  @Ignore
  @Test
  public void testOrganizedOperandsSingleRangeJunctionCreationWithNoIterOperandForOR() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[12];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[5] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_EQ);
      cv[7] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[8] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[9] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[10] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[11] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_or, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type CompiledJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }
  //////////////////////////////////////////////////////////////////////////////

  /// ***************************BEGIN*********************************************//
  // Tests the RangeJunction's organizeOperands for the correct creation of Evaluator.
  // These tests are dependent on whether the RangeJunction is of type AND or OR
  // All the tests below are for AND
  /**
   * Tests the functionality of organizedOperands function of a RangeJunction which is an AND with
   * no IterOperand. If the RangeJunction boils down to a single condition which can be evalauted as
   * a CompiledComparison then the filter operand will be a CompiledComparison
   *
   */
  @Test
  public void testOrganizedOperandsOfSingleRangeJunctionWithNoIterOperandForAND_1() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_LT);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertNotNull(oo1);
      assertNull(oo1.iterateOperand);
      assertNotNull(oo1.filterOperand);
      assertEquals(oo1.filterOperand, cv[2]);

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the functionality of organizedOperands function of a RangeJunction which is an AND with
   * no IterOperand but where the operator needs reflection. as the condition is Key > Path ( which
   * means Path less than Key) If the RangeJunction boils down toa single condition which can be
   * evalauted as a CompiledComparison then the filter operand will be a CompiledComparison
   *
   */
  @Test
  public void testOrganizedOperandsOfSingleRangeJunctionWithNoIterOperandForAND_2() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GT);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertNotNull(oo1);
      assertNull(oo1.iterateOperand);
      assertNotNull(oo1.filterOperand);
      assertEquals(oo1.filterOperand, cv[2]);

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }



  /**
   * Tests the functionality of organizedOperands function of a RangeJunction which is an AND with a
   * IterOperand but where the operator needs reflection. as the condition is Key > Path ( which
   * means Path less than Key) The RangeJunction boils down to a single condition which can be
   * evalauted as a CompiledComparison so the filter operand will be a CompiledComparison. Thus the
   * organizdeOperand's filter operand will be a CompiledComparison while its Iteroperand will be a
   * CompiledComparison
   *
   */
  @Test
  public void testOrganizedOperandsOfSingleRangeJunctionWithIterOperandForAND_1() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "createTime"), OQLLexerTokenTypes.TOK_GT);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertNotNull(oo1);
      assertEquals(cv[3], oo1.iterateOperand);
      assertEquals(oo1.filterOperand, cv[2]);

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }


  /**
   * Tests the functionality of organizedOperands function of a RangeJunction which is an AND with
   * two IterOperands but where the operator needs reflection. as the condition is Key > Path (
   * which means Path less than Key) The RangeJunction boils down to a single condition which can be
   * evalauted as a CompiledComparison so the filter operand will be a CompiledComparison. Thus the
   * organizdeOperand's filter operand will be a CompiledComparison while its Iteroperand will be a
   * CompiledJunction
   *
   */
  @Test
  public void testOrganizedOperandsOfSingleRangeJunctionWithTwoIterOperandsForAND_2() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "createTime"), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledLiteral(new String("xyz")),
          new CompiledPath(new CompiledID("p"), "getPk"), OQLLexerTokenTypes.TOK_GT);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertNotNull(oo1);
      assertTrue(oo1.iterateOperand instanceof CompiledJunction);
      assertTrue(oo1.iterateOperand.getChildren().size() == 2);
      assertTrue(oo1.iterateOperand.getChildren().get(0) == cv[3]);
      assertTrue(oo1.iterateOperand.getChildren().get(1) == cv[4]);
      assertEquals(oo1.filterOperand, cv[2]);

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the functionality of organizedOperands function of a RangeJunction which is an AND with
   * two IterOperands but where the operator needs reflection. as the condition is Key > Path (
   * which means Path less than Key) The RangeJunction boils down to a condition and a NOT EQUAL
   * which will be evalauted as a SingleCondnEvaluator so the filter operand will be a
   * SingleCondnEvaluator. Its Iter operand will be a CompiledJunction
   *
   */
  @Test
  public void testOrganizedOperandsOfSingleRangeJunctionWithTwoIterOperandsForAND_3() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      // case1: a <7 and a<=5 and 2>a and 2> createTime and "xyz" > pid
      // and 100 != a and 200 !=a and 1 != a
      cv = new CompiledComparison[8];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "createTime"), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledLiteral(new String("xyz")),
          new CompiledPath(new CompiledID("p"), "getPk"), OQLLexerTokenTypes.TOK_GT);
      cv[5] = new CompiledComparison(new CompiledLiteral(new Integer(100)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledLiteral(new Integer(200)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_NE);

      cv[7] = new CompiledComparison(new CompiledLiteral(new Integer(1)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_NE);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertNotNull(oo1);
      assertTrue(oo1.iterateOperand instanceof CompiledJunction);
      assertTrue(oo1.iterateOperand.getChildren().size() == 2);
      assertTrue(oo1.iterateOperand.getChildren().get(0) == cv[3]);
      assertTrue(oo1.iterateOperand.getChildren().get(1) == cv[4]);
      assertTrue(RangeJunction.isInstanceOfSingleCondnEvaluator(oo1.filterOperand));
      Set keysToRemove = RangeJunction.getKeysToBeRemoved(oo1.filterOperand);
      assertEquals(1, keysToRemove.size());
      assertTrue(keysToRemove.contains(new Integer(1)));

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the functionality of organizedOperands function of a RangeJunction which is an AND with
   * two IterOperands but where the operator needs reflection. as the condition is Key <= Path (
   * which means Path less than Key) The RangeJunction boils down to a condition and a NOT EQUAL
   * which will be evalauted as a SingleCondnEvaluator so the filter operand will be a
   * SingleCondnEvaluator. Its Iter operand will be a CompiledJunction. This checks for the
   * SingleCondnEvaluator with > operator
   *
   */
  @Test
  public void testOrganizedOperandsOfSingleRangeJunctionWithTwoIterOperandsForAND_4() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      cv = new CompiledComparison[7];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_GT);
      cv[2] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledLiteral(new Integer(2)),
          new CompiledPath(new CompiledID("p"), "createTime"), OQLLexerTokenTypes.TOK_GT);
      cv[4] = new CompiledComparison(new CompiledLiteral(new String("xyz")),
          new CompiledPath(new CompiledID("p"), "getPk"), OQLLexerTokenTypes.TOK_GT);
      cv[5] = new CompiledComparison(new CompiledLiteral(new Integer(100)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledLiteral(new Integer(200)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_NE);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertNotNull("OrganizedOperand object is null", oo);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      assertEquals(cv.length, rj.getOperands().size());
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertNotNull(oo1);
      assertTrue(oo1.iterateOperand instanceof CompiledJunction);
      assertTrue(oo1.iterateOperand.getChildren().size() == 2);
      assertTrue(oo1.iterateOperand.getChildren().get(0) == cv[3]);
      assertTrue(oo1.iterateOperand.getChildren().get(1) == cv[4]);
      assertTrue(RangeJunction.isInstanceOfSingleCondnEvaluator(oo1.filterOperand));
      Set keysToRemove = RangeJunction.getKeysToBeRemoved(oo1.filterOperand);
      assertEquals(2, keysToRemove.size());
      assertTrue(keysToRemove.contains(new Integer(100)));
      assertTrue(keysToRemove.contains(new Integer(200)));

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the functionality of organizedOperands function of a RangeJunction for various
   * combinations of GREATER THAN and Not equal conditions etc which results in a
   * SingleCondnEvaluator or CompiledComparison for a AND junction. It checks the correctness of the
   * operator & the evaluated key
   *
   */
  @Test
  public void testOrganizedOperandsSingleCondnEvalMultipleGreaterThanInEqualities_AND() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      /** **********For ALL greater or greater than combinations********* */
      // Case 1 : a >7 and a >=4 and a > 5 and a > 7
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0] || oo1.filterOperand == cv[3]);
      // Case2: a>=8 and a >4 and a>=6 and a>=8
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_GE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0] || oo1.filterOperand == cv[3]);
      cv = new CompiledComparison[5];
      // Case 3 : 7 < a and a >=4 and a > 5 and a >= 7 and a != 15
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_GT);
      cv[3] = new CompiledComparison(new CompiledLiteral(new Integer(7)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_LT);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(15)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfSingleCondnEvaluator(oo1.filterOperand));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GT);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction.getIndex(oo1.filterOperand).getName().equals("idIndex"));
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).size() == 1 && RangeJunction
          .getKeysToBeRemoved(oo1.filterOperand).iterator().next().equals(new Integer(15)));
      // Case 4 : 7 < a and a >=7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledLiteral(new Integer(7)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);
      // Case 5 : a > 7 and a >=7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);

      // Case 6 : a >= 7 and a >7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);

      // Case 7 : a >= 8 and a >7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);

      // Case 8 : a >=8 and a > =7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);

      // Case 9 : a >=7 and a > =8
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);

      // Case 10 : 7 < a and a >=7 and a != 13
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledLiteral(new Integer(7)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(13)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GT);

      // Case 11 : a > 7 and a >=7 and a != 13
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(13)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GT);

      // Case 12 : a >= 7 and a >7 and a != 13
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(13)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GT);

      // Case 13 : a >= 8 and a >7 and a != 13
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(13)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GE);

      // Case 14 : a >=8 and a > =7 and a !=13
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(13)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GE);

      // Case 15 : a >=7 and a > =8 and a != 13
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(13)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GE);
      // Case 15 : a >=7 and a > =8 and a != 8
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(RangeJunction.getKeysToBeRemoved((oo1.filterOperand)).iterator().next()
          .equals(new Integer(8)));

      // Case 16 : a >=7 and a > =8 and a != 7
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);

      // Case 17 : a >=7 and a > =8 and a != 7 and a!=4 and a != 3
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(3)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);
      // Case 18 : a >=7 and a > =8 and a != 7 and a!=4 and a != 3 and a != 20
      // and a != 8
      cv = new CompiledComparison[7];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(3)), OQLLexerTokenTypes.TOK_NE);
      cv[5] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(20)), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_GE);
      Iterator itr = RangeJunction.getKeysToBeRemoved((oo1.filterOperand)).iterator();
      Object temp;
      assertTrue((temp = itr.next()).equals(new Integer(8)) || temp.equals(new Integer(20)));
      assertTrue((temp = itr.next()).equals(new Integer(8)) || temp.equals(new Integer(20)));
      assertFalse(itr.hasNext());

      // //////////////////////////////////////////////////////////////
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the functionality of organizedOperands function of a RangeJunction for various
   * combinations of LESS THAN and Not equal conditions etc which results in a SingleCondnEvaluator
   * or CompiledComparison for a AND junction. It checks the correctness of the operator & the
   * evaluated key
   *
   */
  @Test
  public void testOrganizedOperandsSingleCondnEvalMultipleLessThanInEqualities_AND() {
    LogWriter logger = CacheUtils.getCache().getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      /**
       * ******************For all LESS THAN OR LESS THAN EQUAL To ********************
       */
      // Case 1 : a < 7 and a <=4 and a < 5 and a <=4
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_LE);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1] || oo1.filterOperand == cv[3]);
      // Case2: a<=8 and a < 12 and a <=10 and a<=8
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(12)), OQLLexerTokenTypes.TOK_LT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_LT);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0] || oo1.filterOperand == cv[3]);
      cv = new CompiledComparison[5];
      // Case 3 : 3 >= a and a <=4 and a < 5 and a <= 3 and a != 1
      cv[0] = new CompiledComparison(new CompiledLiteral(new Integer(3)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LT);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(3)), OQLLexerTokenTypes.TOK_LE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfSingleCondnEvaluator(oo1.filterOperand));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LE);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(3)));
      assertTrue(RangeJunction.getIndex(oo1.filterOperand).getName().equals("idIndex"));
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).size() == 1 && RangeJunction
          .getKeysToBeRemoved(oo1.filterOperand).iterator().next().equals(new Integer(1)));
      // Case 4 : 3 > a and a <=2
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledLiteral(new Integer(3)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_LE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);
      // Case 5 : a < 7 and a <=7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);

      // Case 6 : a <= 7 and a <7
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);

      // Case 7 : a <= 8 and a <9
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(9)), OQLLexerTokenTypes.TOK_LT);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);

      // Case 8 : a <=8 and a <=10
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[0]);

      // Case 9 : a <=6 and a <= 5
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);

      // Case 10 : 7 > a and a <=7 and a != 2
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledLiteral(new Integer(7)),
          new CompiledPath(new CompiledID("p"), "ID"), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LT);
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).iterator().next()
          .equals(new Integer(2)));
      // Case 11 : a < 7 and a <=7 and a != 1
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LT);
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).iterator().next()
          .equals(new Integer(1)));
      // Case 12 : a <= 7 and a <7 and a != 1
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(7)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LT);
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).iterator().next()
          .equals(new Integer(1)));
      // Case 13 : a <= 8 and a <9 and a !=1
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(9)), OQLLexerTokenTypes.TOK_LT);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LE);
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).iterator().next()
          .equals(new Integer(1)));

      // Case 14 : a <=8 and a <=9 and a !=1
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(9)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(8)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LE);
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).iterator().next()
          .equals(new Integer(1)));
      // Case 15 : a <=7 and a <=6 and a != 1
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(6)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LE);
      assertTrue(RangeJunction.getKeysToBeRemoved(oo1.filterOperand).iterator().next()
          .equals(new Integer(1)));
      // Case 15 : a <=7 and a <= 6and a != 6
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(6)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LE);
      assertTrue(RangeJunction.getKeysToBeRemoved((oo1.filterOperand)).iterator().next()
          .equals(new Integer(6)));

      // Case 16 : a <=7 and a <=6 and a != 7
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);

      // Case 17 : a <=7 and a <=6 and a != 7 and a!=10 and a != 8
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_NE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[1]);
      // Case 18 : a <=7 and a <=6 and a != 7 and a!=8 and a !=9 and a != 2 and
      // a != 6
      cv = new CompiledComparison[7];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(9)), OQLLexerTokenTypes.TOK_NE);
      cv[5] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_NE);
      cv[6] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorKey(oo1.filterOperand).equals(new Integer(6)));
      assertTrue(RangeJunction
          .getSingleCondnEvaluatorOperator(oo1.filterOperand) == OQLLexerTokenTypes.TOK_LE);
      Iterator itr = RangeJunction.getKeysToBeRemoved((oo1.filterOperand)).iterator();
      Object temp;
      assertTrue((temp = itr.next()).equals(new Integer(2)) || temp.equals(new Integer(6)));
      assertTrue((temp = itr.next()).equals(new Integer(2)) || temp.equals(new Integer(6)));
      assertFalse(itr.hasNext());
      // //////////////////////////////////////////////////////////////
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests the correct creation of NotEqualConditionEvaluator For AND junction
   *
   */
  @Test
  public void testNotEqualConditionEvaluator_AND() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      /**
       * ******************For all LESS THAN OR LESS THAN EQUAL To ********************
       */
      // Case 1 : a != 7 and a !=4 and a != 5 and a != 5
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_NE);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfNotEqualConditionEvaluator(oo1.filterOperand));
      Set keysRemove = RangeJunction.getKeysToBeRemoved(oo1.filterOperand);
      assertTrue(keysRemove.size() == 3);
      assertTrue(keysRemove.contains(new Integer(5)));
      assertTrue(keysRemove.contains(new Integer(7)));
      assertTrue(keysRemove.contains(new Integer(4)));
      // Case 2 : a != 7 and a != null and a != undefined
      CompiledValue[] cv1 = new CompiledValue[3];
      cv1[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv1[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_NE);
      cv1[2] = new CompiledUndefined(new CompiledPath(new CompiledID("p"), "ID"), false);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv1,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      CompiledValue[] ops = ((GroupJunction) oo1.filterOperand)._operands;
      // assertTrue(cv1[0] == ops[0] || cv1[0] == ops[1] || cv1[0] == ops[2]);
      if (RangeJunction.isInstanceOfNotEqualConditionEvaluator(ops[0])) {
        assertTrue(
            RangeJunction.getKeysToBeRemoved(ops[0]).iterator().next().equals(new Integer(7)));
      } else if (RangeJunction.isInstanceOfNotEqualConditionEvaluator(ops[1])) {
        assertTrue(
            RangeJunction.getKeysToBeRemoved(ops[1]).iterator().next().equals(new Integer(7)));
      } else if (RangeJunction.isInstanceOfNotEqualConditionEvaluator(ops[2])) {
        assertTrue(
            RangeJunction.getKeysToBeRemoved(ops[2]).iterator().next().equals(new Integer(7)));
      } else {
        fail("NotEqualConditionEvaluator not found");
      }
      assertTrue(cv1[1] == ops[0] || cv1[1] == ops[1] || cv1[1] == ops[2]);
      assertTrue(cv1[2] == ops[0] || cv1[2] == ops[1] || cv1[2] == ops[2]);
    } catch (Exception e) {
      logger.error(e.toString());
      fail(e.toString());
    }
  }

  /**
   * If possible , in case where RangeJunction contains something like a != 7 and a != undefined & a
   * != null, since undefined & null are not groupable , the a != 7 is also evaluated individually.
   * In such case, it makes sense not to create an Object of
   * rangeJunction.NotEqualConditionEvaluator for evaluating a !=7 , which however is the case now.
   * May be at some point, we should either try to club null & undefined as a part of
   * RangeJunctionEvaluator or we should not create an object of NotEqualConditionEvaluator.
   *
   */
  @Ignore
  @Test
  public void testNotEqualCoupledWithUndefinedAndNotNull() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      // Case 2 : a != 7 and a != null and a != undefined
      CompiledValue[] cv1 = new CompiledValue[3];
      cv1[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv1[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_NE);
      cv1[2] = new CompiledUndefined(new CompiledPath(new CompiledID("p"), "ID"), false);

      OrganizedOperands oo = this.oganizedOperandsSingleRangeJunctionCreation(
          OQLLexerTokenTypes.LITERAL_and, cv1, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      CompiledValue[] ops = ((GroupJunction) oo1.filterOperand)._operands;
      assertTrue(cv1[0] == ops[0] || cv1[0] == ops[1] || cv1[0] == ops[2]);
      assertTrue(cv1[1] == ops[0] || cv1[1] == ops[1] || cv1[1] == ops[2]);
      assertTrue(cv1[2] == ops[0] || cv1[2] == ops[1] || cv1[2] == ops[2]);
    } catch (Exception e) {
      logger.error(e.toString());
      fail(e.toString());
    }
  }

  /**
   * Test presence of equal condition in a AND RangeJunction An equal condition if accompanied by
   * any other condition in a RangeJunction ( except not null) should always return the equal
   * condition or a boolean false indicating empty resultset
   */
  @Test
  public void testEqualConditionInRangeJunction_AND() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      /**
       * ******************For all LESS THAN OR LESS THAN EQUAL To ********************
       */
      // Case 1 : a = 7 and a !=4 and a != 5 and a != 8
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_EQ);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);

      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertEquals(oo1.filterOperand, cv[0]);
      // Case 2 : a > 7 and a !=4 and a != 5 and a = 8
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_EQ);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertEquals(oo1.filterOperand, cv[3]);

      // Case3 : a < 7 and a !=4 and a =8 and a != 5
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_LT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof CompiledLiteral);
      assertFalse(
          ((Boolean) ((CompiledLiteral) oo1.filterOperand).evaluate(context)).booleanValue());

      // Case4 : a > 7 and a !=4 and a !=8 and a = 14
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_EQ);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[3]);

      // Case5 : a <= 14 and a !=4 and a !=8 and a = 14
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_LE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_EQ);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[3]);

      // Case6 : a >= 14 and a !=4 and a !=8 and a = 14

      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_EQ);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[3]);

      // Case7 : a >= 14 and a !=4 and a =9 and a = 14

      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(9)), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_EQ);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof CompiledLiteral);
      assertFalse(
          ((Boolean) ((CompiledLiteral) oo1.filterOperand).evaluate(context)).booleanValue());

      // Case8 : a > 7 and a !=4 and a !=8 and a = 14 and a <18
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_EQ);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(18)), OQLLexerTokenTypes.TOK_LT);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand == cv[3]);

      // case9:a > 7 and a !=4 and a !=8 and a = 14 and a <14
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_GT);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(4)), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(9)), OQLLexerTokenTypes.TOK_EQ);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_EQ);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(14)), OQLLexerTokenTypes.TOK_LT);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof CompiledLiteral);
      assertFalse(
          ((Boolean) ((CompiledLiteral) oo1.filterOperand).evaluate(context)).booleanValue());

    } catch (Exception e) {
      logger.error(e.toString());
    }
  }

  @Test
  public void testOrganizeOpsOfRangeJunctionForNonRangeEvaluatableOperand() {

    LogWriter logger = CacheUtils.getLogger();
    try {
      CompiledValue cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      // Case 1 : a != null and a != null and a != undefined
      cv = new CompiledValue[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_NE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledUndefined(new CompiledPath(new CompiledID("p"), "ID"), false);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      CompiledValue[] ops = ((GroupJunction) oo1.filterOperand)._operands;
      assertTrue(ops[0] == cv[0] || ops[0] == cv[1] || ops[0] == cv[2]);
      assertTrue(ops[1] == cv[0] || ops[1] == cv[1] || ops[1] == cv[2]);
      assertTrue(ops[2] == cv[0] || ops[2] == cv[1] || ops[2] == cv[2]);
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }

  }

  /**
   * Tests the genuine range condition evaluator ( having a upper and lower bound) formed from a
   * RangeJunction of type AND
   */
  @Test
  public void testDoubleCondnRangeJunctionEvaluator_AND() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      // Case 1 : a >= 7 and a <=10
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LE);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator((oo1.filterOperand)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorGreaterKey((oo1.filterOperand))
          .equals(new Integer(7)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfGreaterType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(RangeJunction.getDoubleCondnEvaluatorLESSKey((oo1.filterOperand))
          .equals(new Integer(10)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfLessType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_LE);
      assertTrue(RangeJunction.getKeysToBeRemoved((oo1.filterOperand)) == null);

      // Case2 : a >= 7 and a <=10 a >=5 and a <=11 and a != 7
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(10)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_GE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(11)), OQLLexerTokenTypes.TOK_LE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator((oo1.filterOperand)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorGreaterKey((oo1.filterOperand))
          .equals(new Integer(7)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfGreaterType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(RangeJunction.getDoubleCondnEvaluatorLESSKey((oo1.filterOperand))
          .equals(new Integer(10)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfLessType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_LE);
      Set keysToRemove = RangeJunction.getKeysToBeRemoved((oo1.filterOperand));
      assertTrue(keysToRemove.size() == 1);
      assertTrue(keysToRemove.iterator().next().equals(new Integer(7)));

      // Case3 : a >= 7 and a <=6 and a >=8 and a <=5 and a != 7
      cv = new CompiledComparison[5];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      cv[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof CompiledLiteral);
      assertFalse(
          ((Boolean) ((CompiledLiteral) oo1.filterOperand).evaluate(context)).booleanValue());

      // Case4 : a >= 7 and a <=6 and a >=8 and a <=5
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_GE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_LE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof CompiledLiteral);
      assertFalse(
          ((Boolean) ((CompiledLiteral) oo1.filterOperand).evaluate(context)).booleanValue());

      // Case5 : a >= 1 and a <=6 and a !=8
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator((oo1.filterOperand)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorGreaterKey((oo1.filterOperand))
          .equals(new Integer(1)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfGreaterType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(
          RangeJunction.getDoubleCondnEvaluatorLESSKey((oo1.filterOperand)).equals(new Integer(6)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfLessType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_LE);
      keysToRemove = RangeJunction.getKeysToBeRemoved((oo1.filterOperand));
      assertTrue(keysToRemove == null);

      // Case6 : a >= 1 and a <=6 and a !=8 and a!=2
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(2)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator((oo1.filterOperand)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorGreaterKey((oo1.filterOperand))
          .equals(new Integer(1)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfGreaterType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(
          RangeJunction.getDoubleCondnEvaluatorLESSKey((oo1.filterOperand)).equals(new Integer(6)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfLessType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_LE);
      keysToRemove = RangeJunction.getKeysToBeRemoved((oo1.filterOperand));
      assertTrue(keysToRemove.size() == 1);
      assertTrue(keysToRemove.iterator().next().equals(new Integer(2)));

      // Case7 : a >= 1 and a <=6 and a !=6 and a!=0
      cv = new CompiledComparison[4];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(1)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_LE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_NE);
      cv[3] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(0)), OQLLexerTokenTypes.TOK_NE);

      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(RangeJunction.isInstanceOfDoubleCondnRangeJunctionEvaluator((oo1.filterOperand)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorGreaterKey((oo1.filterOperand))
          .equals(new Integer(1)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfGreaterType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(
          RangeJunction.getDoubleCondnEvaluatorLESSKey((oo1.filterOperand)).equals(new Integer(6)));
      assertTrue(RangeJunction.getDoubleCondnEvaluatorOperatorOfLessType(
          (oo1.filterOperand)) == OQLLexerTokenTypes.TOK_LE);
      keysToRemove = RangeJunction.getKeysToBeRemoved((oo1.filterOperand));
      assertTrue(keysToRemove.size() == 1);
      assertTrue(keysToRemove.iterator().next().equals(new Integer(6)));

    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
  }

  /**
   * Tests if the presence of UNDEFINED operand is treated as a separate eval operand & not made a
   * part of SingleCondn or DoubleCondn evaluator
   */
  @Test
  public void testNullorNotNullorUndefinedBehaviour() {
    LogWriter logger = CacheUtils.getLogger();
    try {
      CompiledComparison cv[] = null;
      ExecutionContext context = new QueryExecutionContext(null, CacheUtils.getCache());
      this.bindIteratorsAndCreateIndex(context);
      // Case 1 : a >= 7 and a != null
      cv = new CompiledComparison[2];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_EQ);
      OrganizedOperands oo = this
          .oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv, context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      RangeJunction rj = (RangeJunction) oo.filterOperand;
      OrganizedOperands oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      CompiledValue[] operands = ((GroupJunction) oo1.filterOperand)._operands;
      assertEquals(2, operands.length);
      assertTrue(operands[0] == cv[0] || operands[0] == cv[1]);
      assertTrue(operands[1] == cv[0] || operands[1] == cv[1]);

      // Case 2 : a >= 7 and a != null and a!=5
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(5)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      operands = ((GroupJunction) oo1.filterOperand)._operands;
      assertEquals(2, operands.length);
      assertTrue(cv[1] == operands[0] || cv[1] == operands[1]);
      assertTrue(cv[0] == operands[0] || cv[0] == operands[1]);
      // Case 3 : a >= 7 and a != null and a!=7
      cv = new CompiledComparison[3];
      cv[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_NE);
      cv[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      operands = ((GroupJunction) oo1.filterOperand)._operands;
      assertEquals(2, operands.length);
      assertTrue(cv[1] == operands[0] || cv[1] == operands[1]);
      assertTrue(RangeJunction.isInstanceOfSingleCondnEvaluator(operands[0])
          || RangeJunction.isInstanceOfSingleCondnEvaluator(operands[1]));
      int x = -1;
      if (RangeJunction.isInstanceOfSingleCondnEvaluator(operands[0])) {
        x = 0;
      } else if (RangeJunction.isInstanceOfSingleCondnEvaluator(operands[1])) {
        x = 1;
      }

      Object key = RangeJunction.getSingleCondnEvaluatorKey(operands[x]);
      assertTrue(key.equals(new Integer(7)));
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorOperator(operands[x]) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(RangeJunction.getKeysToBeRemoved(operands[x]).size() == 1);
      assertTrue(
          RangeJunction.getKeysToBeRemoved(operands[x]).iterator().next().equals(new Integer(7)));

      // Case 4 : a >= 7 and a == null and a!=7 and a = undefined
      CompiledValue[] cv1 = new CompiledValue[4];
      cv1[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv1[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_EQ);
      cv1[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_NE);
      cv1[3] = new CompiledUndefined(new CompiledPath(new CompiledID("p"), "ID"), false);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv1,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      assertEquals(((GroupJunction) oo1.filterOperand)._operands.length, 3);
      CompiledValue[] ops = ((GroupJunction) oo1.filterOperand)._operands;
      assertTrue(ops[0] == cv1[1] || ops[1] == cv1[1] || ops[2] == cv1[1]);
      assertTrue(ops[0] == cv1[3] || ops[1] == cv1[3] || ops[2] == cv1[3]);
      assertTrue(RangeJunction.isInstanceOfSingleCondnEvaluator(ops[0])
          || RangeJunction.isInstanceOfSingleCondnEvaluator(ops[1])
          || RangeJunction.isInstanceOfSingleCondnEvaluator(ops[2]));
      x = -1;
      if (RangeJunction.isInstanceOfSingleCondnEvaluator(ops[0])) {
        x = 0;
      } else if (RangeJunction.isInstanceOfSingleCondnEvaluator(ops[1])) {
        x = 1;
      } else if (RangeJunction.isInstanceOfSingleCondnEvaluator(ops[2])) {
        x = 2;
      }
      key = RangeJunction.getSingleCondnEvaluatorKey(ops[x]);
      assertTrue(key.equals(new Integer(7)));
      assertTrue(
          RangeJunction.getSingleCondnEvaluatorOperator(ops[x]) == OQLLexerTokenTypes.TOK_GE);
      assertTrue(RangeJunction.getKeysToBeRemoved(ops[x]).size() == 1);
      assertTrue(RangeJunction.getKeysToBeRemoved(ops[x]).iterator().next().equals(new Integer(7)));

      // Case 5 : a >= 7 and a == null and a == 6 and a = undefined and
      // createTime = 6
      cv1 = new CompiledValue[5];
      cv1[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv1[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_EQ);
      cv1[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(6)), OQLLexerTokenTypes.TOK_EQ);
      cv1[3] = new CompiledUndefined(new CompiledPath(new CompiledID("p"), "ID"), false);
      cv1[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "createTime"),
          new CompiledLiteral(new Long(6)), OQLLexerTokenTypes.TOK_EQ);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv1,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof CompiledLiteral);
      assertFalse(
          ((Boolean) ((CompiledLiteral) oo1.filterOperand).evaluate(context)).booleanValue());
      assertNull(oo1.iterateOperand);

      // Case 6 : a >= 7 and a == null and a == 8 and a = undefined and
      // createTime = 6
      cv1 = new CompiledValue[5];
      cv1[0] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(7)), OQLLexerTokenTypes.TOK_GE);
      cv1[1] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(null), OQLLexerTokenTypes.TOK_EQ);
      cv1[2] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "ID"),
          new CompiledLiteral(new Integer(8)), OQLLexerTokenTypes.TOK_EQ);
      cv1[3] = new CompiledUndefined(new CompiledPath(new CompiledID("p"), "ID"), false);
      cv1[4] = new CompiledComparison(new CompiledPath(new CompiledID("p"), "createTime"),
          new CompiledLiteral(new Long(6)), OQLLexerTokenTypes.TOK_EQ);
      oo = this.oganizedOperandsSingleRangeJunctionCreation(OQLLexerTokenTypes.LITERAL_and, cv1,
          context);
      assertTrue("Filter Openad of OrganizedOperand is not of type RangeJunction",
          oo.filterOperand instanceof RangeJunction);
      rj = (RangeJunction) oo.filterOperand;
      oo1 = rj.organizeOperands(context);
      assertTrue(oo1.filterOperand instanceof GroupJunction);
      operands = ((GroupJunction) oo1.filterOperand)._operands;
      assertEquals(operands.length, 3);
      assertTrue(cv1[1] == operands[0] || cv1[1] == operands[1] || cv1[1] == operands[2]);
      assertTrue(cv1[2] == operands[0] || cv1[2] == operands[1] || cv1[2] == operands[2]);
      assertTrue(cv1[3] == operands[0] || cv1[3] == operands[1] || cv1[3] == operands[2]);
      assertTrue(oo1.iterateOperand == cv1[4]);

    } catch (Exception e) {
      logger.error(e.toString());
      fail(e.toString());
    }
  }

  private void bindIteratorsAndCreateIndex(ExecutionContext context) throws Exception {
    QCompiler compiler = new QCompiler();
    List list = compiler.compileFromClause("/portfolio p, p.positions");
    context.newScope(context.associateScopeID());
    qs.createIndex("idIndex", IndexType.FUNCTIONAL, "ID", "/portfolio");
    Iterator iter = list.iterator();
    while (iter.hasNext()) {
      CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next();
      context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context));
      RuntimeIterator rIter = iterDef.getRuntimeIterator(context);
      context.bindIterator(rIter);
      context.addToIndependentRuntimeItrMap(iterDef);
    }
  }

  /**
   * Tests the creation of a single RangeJunction if the CompiledJunction only contains same index
   * condition with or without iter operand
   */
  private OrganizedOperands oganizedOperandsSingleRangeJunctionCreation(int junctionType,
      CompiledValue[] operandsForCJ, ExecutionContext context) {
    LogWriter logger = CacheUtils.getCache().getLogger();
    OrganizedOperands oo = null;
    try {
      CompiledJunction cj = new CompiledJunction(operandsForCJ, junctionType);
      context.addDependencies(new CompiledID("dummy"), cj.computeDependencies(context));
      cj.getPlanInfo(context);
      oo = cj.testOrganizedOperands(context);
      return oo;
    } catch (Exception e) {
      logger.error(e);
      fail(e.toString());
    }
    return oo;
  }

  @After
  public void tearDown() throws Exception {
    CacheUtils.closeCache();
    IndexManager indexManager = ((LocalRegion) region).getIndexManager();
    if (indexManager != null)
      indexManager.destroy();
  }
}
