/*
 * 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
<<<<<<< Updated upstream
 *
 *     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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package org.apache.jdo.tck.query.jdoql.operators;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.Locale;
import java.util.TimeZone;
import org.apache.jdo.tck.pc.fieldtypes.AllTypes;
import org.apache.jdo.tck.util.BatchTestRunner;

/**
 * <B>Title:</B> Equality Operator Support <br>
 * <B>Keywords:</B> query <br>
 * <B>Assertion ID:</B> A14.6.2-14. <br>
 * <B>Assertion Description: </B> The equal operator (<code>==</code>) is supported for the
 * following types:
 *
 * <UL>
 *   <LI><code>byte, short, int, long, char, Byte, Short Integer, Long, Character</code>
 *   <LI><code>float, double, Float, Double</code>
 *   <LI><code>BigDecimal, BigInteger</code>
 *   <LI><code>Boolean, boolean</code>
 *   <LI>any class instance or array
 *   <LI><code>Date, String</code>
 * </UL>
 *
 * The operation on object-valued fields of wrapper types (<code>Boolean, Byte,
 * Short, Integer, Long, Float, and Double</code>), and numeric types (<code>BigDecimal</code> and
 * <code>BigInteger</code>) use the wrapped values as operands. Equality comparison of object-valued
 * fields of <code>PersistenceCapable</code> types use the JDO Identity comparison of the
 * references. Thus, two objects will compare equal if they have the same JDO Identity. Equality
 * comparison of object-valued fields of non-<code>PersistenceCapable</code> types uses the <code>
 * equals</code> method of the field type.
 */
public class Equality extends ComparisonTests {

  private static final String boolean_filterL = "value == fld_boolean";
  private static final String boolean_filterR = "fld_boolean == value";
  private static final String boolean_filterT = "fld_boolean == true";
  private static final String boolean_filterF = "false == fld_boolean";
  private static final String boolean_filterObj = "value.fld_boolean == fld_boolean";

  private static final String byte_filterL = "value == fld_byte";
  private static final String byte_filterR = "fld_byte == value";
  private static final String byte_filterObj = "value.fld_byte == fld_byte";
  private static final String byte_filterVal = "fld_byte == 100";

  private static final String char_filterL = "value == fld_char";
  private static final String char_filterR = "fld_char == value";
  private static final String char_filterObj = "value.fld_char == fld_char";
  private static final String char_filterVal = "'M' == fld_char";

  private static final String double_filterL = "value == fld_double";
  private static final String double_filterR = "fld_double == value";
  private static final String double_filterObj = "value.fld_double == fld_double";
  private static final String double_filterVal = "fld_double == 100.0";

  private static final String float_filterL = "value == fld_float";
  private static final String float_filterR = "fld_float == value";
  private static final String float_filterObj = "fld_float == value.fld_float";
  private static final String float_filterVal = "fld_float == 100.0";

  private static final String int_filterL = "value == fld_int";
  private static final String int_filterR = "fld_int == value";
  private static final String int_filterObj = "value.fld_int == fld_int";
  private static final String int_filterVal = "fld_int == 1000";

  private static final String long_filterL = "value == fld_long";
  private static final String long_filterR = "fld_long == value";
  private static final String long_filterObj = "fld_long == value.fld_long";
  private static final String long_filterVal = "fld_long == 1000000";

  private static final String short_filterL = "value == fld_short";
  private static final String short_filterR = "fld_short == value";
  private static final String short_filterObj = "value.fld_short == fld_short";
  private static final String short_filterVal = "1000 == fld_short";

  private static final String Boolean_filterL = "value == fld_Boolean";
  private static final String Boolean_filterR = "fld_Boolean == value";
  private static final String Boolean_filterT = "fld_Boolean == true";
  private static final String Boolean_filterF = "false == fld_Boolean";
  private static final String Boolean_filterObj = "value.fld_Boolean == fld_Boolean";
  private static final String Boolean_filterVal = "fld_Boolean == false";

  private static final String Byte_filterL = "value == fld_Byte";
  private static final String Byte_filterR = "fld_Byte == value";
  private static final String Byte_filterObj = "fld_Byte == value.fld_Byte";
  private static final String Byte_filterVal = "100 == fld_Byte";

  private static final String Character_filterL = "value == fld_Character";
  private static final String Character_filterR = "fld_Character == value";
  private static final String Character_filterObj = "value.fld_Character == fld_Character";
  private static final String Character_filterVal = "fld_Character == 'z'";

  private static final String Double_filterL = "value == fld_Double";
  private static final String Double_filterR = "fld_Double == value";
  private static final String Double_filterObj = "value.fld_Double == fld_Double";
  private static final String Double_filterVal = "fld_Double == -25.5";

  private static final String Float_filterL = "value == fld_Float";
  private static final String Float_filterR = "fld_Float == value";
  private static final String Float_filterObj = "fld_Float == value.fld_Float";
  private static final String Float_filterVal = "100.0f == fld_Float";

  private static final String Integer_filterL = "value == fld_Integer";
  private static final String Integer_filterR = "fld_Integer == value";
  private static final String Integer_filterObj = "fld_Integer == value.fld_Integer";
  private static final String Integer_filterVal = "fld_Integer == 100";

  private static final String Long_filterL = "value == fld_Long";
  private static final String Long_filterR = "fld_Long == value";
  private static final String Long_filterObj = "value.fld_Long == fld_Long";
  private static final String Long_filterVal = "-1000 == fld_Long";

  private static final String Short_filterL = "value == fld_Short";
  private static final String Short_filterR = "fld_Short == value";
  private static final String Short_filterObj = "fld_Short == value.fld_Short";
  private static final String Short_filterVal = "-1000 == fld_Short";

  private static final String String_filterL = "value == fld_String";
  private static final String String_filterR = "fld_String == value";
  private static final String String_filterObj = "value.fld_String == fld_String";
  private static final String String_filterVal1 = "fld_String == \"Java\"";
  private static final String String_filterVal2 = "fld_String == \"\"";

  private static final String Locale_filterL = "value == fld_Locale";
  private static final String Locale_filterR = "fld_Locale == value";
  private static final String Locale_filterObj = "value.fld_Locale == fld_Locale";

  private static final String Date_filterL = "value == fld_Date";
  private static final String Date_filterR = "fld_Date == value";
  private static final String Date_filterObj = "fld_Date == value.fld_Date";

  private static final String BigDecimal_filterL = "value == fld_BigDecimal";
  private static final String BigDecimal_filterR = "fld_BigDecimal == value";
  private static final String BigDecimal_filterObj = "value.fld_BigDecimal == fld_BigDecimal";

  private static final String BigInteger_filterL = "value == fld_BigInteger";
  private static final String BigInteger_filterR = "fld_BigInteger == value";
  private static final String BigInteger_filterObj = "fld_BigInteger == value.fld_BigInteger";

  /** */
  private static final String ASSERTION_FAILED = "Assertion A14.6.2-14 (Equality) failed: ";

  /**
   * The <code>main</code> is called when the class is directly executed from the command line.
   *
   * @param args The arguments passed to the program.
   */
  public static void main(String[] args) {
    BatchTestRunner.run(Equality.class);
  }

  /** */
  public void test() {
    pm = getPM();
    tx = pm.currentTransaction();
    runQueries();
  }

  /** */
  private void runQueries() {
    run_booleanQuery(boolean_filterL, booleanParameter, Boolean.TRUE, true, 4);
    run_booleanQuery(boolean_filterL, booleanParameter, Boolean.FALSE, false, 6);
    run_booleanQuery(boolean_filterR, booleanParameter, Boolean.TRUE, true, 4);
    run_booleanQuery(boolean_filterR, booleanParameter, Boolean.FALSE, false, 6);
    run_booleanQuery(boolean_filterL, BooleanParameter, Boolean.TRUE, true, 4);
    run_booleanQuery(boolean_filterL, BooleanParameter, Boolean.FALSE, false, 6);
    run_booleanQuery(boolean_filterR, BooleanParameter, Boolean.TRUE, true, 4);
    run_booleanQuery(boolean_filterR, BooleanParameter, Boolean.FALSE, false, 6);
    run_booleanQuery(boolean_filterT, null, null, true, 4);
    run_booleanQuery(boolean_filterF, null, null, false, 6);
    AllTypes alltypes = new AllTypes();
    alltypes.setboolean(true);
    run_booleanQuery(boolean_filterObj, AllTypesParameter, alltypes, true, 4);
    alltypes.setboolean(false);
    run_booleanQuery(boolean_filterObj, AllTypesParameter, alltypes, false, 6);

    run_byteQuery(byte_filterL, byteParameter, Byte.valueOf((byte) 50), (byte) 50, 2);
    run_byteQuery(byte_filterR, byteParameter, Byte.valueOf(Byte.MIN_VALUE), Byte.MIN_VALUE, 1);
    run_byteQuery(byte_filterL, ByteParameter, Byte.valueOf((byte) 20), (byte) 20, 0);
    run_byteQuery(byte_filterR, ByteParameter, Byte.valueOf(Byte.MAX_VALUE), Byte.MAX_VALUE, 1);
    run_byteQuery(byte_filterL, shortParameter, Short.valueOf((short) 50), (byte) 50, 2);
    run_byteQuery(byte_filterR, shortParameter, Short.valueOf((short) 50), (byte) 50, 2);
    run_byteQuery(byte_filterL, ShortParameter, Short.valueOf((short) -100), (byte) -100, 1);
    run_byteQuery(byte_filterR, ShortParameter, Short.valueOf((short) -100), (byte) -100, 1);
    run_byteQuery(byte_filterL, charParameter, Character.valueOf((char) 50), (byte) 50, 2);
    run_byteQuery(byte_filterR, charParameter, Character.valueOf((char) 50), (byte) 50, 2);
    run_byteQuery(byte_filterL, CharacterParameter, Character.valueOf((char) 50), (byte) 50, 2);
    run_byteQuery(byte_filterR, CharacterParameter, Character.valueOf((char) 100), (byte) 100, 1);
    run_byteQuery(byte_filterL, intParameter, Integer.valueOf(50), (byte) 50, 2);
    run_byteQuery(byte_filterR, intParameter, Integer.valueOf(50), (byte) 50, 2);
    run_byteQuery(byte_filterL, IntegerParameter, Integer.valueOf(-100), (byte) -100, 1);
    run_byteQuery(byte_filterR, IntegerParameter, Integer.valueOf(-100), (byte) -100, 1);
    run_byteQuery(byte_filterL, longParameter, Long.valueOf(50), (byte) 50, 2);
    run_byteQuery(byte_filterR, longParameter, Long.valueOf(50), (byte) 50, 2);
    run_byteQuery(byte_filterL, LongParameter, Long.valueOf(-100), (byte) -100, 1);
    run_byteQuery(byte_filterR, LongParameter, Long.valueOf(-100), (byte) -100, 1);
    run_byteQuery(byte_filterL, floatParameter, Float.valueOf(50.0f), (byte) 50, 2);
    run_byteQuery(byte_filterR, floatParameter, Float.valueOf(50.0f), (byte) 50, 2);
    run_byteQuery(byte_filterL, FloatParameter, Float.valueOf(-100.0f), (byte) -100, 1);
    run_byteQuery(byte_filterR, FloatParameter, Float.valueOf(-100.0f), (byte) -100, 1);
    run_byteQuery(byte_filterL, doubleParameter, Double.valueOf(50.0), (byte) 50, 2);
    run_byteQuery(byte_filterR, doubleParameter, Double.valueOf(50.0), (byte) 50, 2);
    run_byteQuery(byte_filterL, DoubleParameter, Double.valueOf(-100.0), (byte) -100, 1);
    run_byteQuery(byte_filterR, DoubleParameter, Double.valueOf(-100.0), (byte) -100, 1);
    run_byteQuery(byte_filterL, BigIntegerParameter, new BigInteger("50"), (byte) 50, 2);
    run_byteQuery(byte_filterR, BigIntegerParameter, new BigInteger("-100"), (byte) -100, 1);
    run_byteQuery(byte_filterL, BigDecimalParameter, new BigDecimal("100.0"), (byte) 100, 1);
    run_byteQuery(byte_filterR, BigDecimalParameter, new BigDecimal("10.0"), (byte) 10, 1);
    alltypes.setbyte((byte) 50);
    run_byteQuery(byte_filterObj, AllTypesParameter, alltypes, (byte) 50, 2);
    alltypes.setbyte((byte) 45);
    run_byteQuery(byte_filterObj, AllTypesParameter, alltypes, (byte) 45, 0);
    run_byteQuery(byte_filterVal, null, null, (byte) 100, 1);

    run_shortQuery(short_filterL, shortParameter, Short.valueOf((short) 100), (short) 100, 2);
    run_shortQuery(short_filterR, shortParameter, Short.valueOf((short) 100), (short) 100, 2);
    run_shortQuery(
        short_filterL, ShortParameter, Short.valueOf(Short.MIN_VALUE), Short.MIN_VALUE, 1);
    run_shortQuery(short_filterR, ShortParameter, Short.valueOf((short) 253), (short) 253, 0);
    run_shortQuery(short_filterR, shortParameter, Short.valueOf((short) 1000), (short) 1000, 1);
    run_shortQuery(short_filterL, byteParameter, Byte.valueOf((byte) 75), (short) 75, 0);
    run_shortQuery(short_filterR, byteParameter, Byte.valueOf((byte) 75), (short) 75, 0);
    run_shortQuery(short_filterL, ByteParameter, Byte.valueOf((byte) 100), (short) 100, 2);
    run_shortQuery(short_filterR, ByteParameter, Byte.valueOf((byte) 100), (short) 100, 2);
    run_shortQuery(short_filterL, charParameter, Character.valueOf((char) 75), (short) 75, 0);
    run_shortQuery(short_filterR, charParameter, Character.valueOf((char) 75), (short) 75, 0);
    run_shortQuery(
        short_filterL, CharacterParameter, Character.valueOf((char) 100), (short) 100, 2);
    run_shortQuery(
        short_filterR, CharacterParameter, Character.valueOf((char) 100), (short) 100, 2);
    run_shortQuery(short_filterL, intParameter, Integer.valueOf(-10000), (short) -10000, 1);
    run_shortQuery(short_filterR, intParameter, Integer.valueOf(-10000), (short) -10000, 1);
    run_shortQuery(short_filterL, IntegerParameter, Integer.valueOf(10000), (short) 10000, 1);
    run_shortQuery(short_filterR, IntegerParameter, Integer.valueOf(10000), (short) 10000, 1);
    run_shortQuery(short_filterL, longParameter, Long.valueOf(10000), (short) 10000, 1);
    run_shortQuery(short_filterR, longParameter, Long.valueOf(10000), (short) 10000, 1);
    run_shortQuery(short_filterL, LongParameter, Long.valueOf(100), (short) 100, 2);
    run_shortQuery(short_filterR, LongParameter, Long.valueOf(100), (short) 100, 2);
    run_shortQuery(short_filterL, floatParameter, Float.valueOf((float) 23000), (short) 23000, 0);
    run_shortQuery(short_filterR, floatParameter, Float.valueOf((float) 23000), (short) 23000, 0);
    run_shortQuery(short_filterL, FloatParameter, Float.valueOf((float) 100), (short) 100, 2);
    run_shortQuery(short_filterR, FloatParameter, Float.valueOf((float) 100), (short) 100, 2);
    run_shortQuery(short_filterL, doubleParameter, Double.valueOf(-10000), (short) -10000, 1);
    run_shortQuery(short_filterR, doubleParameter, Double.valueOf(-10000), (short) -10000, 1);
    run_shortQuery(short_filterL, DoubleParameter, Double.valueOf(23), (short) 23, 0);
    run_shortQuery(short_filterR, DoubleParameter, Double.valueOf(23), (short) 23, 0);
    run_shortQuery(short_filterL, BigIntegerParameter, new BigInteger("999"), (short) 999, 0);
    run_shortQuery(short_filterR, BigIntegerParameter, new BigInteger("-1000"), (short) -1000, 1);
    run_shortQuery(short_filterL, BigDecimalParameter, new BigDecimal("100.0"), (short) 100, 2);
    run_shortQuery(short_filterR, BigDecimalParameter, new BigDecimal("100.0001"), (short) 100, 0);
    alltypes.setshort((short) 100);
    run_shortQuery(short_filterObj, AllTypesParameter, alltypes, (short) 100, 2);
    alltypes.setshort((short) 23);
    run_shortQuery(short_filterObj, AllTypesParameter, alltypes, (short) 23, 0);
    run_shortQuery(short_filterVal, null, null, (short) 1000, 1);

    run_charQuery(
        char_filterL,
        charParameter,
        Character.valueOf(Character.MIN_VALUE),
        Character.MIN_VALUE,
        1);
    run_charQuery(
        char_filterR,
        charParameter,
        Character.valueOf(Character.MAX_VALUE),
        Character.MAX_VALUE,
        1);
    run_charQuery(char_filterL, charParameter, Character.valueOf('C'), 'C', 0);
    run_charQuery(char_filterR, charParameter, Character.valueOf('z'), 'z', 2);
    run_charQuery(char_filterL, CharacterParameter, Character.valueOf(' '), ' ', 1);
    run_charQuery(char_filterR, CharacterParameter, Character.valueOf('f'), 'f', 0);
    run_charQuery(
        char_filterL,
        byteParameter,
        Byte.valueOf((byte) Character.MIN_VALUE),
        Character.MIN_VALUE,
        1);
    run_charQuery(char_filterR, byteParameter, Byte.valueOf((byte) 122), 'z', 2);
    run_charQuery(char_filterL, ByteParameter, Byte.valueOf((byte) 'a'), 'a', 0);
    run_charQuery(char_filterR, ByteParameter, Byte.valueOf((byte) 'a'), 'a', 0);
    run_charQuery(char_filterL, shortParameter, Short.valueOf((short) 'M'), 'M', 2);
    run_charQuery(char_filterR, shortParameter, Short.valueOf((short) 'M'), 'M', 2);
    run_charQuery(char_filterL, ShortParameter, Short.valueOf((short) 'A'), 'A', 1);
    run_charQuery(char_filterR, ShortParameter, Short.valueOf((short) 'A'), 'A', 1);
    run_charQuery(char_filterL, intParameter, Integer.valueOf('z'), 'z', 2);
    run_charQuery(char_filterR, intParameter, Integer.valueOf('z'), 'z', 2);
    run_charQuery(char_filterL, IntegerParameter, Integer.valueOf('B'), 'B', 1);
    run_charQuery(char_filterR, IntegerParameter, Integer.valueOf('B'), 'B', 1);
    run_charQuery(char_filterL, longParameter, Long.valueOf('z'), 'z', 2);
    run_charQuery(char_filterR, longParameter, Long.valueOf('z'), 'z', 2);
    run_charQuery(char_filterL, LongParameter, Long.valueOf('B'), 'B', 1);
    run_charQuery(char_filterR, LongParameter, Long.valueOf('B'), 'B', 1);
    run_charQuery(char_filterL, floatParameter, Float.valueOf((float) 123.222), 'x', 0);
    run_charQuery(char_filterR, floatParameter, Float.valueOf((float) 123.222), 'x', 0);
    run_charQuery(char_filterL, FloatParameter, Float.valueOf('z'), 'z', 2);
    run_charQuery(char_filterR, FloatParameter, Float.valueOf('z'), 'z', 2);
    run_charQuery(char_filterL, doubleParameter, Double.valueOf('B'), 'B', 1);
    run_charQuery(char_filterR, doubleParameter, Double.valueOf('B'), 'B', 1);
    run_charQuery(char_filterL, DoubleParameter, Double.valueOf('A'), 'A', 1);
    run_charQuery(char_filterR, DoubleParameter, Double.valueOf('A'), 'A', 1);
    run_charQuery(char_filterL, BigIntegerParameter, new BigInteger("65"), 'A', 1); // 'A' == 65
    run_charQuery(char_filterR, BigIntegerParameter, new BigInteger("122"), 'z', 2); // 'z' == 122
    run_charQuery(char_filterL, BigDecimalParameter, new BigDecimal("65.0"), 'A', 1);
    run_charQuery(char_filterR, BigDecimalParameter, new BigDecimal("77.0"), 'M', 2); // 'M' == 77
    alltypes.setchar('A');
    run_charQuery(char_filterObj, AllTypesParameter, alltypes, 'A', 1);
    alltypes.setchar('b');
    run_charQuery(char_filterObj, AllTypesParameter, alltypes, 'b', 0);
    run_charQuery(char_filterVal, null, null, 'M', 2);

    run_intQuery(
        int_filterL,
        intParameter,
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        AllTypes.VERY_LARGE_NEGATIVE_INT,
        1);
    run_intQuery(
        int_filterR,
        intParameter,
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        AllTypes.VERY_LARGE_POSITIVE_INT,
        1);
    run_intQuery(int_filterR, intParameter, Integer.valueOf(23), 23, 0);
    run_intQuery(int_filterL, IntegerParameter, Integer.valueOf(1000000), 1000000, 1);
    run_intQuery(int_filterR, IntegerParameter, Integer.valueOf(1000), 1000, 1);
    run_intQuery(int_filterL, byteParameter, Byte.valueOf((byte) 100), 100, 2);
    run_intQuery(int_filterR, byteParameter, Byte.valueOf((byte) 0), 0, 1);
    run_intQuery(int_filterL, ByteParameter, Byte.valueOf((byte) 100), 100, 2);
    run_intQuery(int_filterR, ByteParameter, Byte.valueOf((byte) 0), 0, 1);
    run_intQuery(int_filterL, shortParameter, Short.valueOf((short) 10000), 10000, 1);
    run_intQuery(int_filterR, shortParameter, Short.valueOf((short) -1000), -1000, 1);
    run_intQuery(int_filterL, ShortParameter, Short.valueOf((short) -1000), -1000, 1);
    run_intQuery(int_filterR, ShortParameter, Short.valueOf((short) 10000), 10000, 1);
    run_intQuery(int_filterL, charParameter, Character.valueOf((char) 10000), 10000, 1);
    run_intQuery(int_filterR, charParameter, Character.valueOf((char) 0), 0, 1);
    run_intQuery(int_filterL, CharacterParameter, Character.valueOf((char) 100), 100, 2);
    run_intQuery(int_filterR, CharacterParameter, Character.valueOf((char) 10000), 10000, 1);
    run_intQuery(
        int_filterL,
        longParameter,
        Long.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        AllTypes.VERY_LARGE_POSITIVE_INT,
        1);
    run_intQuery(
        int_filterR,
        longParameter,
        Long.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        AllTypes.VERY_LARGE_NEGATIVE_INT,
        1);
    run_intQuery(int_filterL, LongParameter, Long.valueOf(10000), 10000, 1);
    run_intQuery(int_filterR, LongParameter, Long.valueOf(43), 43, 0);
    run_intQuery(
        int_filterL,
        floatParameter,
        Float.valueOf((float) AllTypes.VERY_LARGE_POSITIVE_INT),
        AllTypes.VERY_LARGE_POSITIVE_INT,
        1);
    run_intQuery(
        int_filterR,
        floatParameter,
        Float.valueOf((float) AllTypes.VERY_LARGE_NEGATIVE_INT),
        AllTypes.VERY_LARGE_NEGATIVE_INT,
        1);
    run_intQuery(int_filterL, FloatParameter, Float.valueOf((float) 10000), 10000, 1);
    run_intQuery(int_filterR, FloatParameter, Float.valueOf((float) 43), 43, 0);
    run_intQuery(
        int_filterL,
        doubleParameter,
        Double.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        AllTypes.VERY_LARGE_POSITIVE_INT,
        1);
    run_intQuery(
        int_filterR,
        doubleParameter,
        Double.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        AllTypes.VERY_LARGE_NEGATIVE_INT,
        1);
    run_intQuery(int_filterL, DoubleParameter, Double.valueOf(10000), 10000, 1);
    run_intQuery(int_filterR, DoubleParameter, Double.valueOf(43), 43, 0);
    run_intQuery(int_filterL, BigIntegerParameter, new BigInteger("1000000"), 1000000, 1);
    run_intQuery(int_filterR, BigIntegerParameter, new BigInteger("-1000000"), -1000000, 1);
    run_intQuery(int_filterL, BigDecimalParameter, new BigDecimal("1000000.0"), 1000000, 1);
    run_intQuery(int_filterR, BigDecimalParameter, new BigDecimal("-1000000.00001"), -1000000, 0);
    alltypes.setint(100);
    run_intQuery(int_filterObj, AllTypesParameter, alltypes, 100, 2);
    run_intQuery(int_filterVal, null, null, 1000, 1);

    run_longQuery(long_filterL, longParameter, Long.valueOf(Long.MIN_VALUE), Long.MIN_VALUE, 1);
    run_longQuery(long_filterR, longParameter, Long.valueOf(Long.MAX_VALUE), Long.MAX_VALUE, 1);
    run_longQuery(long_filterL, LongParameter, Long.valueOf(100), 100, 2);
    run_longQuery(long_filterR, LongParameter, Long.valueOf(23), 23, 0);
    run_longQuery(long_filterL, byteParameter, Byte.valueOf((byte) 100), 100, 2);
    run_longQuery(long_filterR, byteParameter, Byte.valueOf((byte) 0), 0, 1);
    run_longQuery(long_filterL, ByteParameter, Byte.valueOf((byte) 100), 100, 2);
    run_longQuery(long_filterR, ByteParameter, Byte.valueOf((byte) 0), 0, 1);
    run_longQuery(long_filterL, shortParameter, Short.valueOf((short) -1000), -1000, 2);
    run_longQuery(long_filterR, shortParameter, Short.valueOf((short) 1000), 1000, 1);
    run_longQuery(long_filterL, ShortParameter, Short.valueOf((short) 100), 100, 2);
    run_longQuery(long_filterR, ShortParameter, Short.valueOf((short) 32), 32, 0);
    run_longQuery(long_filterL, charParameter, Character.valueOf((char) 0), 0, 1);
    run_longQuery(long_filterR, charParameter, Character.valueOf((char) 100), 100, 2);
    run_longQuery(long_filterL, CharacterParameter, Character.valueOf((char) 23), 23, 0);
    run_longQuery(long_filterR, CharacterParameter, Character.valueOf((char) 0), 0, 1);
    run_longQuery(long_filterL, intParameter, Integer.valueOf(100), 100, 2);
    run_longQuery(long_filterR, intParameter, Integer.valueOf(0), 0, 1);
    run_longQuery(long_filterL, IntegerParameter, Integer.valueOf(23), 23, 0);
    run_longQuery(long_filterR, IntegerParameter, Integer.valueOf(1000000), 1000000, 1);
    run_longQuery(long_filterL, floatParameter, Float.valueOf((float) -1000000.0), -1000000, 1);
    //    run_longQuery(long_filterR, floatParameter, Float.valueOf((float)Long.MAX_VALUE),
    // Long.MAX_VALUE, 1);
    run_longQuery(long_filterL, FloatParameter, Float.valueOf((float) 100), 100, 2);
    run_longQuery(long_filterR, FloatParameter, Float.valueOf((float) 32), 32, 0);
    run_longQuery(long_filterL, doubleParameter, Double.valueOf(-1000000.0), -1000000, 1);
    //    run_longQuery(long_filterR, doubleParameter, Double.valueOf((double)Long.MAX_VALUE),
    // Long.MAX_VALUE, 1);
    run_longQuery(long_filterL, DoubleParameter, Double.valueOf(100.0), 100, 2);
    run_longQuery(long_filterR, DoubleParameter, Double.valueOf(32.0), 32, 0);
    run_longQuery(long_filterL, BigIntegerParameter, new BigInteger("1000000"), 1000000, 1);
    run_longQuery(long_filterR, BigIntegerParameter, new BigInteger("-1000000"), -1000000, 1);
    run_longQuery(long_filterL, BigDecimalParameter, new BigDecimal("100.0"), 100, 2);
    run_longQuery(long_filterR, BigDecimalParameter, new BigDecimal("-1000000.0001"), -1000000, 0);
    alltypes.setlong(100);
    run_longQuery(long_filterObj, AllTypesParameter, alltypes, 100, 2);
    run_longQuery(long_filterVal, null, null, 1000000, 1);

    run_floatQuery(float_filterL, floatParameter, Float.valueOf(-234.23f), -234.23f, 1);
    run_floatQuery(float_filterR, floatParameter, Float.valueOf(-234.23f), -234.23f, 1);
    run_floatQuery(float_filterL, FloatParameter, Float.valueOf((float) 0.0), 0.0f, 1);
    run_floatQuery(float_filterR, FloatParameter, Float.valueOf((float) 4.0), 4.0f, 0);
    run_floatQuery(float_filterL, byteParameter, Byte.valueOf((byte) 0), 0.0f, 1);
    run_floatQuery(float_filterR, byteParameter, Byte.valueOf((byte) 23), 23.0f, 0);
    run_floatQuery(float_filterL, ByteParameter, Byte.valueOf((byte) 34), 34.0f, 0);
    run_floatQuery(float_filterR, ByteParameter, Byte.valueOf((byte) 100), 100.0f, 2);
    run_floatQuery(float_filterL, shortParameter, Short.valueOf((short) 0), 0.0f, 1);
    run_floatQuery(float_filterR, shortParameter, Short.valueOf((short) 23), 23.0f, 0);
    run_floatQuery(float_filterL, ShortParameter, Short.valueOf((short) 34), 34.0f, 0);
    run_floatQuery(float_filterR, ShortParameter, Short.valueOf((short) 100), 100.0f, 2);
    run_floatQuery(float_filterL, charParameter, Character.valueOf((char) 0), 0.0f, 1);
    run_floatQuery(float_filterR, charParameter, Character.valueOf((char) 23), 23.0f, 0);
    run_floatQuery(float_filterL, CharacterParameter, Character.valueOf((char) 34), 34.0f, 0);
    run_floatQuery(float_filterR, CharacterParameter, Character.valueOf((char) 100), 100.0f, 2);
    run_floatQuery(float_filterL, intParameter, Integer.valueOf(50000000), 50000000.0f, 1);
    run_floatQuery(float_filterR, intParameter, Integer.valueOf(23), 23.0f, 0);
    run_floatQuery(float_filterL, IntegerParameter, Integer.valueOf(34), 34.0f, 0);
    run_floatQuery(float_filterR, IntegerParameter, Integer.valueOf(100), 100.0f, 2);
    run_floatQuery(float_filterL, longParameter, Long.valueOf(50000000), 50000000.0f, 1);
    run_floatQuery(float_filterR, longParameter, Long.valueOf(23), 23.0f, 0);
    run_floatQuery(float_filterL, LongParameter, Long.valueOf(34), 34.0f, 0);
    run_floatQuery(float_filterR, LongParameter, Long.valueOf(100), 100.0f, 2);
    run_floatQuery(float_filterL, doubleParameter, Double.valueOf(50000000.0), 50000000.0f, 1);
    run_floatQuery(float_filterR, doubleParameter, Double.valueOf(-25.5), -25.5f, 1);
    run_floatQuery(float_filterL, DoubleParameter, Double.valueOf(0.0), 0.0f, 1);
    run_floatQuery(float_filterR, DoubleParameter, Double.valueOf(100.0), 100.0f, 2);
    run_floatQuery(float_filterL, BigIntegerParameter, new BigInteger("0"), 0.0f, 1);
    run_floatQuery(
        float_filterR, BigIntegerParameter, new BigInteger("1000000000"), 1000000000.0f, 1);
    run_floatQuery(float_filterL, BigDecimalParameter, new BigDecimal("350.5"), 350.5f, 1);
    run_floatQuery(
        float_filterR, BigDecimalParameter, new BigDecimal("50000000.0"), 50000000.0f, 1);
    alltypes.setfloat(23.23f);
    run_floatQuery(float_filterObj, AllTypesParameter, alltypes, 23.23f, 0);
    run_floatQuery(float_filterVal, null, null, 100.0f, 2);

    run_doubleQuery(double_filterL, doubleParameter, Double.valueOf(-234234.234), -234234.234, 1);
    run_doubleQuery(double_filterR, doubleParameter, Double.valueOf(-234234.234), -234234.234, 1);
    run_doubleQuery(double_filterL, DoubleParameter, Double.valueOf(0.0), 0.0, 1);
    run_doubleQuery(double_filterR, DoubleParameter, Double.valueOf(23.34), 23.34, 0);
    run_doubleQuery(double_filterL, byteParameter, Byte.valueOf((byte) 100), 100.0, 2);
    run_doubleQuery(double_filterR, byteParameter, Byte.valueOf((byte) 0), 0.0, 1);
    run_doubleQuery(double_filterL, ByteParameter, Byte.valueOf((byte) 23), 23.0, 0);
    run_doubleQuery(double_filterR, ByteParameter, Byte.valueOf((byte) 100), 100.0, 2);
    run_doubleQuery(double_filterL, shortParameter, Short.valueOf((short) 100), 100.0, 2);
    run_doubleQuery(double_filterR, shortParameter, Short.valueOf((short) 0), 0.0, 1);
    run_doubleQuery(double_filterL, ShortParameter, Short.valueOf((short) 23), 23.0, 0);
    run_doubleQuery(double_filterR, ShortParameter, Short.valueOf((short) 100), 100.0, 2);
    run_doubleQuery(double_filterL, intParameter, Integer.valueOf(100), 100.0, 2);
    run_doubleQuery(double_filterR, intParameter, Integer.valueOf(0), 0.0, 1);
    run_doubleQuery(double_filterL, IntegerParameter, Integer.valueOf(23), 23.0, 0);
    run_doubleQuery(double_filterR, IntegerParameter, Integer.valueOf(100), 100.0, 2);
    run_doubleQuery(double_filterL, longParameter, Long.valueOf(100), 100.0, 2);
    run_doubleQuery(double_filterR, longParameter, Long.valueOf(0), 0.0, 1);
    run_doubleQuery(double_filterL, LongParameter, Long.valueOf(23), 23.0, 0);
    run_doubleQuery(double_filterR, LongParameter, Long.valueOf(100), 100.0, 2);
    run_doubleQuery(double_filterL, floatParameter, Float.valueOf(0.0f), 0.0f, 1);
    run_doubleQuery(double_filterR, floatParameter, Float.valueOf(100.0f), 100.0f, 2);
    run_doubleQuery(double_filterL, FloatParameter, Float.valueOf(100.0f), 100.0, 2);
    run_doubleQuery(double_filterR, FloatParameter, Float.valueOf(69.96f), 69.96, 0);
    run_doubleQuery(
        double_filterL, BigIntegerParameter, new BigInteger("50000000"), 50000000.0f, 1);
    run_doubleQuery(
        double_filterR, BigIntegerParameter, new BigInteger("1000000000"), 1000000000.0f, 1);
    run_doubleQuery(double_filterL, BigDecimalParameter, new BigDecimal("350.5"), 350.5f, 1);
    run_doubleQuery(
        double_filterR, BigDecimalParameter, new BigDecimal("50000000.0"), 50000000.0f, 1);
    alltypes.setdouble(-25.5);
    run_doubleQuery(double_filterObj, AllTypesParameter, alltypes, -25.5, 1);
    run_doubleQuery(double_filterVal, null, null, 100.0, 2);

    run_BooleanQuery(Boolean_filterL, booleanParameter, Boolean.TRUE, Boolean.TRUE, 4);
    run_BooleanQuery(Boolean_filterL, booleanParameter, Boolean.FALSE, Boolean.FALSE, 6);
    run_BooleanQuery(Boolean_filterR, booleanParameter, Boolean.TRUE, Boolean.TRUE, 4);
    run_BooleanQuery(Boolean_filterR, booleanParameter, Boolean.FALSE, Boolean.FALSE, 6);
    run_BooleanQuery(Boolean_filterL, BooleanParameter, Boolean.TRUE, Boolean.TRUE, 4);
    run_BooleanQuery(Boolean_filterL, BooleanParameter, Boolean.FALSE, Boolean.FALSE, 6);
    run_BooleanQuery(Boolean_filterR, BooleanParameter, Boolean.TRUE, Boolean.TRUE, 4);
    run_BooleanQuery(Boolean_filterR, BooleanParameter, Boolean.FALSE, Boolean.FALSE, 6);
    run_BooleanQuery(Boolean_filterT, null, Boolean.TRUE, Boolean.TRUE, 4);
    run_BooleanQuery(Boolean_filterF, null, Boolean.FALSE, Boolean.FALSE, 6);
    alltypes.setBoolean(Boolean.TRUE);
    run_BooleanQuery(Boolean_filterObj, AllTypesParameter, alltypes, Boolean.TRUE, 4);
    alltypes.setBoolean(Boolean.FALSE);
    run_BooleanQuery(Boolean_filterObj, AllTypesParameter, alltypes, Boolean.FALSE, 6);

    run_ByteQuery(Byte_filterL, byteParameter, Byte.valueOf((byte) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterR, byteParameter, Byte.valueOf(Byte.MIN_VALUE), Byte.valueOf(Byte.MIN_VALUE), 1);
    run_ByteQuery(Byte_filterL, ByteParameter, Byte.valueOf((byte) 20), Byte.valueOf((byte) 20), 0);
    run_ByteQuery(
        Byte_filterR, ByteParameter, Byte.valueOf(Byte.MAX_VALUE), Byte.valueOf(Byte.MAX_VALUE), 1);
    run_ByteQuery(
        Byte_filterL, shortParameter, Short.valueOf((short) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterR, shortParameter, Short.valueOf((short) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterL, ShortParameter, Short.valueOf((short) -100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterR, ShortParameter, Short.valueOf((short) -100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterL, charParameter, Character.valueOf((char) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterR, charParameter, Character.valueOf((char) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterL, CharacterParameter, Character.valueOf((char) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterR, CharacterParameter, Character.valueOf((char) 75), Byte.valueOf((byte) 75), 1);
    run_ByteQuery(Byte_filterL, intParameter, Integer.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(Byte_filterR, intParameter, Integer.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(Byte_filterL, IntegerParameter, Integer.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(Byte_filterR, IntegerParameter, Integer.valueOf(75), Byte.valueOf((byte) 75), 1);
    run_ByteQuery(Byte_filterL, longParameter, Long.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(Byte_filterR, longParameter, Long.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(Byte_filterL, LongParameter, Long.valueOf(-100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(Byte_filterR, LongParameter, Long.valueOf(-100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterL, floatParameter, Float.valueOf((float) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterR, floatParameter, Float.valueOf((float) 50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterL, FloatParameter, Float.valueOf((float) -100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterR, FloatParameter, Float.valueOf((float) -100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(Byte_filterL, doubleParameter, Double.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(Byte_filterR, doubleParameter, Double.valueOf(50), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterL, DoubleParameter, Double.valueOf(-100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterR, DoubleParameter, Double.valueOf(-100), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterL, BigIntegerParameter, new BigInteger("50"), Byte.valueOf((byte) 50), 2);
    run_ByteQuery(
        Byte_filterR, BigIntegerParameter, new BigInteger("-100"), Byte.valueOf((byte) -100), 1);
    run_ByteQuery(
        Byte_filterL, BigDecimalParameter, new BigDecimal("100.0"), Byte.valueOf((byte) 100), 1);
    run_ByteQuery(
        Byte_filterR, BigDecimalParameter, new BigDecimal("10.0001"), Byte.valueOf((byte) 10), 0);
    Byte val = Byte.valueOf((byte) 50);
    alltypes.setByte(val);
    run_ByteQuery(Byte_filterObj, AllTypesParameter, alltypes, val, 2);
    val = Byte.valueOf((byte) 45);
    alltypes.setByte(val);
    run_ByteQuery(Byte_filterObj, AllTypesParameter, alltypes, val, 0);
    run_ByteQuery(Byte_filterVal, null, null, Byte.valueOf((byte) 100), 1);

    run_ShortQuery(
        Short_filterL, shortParameter, Short.valueOf((short) 100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterR, shortParameter, Short.valueOf((short) 100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterL,
        ShortParameter,
        Short.valueOf(Short.MIN_VALUE),
        Short.valueOf(Short.MIN_VALUE),
        1);
    run_ShortQuery(
        Short_filterR, ShortParameter, Short.valueOf((short) 253), Short.valueOf((short) 253), 0);
    run_ShortQuery(
        Short_filterR, shortParameter, Short.valueOf((short) 1000), Short.valueOf((short) 1000), 1);
    run_ShortQuery(
        Short_filterL, byteParameter, Byte.valueOf((byte) 75), Short.valueOf((short) 75), 0);
    run_ShortQuery(
        Short_filterR, byteParameter, Byte.valueOf((byte) 75), Short.valueOf((short) 75), 0);
    run_ShortQuery(
        Short_filterL, ByteParameter, Byte.valueOf((byte) 100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterR, ByteParameter, Byte.valueOf((byte) 100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterL, charParameter, Character.valueOf((char) 75), Short.valueOf((short) 75), 0);
    run_ShortQuery(
        Short_filterR, charParameter, Character.valueOf((char) 75), Short.valueOf((short) 75), 0);
    run_ShortQuery(
        Short_filterL,
        CharacterParameter,
        Character.valueOf((char) 100),
        Short.valueOf((short) 100),
        2);
    run_ShortQuery(
        Short_filterR,
        CharacterParameter,
        Character.valueOf((char) 100),
        Short.valueOf((short) 100),
        2);
    run_ShortQuery(
        Short_filterL, intParameter, Integer.valueOf(-10000), Short.valueOf((short) -10000), 1);
    run_ShortQuery(
        Short_filterR, intParameter, Integer.valueOf(-10000), Short.valueOf((short) -10000), 1);
    run_ShortQuery(
        Short_filterL, IntegerParameter, Integer.valueOf(10000), Short.valueOf((short) 10000), 1);
    run_ShortQuery(
        Short_filterR, IntegerParameter, Integer.valueOf(10000), Short.valueOf((short) 10000), 1);
    run_ShortQuery(
        Short_filterL, longParameter, Long.valueOf(10000), Short.valueOf((short) 10000), 1);
    run_ShortQuery(
        Short_filterR, longParameter, Long.valueOf(10000), Short.valueOf((short) 10000), 1);
    run_ShortQuery(Short_filterL, LongParameter, Long.valueOf(100), Short.valueOf((short) 100), 2);
    run_ShortQuery(Short_filterR, LongParameter, Long.valueOf(100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterL,
        floatParameter,
        Float.valueOf((float) 23000),
        Short.valueOf((short) 23000),
        0);
    run_ShortQuery(
        Short_filterR,
        floatParameter,
        Float.valueOf((float) 23000),
        Short.valueOf((short) 23000),
        0);
    run_ShortQuery(
        Short_filterL, FloatParameter, Float.valueOf((float) 100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterR, FloatParameter, Float.valueOf((float) 100), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterL, doubleParameter, Double.valueOf(-10000), Short.valueOf((short) -10000), 1);
    run_ShortQuery(
        Short_filterR, doubleParameter, Double.valueOf(-10000), Short.valueOf((short) -10000), 1);
    run_ShortQuery(
        Short_filterL, DoubleParameter, Double.valueOf(23), Short.valueOf((short) 23), 0);
    run_ShortQuery(
        Short_filterR, DoubleParameter, Double.valueOf(23), Short.valueOf((short) 23), 0);
    run_ShortQuery(
        Short_filterL, BigIntegerParameter, new BigInteger("999"), Short.valueOf((short) 999), 0);
    run_ShortQuery(
        Short_filterR,
        BigIntegerParameter,
        new BigInteger("-1000"),
        Short.valueOf((short) -1000),
        1);
    run_ShortQuery(
        Short_filterL, BigDecimalParameter, new BigDecimal("100.0"), Short.valueOf((short) 100), 2);
    run_ShortQuery(
        Short_filterR, BigDecimalParameter, new BigDecimal("101.0"), Short.valueOf((short) 100), 0);
    Short sval = Short.valueOf((short) 100);
    alltypes.setShort(sval);
    run_ShortQuery(Short_filterObj, AllTypesParameter, alltypes, sval, 2);
    sval = Short.valueOf((short) 23);
    alltypes.setShort(sval);
    run_ShortQuery(Short_filterObj, AllTypesParameter, alltypes, sval, 0);
    run_ShortQuery(Short_filterVal, null, null, Short.valueOf((short) -1000), 1);

    run_CharacterQuery(
        Character_filterL,
        charParameter,
        Character.valueOf(Character.MIN_VALUE),
        Character.valueOf(Character.MIN_VALUE),
        1);
    run_CharacterQuery(
        Character_filterR,
        charParameter,
        Character.valueOf(Character.MAX_VALUE),
        Character.valueOf(Character.MAX_VALUE),
        1);
    run_CharacterQuery(
        Character_filterL, charParameter, Character.valueOf('C'), Character.valueOf('C'), 0);
    run_CharacterQuery(
        Character_filterR, charParameter, Character.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterL, CharacterParameter, Character.valueOf(' '), Character.valueOf(' '), 1);
    run_CharacterQuery(
        Character_filterR, CharacterParameter, Character.valueOf('f'), Character.valueOf('f'), 0);
    run_CharacterQuery(
        Character_filterL,
        byteParameter,
        Byte.valueOf((byte) Character.MIN_VALUE),
        Character.valueOf(Character.MIN_VALUE),
        1);
    run_CharacterQuery(
        Character_filterR, ByteParameter, Byte.valueOf((byte) 'a'), Character.valueOf('a'), 0);
    run_CharacterQuery(
        Character_filterL, shortParameter, Short.valueOf((short) 'M'), Character.valueOf('M'), 2);
    run_CharacterQuery(
        Character_filterR, shortParameter, Short.valueOf((short) 'F'), Character.valueOf('F'), 1);
    run_CharacterQuery(
        Character_filterL, ShortParameter, Short.valueOf((short) 'A'), Character.valueOf('A'), 1);
    run_CharacterQuery(
        Character_filterR, ShortParameter, Short.valueOf((short) 'A'), Character.valueOf('A'), 1);
    run_CharacterQuery(
        Character_filterL, intParameter, Integer.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterR, intParameter, Integer.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterL, IntegerParameter, Integer.valueOf('B'), Character.valueOf('B'), 1);
    run_CharacterQuery(
        Character_filterR, IntegerParameter, Integer.valueOf('B'), Character.valueOf('B'), 1);
    run_CharacterQuery(
        Character_filterL, longParameter, Long.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterR, longParameter, Long.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterL, LongParameter, Long.valueOf('B'), Character.valueOf('B'), 1);
    run_CharacterQuery(
        Character_filterR, LongParameter, Long.valueOf('B'), Character.valueOf('B'), 1);
    run_CharacterQuery(
        Character_filterL,
        floatParameter,
        Float.valueOf((float) 123.222),
        Character.valueOf('x'),
        0);
    run_CharacterQuery(
        Character_filterR,
        floatParameter,
        Float.valueOf((float) 123.222),
        Character.valueOf('x'),
        0);
    run_CharacterQuery(
        Character_filterL, FloatParameter, Float.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterR, FloatParameter, Float.valueOf('z'), Character.valueOf('z'), 2);
    run_CharacterQuery(
        Character_filterL, doubleParameter, Double.valueOf('B'), Character.valueOf('B'), 1);
    run_CharacterQuery(
        Character_filterR, doubleParameter, Double.valueOf('B'), Character.valueOf('B'), 1);
    run_CharacterQuery(
        Character_filterL, DoubleParameter, Double.valueOf('A'), Character.valueOf('A'), 1);
    run_CharacterQuery(
        Character_filterR, DoubleParameter, Double.valueOf('A'), Character.valueOf('A'), 1);
    run_CharacterQuery(
        Character_filterL,
        BigIntegerParameter,
        new BigInteger("65"),
        Character.valueOf('A'),
        1); // 'A' == 65
    run_CharacterQuery(
        Character_filterR,
        BigIntegerParameter,
        new BigInteger("122"),
        Character.valueOf('z'),
        2); // 'z' == 122
    run_CharacterQuery(
        Character_filterL, BigDecimalParameter, new BigDecimal("65.0"), Character.valueOf('A'), 1);
    run_CharacterQuery(
        Character_filterR,
        BigDecimalParameter,
        new BigDecimal("77.0"),
        Character.valueOf('M'),
        2); // 'M' == 77
    alltypes.setCharacter(Character.valueOf('A'));
    run_CharacterQuery(Character_filterObj, AllTypesParameter, alltypes, Character.valueOf('A'), 1);
    alltypes.setCharacter(Character.valueOf('b'));
    run_CharacterQuery(Character_filterObj, AllTypesParameter, alltypes, Character.valueOf('b'), 0);
    run_CharacterQuery(Character_filterVal, null, null, Character.valueOf('z'), 2);

    run_IntegerQuery(
        Integer_filterL,
        intParameter,
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterR,
        intParameter,
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        1);
    run_IntegerQuery(Integer_filterR, intParameter, Integer.valueOf(23), Integer.valueOf(23), 0);
    run_IntegerQuery(
        Integer_filterL, IntegerParameter, Integer.valueOf(1000000), Integer.valueOf(1000000), 1);
    run_IntegerQuery(
        Integer_filterR, IntegerParameter, Integer.valueOf(1000), Integer.valueOf(1000), 1);
    run_IntegerQuery(
        Integer_filterL, byteParameter, Byte.valueOf((byte) 100), Integer.valueOf(100), 2);
    run_IntegerQuery(Integer_filterR, byteParameter, Byte.valueOf((byte) 0), Integer.valueOf(0), 1);
    run_IntegerQuery(
        Integer_filterL, ByteParameter, Byte.valueOf((byte) 100), Integer.valueOf(100), 2);
    run_IntegerQuery(Integer_filterR, ByteParameter, Byte.valueOf((byte) 0), Integer.valueOf(0), 1);
    run_IntegerQuery(
        Integer_filterL, shortParameter, Short.valueOf((short) 10000), Integer.valueOf(10000), 1);
    run_IntegerQuery(
        Integer_filterR, shortParameter, Short.valueOf((short) -1000), Integer.valueOf(-1000), 1);
    run_IntegerQuery(
        Integer_filterL, ShortParameter, Short.valueOf((short) -1000), Integer.valueOf(-1000), 1);
    run_IntegerQuery(
        Integer_filterL, charParameter, Character.valueOf((char) 10000), Integer.valueOf(10000), 1);
    run_IntegerQuery(
        Integer_filterR, charParameter, Character.valueOf((char) 10000), Integer.valueOf(10000), 1);
    run_IntegerQuery(
        Integer_filterL,
        CharacterParameter,
        Character.valueOf((char) 100),
        Integer.valueOf(100),
        2);
    run_IntegerQuery(
        Integer_filterR,
        CharacterParameter,
        Character.valueOf((char) 10000),
        Integer.valueOf(10000),
        1);
    run_IntegerQuery(
        Integer_filterL,
        longParameter,
        Long.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterR,
        longParameter,
        Long.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterL, LongParameter, Long.valueOf(10000), Integer.valueOf(10000), 1);
    run_IntegerQuery(Integer_filterR, LongParameter, Long.valueOf(43), Integer.valueOf(43), 0);
    run_IntegerQuery(
        Integer_filterL,
        floatParameter,
        Float.valueOf((float) AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterR,
        floatParameter,
        Float.valueOf((float) AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterL, FloatParameter, Float.valueOf((float) 10000), Integer.valueOf(10000), 1);
    run_IntegerQuery(
        Integer_filterR, FloatParameter, Float.valueOf((float) 43), Integer.valueOf(43), 0);
    run_IntegerQuery(
        Integer_filterL,
        doubleParameter,
        Double.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterR,
        doubleParameter,
        Double.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        1);
    run_IntegerQuery(
        Integer_filterL, DoubleParameter, Double.valueOf(10000), Integer.valueOf(10000), 1);
    run_IntegerQuery(Integer_filterR, DoubleParameter, Double.valueOf(43), Integer.valueOf(43), 0);
    run_IntegerQuery(
        Integer_filterL,
        BigIntegerParameter,
        new BigInteger("1000000"),
        Integer.valueOf(1000000),
        1);
    run_IntegerQuery(
        Integer_filterR,
        BigIntegerParameter,
        new BigInteger("-1000000"),
        Integer.valueOf(-1000000),
        1);
    run_IntegerQuery(
        Integer_filterL,
        BigDecimalParameter,
        new BigDecimal("1000000.0"),
        Integer.valueOf(1000000),
        1);
    run_IntegerQuery(
        Integer_filterR,
        BigDecimalParameter,
        new BigDecimal("-1000000.01"),
        Integer.valueOf(-1000000),
        0);
    alltypes.setInteger(Integer.valueOf(100));
    run_IntegerQuery(Integer_filterObj, AllTypesParameter, alltypes, Integer.valueOf(100), 2);
    run_IntegerQuery(Integer_filterVal, null, null, Integer.valueOf(100), 2);

    run_LongQuery(
        Long_filterL, longParameter, Long.valueOf(Long.MIN_VALUE), Long.valueOf(Long.MIN_VALUE), 1);
    run_LongQuery(
        Long_filterR, longParameter, Long.valueOf(Long.MAX_VALUE), Long.valueOf(Long.MAX_VALUE), 1);
    run_LongQuery(Long_filterL, LongParameter, Long.valueOf(100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, LongParameter, Long.valueOf(23), Long.valueOf(23), 0);
    run_LongQuery(Long_filterL, byteParameter, Byte.valueOf((byte) 100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, byteParameter, Byte.valueOf((byte) 0), Long.valueOf(0), 1);
    run_LongQuery(Long_filterL, ByteParameter, Byte.valueOf((byte) 100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, ByteParameter, Byte.valueOf((byte) 0), Long.valueOf(0), 1);
    run_LongQuery(
        Long_filterL, shortParameter, Short.valueOf((short) -1000), Long.valueOf(-1000), 2);
    run_LongQuery(Long_filterR, shortParameter, Short.valueOf((short) 1000), Long.valueOf(1000), 1);
    run_LongQuery(Long_filterL, ShortParameter, Short.valueOf((short) 100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, ShortParameter, Short.valueOf((short) 32), Long.valueOf(32), 0);
    run_LongQuery(Long_filterL, charParameter, Character.valueOf((char) 0), Long.valueOf(0), 1);
    run_LongQuery(Long_filterR, charParameter, Character.valueOf((char) 100), Long.valueOf(100), 2);
    run_LongQuery(
        Long_filterL, CharacterParameter, Character.valueOf((char) 23), Long.valueOf(23), 0);
    run_LongQuery(
        Long_filterR, CharacterParameter, Character.valueOf((char) 0), Long.valueOf(0), 1);
    run_LongQuery(Long_filterL, intParameter, Integer.valueOf(100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, intParameter, Integer.valueOf(0), Long.valueOf(0), 1);
    run_LongQuery(Long_filterL, IntegerParameter, Integer.valueOf(23), Long.valueOf(23), 0);
    run_LongQuery(
        Long_filterR, IntegerParameter, Integer.valueOf(1000000), Long.valueOf(1000000), 1);
    run_LongQuery(Long_filterL, longParameter, Long.valueOf(100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, longParameter, Long.valueOf(0), Long.valueOf(0), 1);
    run_LongQuery(Long_filterL, LongParameter, Long.valueOf(23), Long.valueOf(23), 0);
    run_LongQuery(Long_filterR, LongParameter, Long.valueOf(1000000), Long.valueOf(1000000), 1);
    run_LongQuery(
        Long_filterL, floatParameter, Float.valueOf((float) -1000000.0), Long.valueOf(-1000000), 1);
    //    run_LongQuery(Long_filterR, floatParameter, Float.valueOf((float)Long.MAX_VALUE),
    // Long.valueOf(Long.MAX_VALUE), 1);
    run_LongQuery(Long_filterL, FloatParameter, Float.valueOf((float) 100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, FloatParameter, Float.valueOf((float) 32), Long.valueOf(32), 0);
    run_LongQuery(
        Long_filterL, doubleParameter, Double.valueOf(-1000000.0), Long.valueOf(-1000000), 1);
    //    run_LongQuery(Long_filterR, doubleParameter, Double.valueOf((double)Long.MAX_VALUE),
    // Long.valueOf(Long.MAX_VALUE), 1);
    run_LongQuery(Long_filterL, DoubleParameter, Double.valueOf(100), Long.valueOf(100), 2);
    run_LongQuery(Long_filterR, DoubleParameter, Double.valueOf(32), Long.valueOf(32), 0);
    run_LongQuery(
        Long_filterL, BigIntegerParameter, new BigInteger("1000000"), Long.valueOf(1000000), 1);
    run_LongQuery(
        Long_filterR, BigIntegerParameter, new BigInteger("-1000000"), Long.valueOf(-1000000), 1);
    run_LongQuery(
        Long_filterL, BigDecimalParameter, new BigDecimal("1000000.0"), Long.valueOf(1000000), 1);
    run_LongQuery(
        Long_filterR,
        BigDecimalParameter,
        new BigDecimal("-1000000.0001"),
        Long.valueOf(-1000000),
        0);
    alltypes.setLong(Long.valueOf(100));
    run_LongQuery(Long_filterObj, AllTypesParameter, alltypes, Long.valueOf(100), 2);
    run_LongQuery(Long_filterVal, null, null, Long.valueOf(-1000), 2);

    run_FloatQuery(Float_filterL, floatParameter, Float.valueOf(350.5f), Float.valueOf(350.5f), 1);
    run_FloatQuery(Float_filterR, floatParameter, Float.valueOf(350.5f), Float.valueOf(350.5f), 1);
    run_FloatQuery(
        Float_filterL, FloatParameter, Float.valueOf((float) 0.0), Float.valueOf(0.0f), 1);
    run_FloatQuery(
        Float_filterR, FloatParameter, Float.valueOf((float) 4.0), Float.valueOf(4.0f), 0);
    run_FloatQuery(Float_filterL, byteParameter, Byte.valueOf((byte) 0), Float.valueOf(0.0f), 1);
    run_FloatQuery(Float_filterR, byteParameter, Byte.valueOf((byte) 23), Float.valueOf(23.0f), 0);
    run_FloatQuery(Float_filterL, ByteParameter, Byte.valueOf((byte) 34), Float.valueOf(34.0f), 0);
    run_FloatQuery(
        Float_filterR, ByteParameter, Byte.valueOf((byte) 100), Float.valueOf(100.0f), 2);
    run_FloatQuery(Float_filterL, shortParameter, Short.valueOf((short) 0), Float.valueOf(0.0f), 1);
    run_FloatQuery(
        Float_filterR, shortParameter, Short.valueOf((short) 23), Float.valueOf(23.0f), 0);
    run_FloatQuery(
        Float_filterL, ShortParameter, Short.valueOf((short) 34), Float.valueOf(34.0f), 0);
    run_FloatQuery(
        Float_filterR, ShortParameter, Short.valueOf((short) 100), Float.valueOf(100.0f), 2);
    run_FloatQuery(
        Float_filterL, charParameter, Character.valueOf((char) 0), Float.valueOf(0.0f), 1);
    run_FloatQuery(
        Float_filterR, charParameter, Character.valueOf((char) 23), Float.valueOf(23.0f), 0);
    run_FloatQuery(
        Float_filterL, CharacterParameter, Character.valueOf((char) 34), Float.valueOf(34.0f), 0);
    run_FloatQuery(
        Float_filterR, CharacterParameter, Character.valueOf((char) 100), Float.valueOf(100.0f), 2);
    run_FloatQuery(
        Float_filterL, intParameter, Integer.valueOf(50000000), Float.valueOf(50000000.0f), 1);
    run_FloatQuery(Float_filterR, intParameter, Integer.valueOf(23), Float.valueOf(23.0f), 0);
    run_FloatQuery(Float_filterL, IntegerParameter, Integer.valueOf(34), Float.valueOf(34.0f), 0);
    run_FloatQuery(Float_filterR, IntegerParameter, Integer.valueOf(100), Float.valueOf(100.0f), 2);
    run_FloatQuery(
        Float_filterL, longParameter, Long.valueOf(50000000), Float.valueOf(50000000.0f), 1);
    run_FloatQuery(Float_filterR, longParameter, Long.valueOf(23), Float.valueOf(23.0f), 0);
    run_FloatQuery(Float_filterL, LongParameter, Long.valueOf(34), Float.valueOf(34.0f), 0);
    run_FloatQuery(Float_filterR, LongParameter, Long.valueOf(100), Float.valueOf(100.0f), 2);
    run_FloatQuery(
        Float_filterL, doubleParameter, Double.valueOf(50000000.0f), Float.valueOf(50000000.0f), 1);
    run_FloatQuery(
        Float_filterR, doubleParameter, Double.valueOf(100.0f), Float.valueOf(100.0f), 2);
    run_FloatQuery(Float_filterL, DoubleParameter, Double.valueOf(0.0f), Float.valueOf(0.0f), 1);
    run_FloatQuery(
        Float_filterR, DoubleParameter, Double.valueOf(100.0f), Float.valueOf(100.0f), 2);
    run_FloatQuery(
        Float_filterL,
        BigIntegerParameter,
        new BigInteger("50000000"),
        Float.valueOf(50000000.0f),
        1);
    run_FloatQuery(
        Float_filterR,
        BigIntegerParameter,
        new BigInteger("1000000000"),
        Float.valueOf(1000000000.0f),
        1);
    run_FloatQuery(
        Float_filterL, BigDecimalParameter, new BigDecimal("350.5"), Float.valueOf(350.5f), 1);
    run_FloatQuery(
        Float_filterR,
        BigDecimalParameter,
        new BigDecimal("50000000.0"),
        Float.valueOf(50000000.0f),
        1);
    alltypes.setFloat(Float.valueOf(23.23f));
    run_FloatQuery(Float_filterObj, AllTypesParameter, alltypes, Float.valueOf(23.23f), 0);
    run_FloatQuery(Float_filterVal, null, null, Float.valueOf(100.0f), 2);

    run_DoubleQuery(
        Double_filterL, doubleParameter, Double.valueOf(350.5), Double.valueOf(350.5), 1);
    run_DoubleQuery(
        Double_filterR, doubleParameter, Double.valueOf(350.5), Double.valueOf(350.5), 1);
    run_DoubleQuery(Double_filterL, DoubleParameter, Double.valueOf(0.0), Double.valueOf(0.0), 1);
    run_DoubleQuery(
        Double_filterR, DoubleParameter, Double.valueOf(23.34), Double.valueOf(23.34), 0);
    run_DoubleQuery(
        Double_filterL, byteParameter, Byte.valueOf((byte) 100), Double.valueOf(100.0), 2);
    run_DoubleQuery(Double_filterR, byteParameter, Byte.valueOf((byte) 0), Double.valueOf(0.0), 1);
    run_DoubleQuery(
        Double_filterL, ByteParameter, Byte.valueOf((byte) 23), Double.valueOf(23.0), 0);
    run_DoubleQuery(
        Double_filterR, ByteParameter, Byte.valueOf((byte) 100), Double.valueOf(100.0), 2);
    run_DoubleQuery(
        Double_filterL, shortParameter, Short.valueOf((short) 100), Double.valueOf(100.0), 2);
    run_DoubleQuery(
        Double_filterR, shortParameter, Short.valueOf((short) 0), Double.valueOf(0.0), 1);
    run_DoubleQuery(
        Double_filterL, ShortParameter, Short.valueOf((short) 23), Double.valueOf(23.0), 0);
    run_DoubleQuery(
        Double_filterR, ShortParameter, Short.valueOf((short) 100), Double.valueOf(100.0), 2);
    run_DoubleQuery(
        Double_filterL, charParameter, Character.valueOf((char) 100), Double.valueOf(100.0), 2);
    run_DoubleQuery(
        Double_filterR, charParameter, Character.valueOf((char) 0), Double.valueOf(0.0), 1);
    run_DoubleQuery(
        Double_filterL, CharacterParameter, Character.valueOf((char) 23), Double.valueOf(23.0), 0);
    run_DoubleQuery(
        Double_filterR,
        CharacterParameter,
        Character.valueOf((char) 100),
        Double.valueOf(100.0),
        2);
    run_DoubleQuery(Double_filterL, intParameter, Integer.valueOf(100), Double.valueOf(100.0), 2);
    run_DoubleQuery(Double_filterR, intParameter, Integer.valueOf(0), Double.valueOf(0.0), 1);
    run_DoubleQuery(Double_filterL, IntegerParameter, Integer.valueOf(23), Double.valueOf(23.0), 0);
    run_DoubleQuery(
        Double_filterR, IntegerParameter, Integer.valueOf(100), Double.valueOf(100.0), 2);
    run_DoubleQuery(Double_filterL, longParameter, Long.valueOf(100), Double.valueOf(100.0), 2);
    run_DoubleQuery(Double_filterR, longParameter, Long.valueOf(0), Double.valueOf(0.0), 1);
    run_DoubleQuery(Double_filterL, LongParameter, Long.valueOf(23), Double.valueOf(23.0), 0);
    run_DoubleQuery(Double_filterR, LongParameter, Long.valueOf(100), Double.valueOf(100.0), 2);
    run_DoubleQuery(Double_filterL, floatParameter, Float.valueOf(0.0f), Double.valueOf(0.0f), 1);
    run_DoubleQuery(
        Double_filterR, floatParameter, Float.valueOf(100.0f), Double.valueOf(100.0f), 2);
    run_DoubleQuery(
        Double_filterL, FloatParameter, Float.valueOf(100.0f), Double.valueOf(100.0f), 2);
    run_DoubleQuery(
        Double_filterR, FloatParameter, Float.valueOf(69.96f), Double.valueOf(69.96), 0);
    run_DoubleQuery(
        Double_filterL,
        BigIntegerParameter,
        new BigInteger("50000000"),
        Double.valueOf(50000000.0f),
        1);
    run_DoubleQuery(
        Double_filterR,
        BigIntegerParameter,
        new BigInteger("1000000000"),
        Double.valueOf(1000000000.0f),
        1);
    run_DoubleQuery(
        Double_filterL, BigDecimalParameter, new BigDecimal("350.5"), Double.valueOf(350.5f), 1);
    run_DoubleQuery(
        Double_filterR,
        BigDecimalParameter,
        new BigDecimal("50000000.0"),
        Double.valueOf(50000000.0f),
        1);
    alltypes.setDouble(Double.valueOf(-25.5));
    run_DoubleQuery(Double_filterObj, AllTypesParameter, alltypes, Double.valueOf(-25.5), 1);
    run_DoubleQuery(Double_filterVal, null, null, Double.valueOf(-25.5), 1);

    run_StringQuery(String_filterL, StringParameter, "JDO", "JDO", 1);
    run_StringQuery(String_filterR, StringParameter, "JDBC", "JDBC", 0);
    alltypes.setString("abcde");
    run_StringQuery(String_filterObj, AllTypesParameter, alltypes, "abcde", 1);
    run_StringQuery(String_filterVal1, null, null, "Java", 2);
    run_StringQuery(String_filterVal2, null, null, "", 1);

    run_LocaleQuery(Locale_filterL, LocaleParameter, Locale.CANADA_FRENCH, Locale.CANADA_FRENCH, 0);
    run_LocaleQuery(Locale_filterR, LocaleParameter, Locale.US, Locale.US, 1);
    alltypes.setLocale(Locale.UK);
    run_LocaleQuery(Locale_filterObj, AllTypesParameter, alltypes, Locale.UK, 1);

    BigDecimal bd = new BigDecimal("100.0");
    run_BigDecimalQuery(BigDecimal_filterL, BigDecimalParameter, bd, bd, 2);
    bd = new BigDecimal("-234234.23333");
    run_BigDecimalQuery(BigDecimal_filterR, BigDecimalParameter, bd, bd, 1);
    bd = new BigDecimal("989899.33304953");
    run_BigDecimalQuery(BigDecimal_filterL, BigDecimalParameter, bd, bd, 0);
    bd = new BigDecimal("-1123123.22");
    run_BigDecimalQuery(BigDecimal_filterR, BigDecimalParameter, bd, bd, 1);
    alltypes.setBigDecimal(bd);
    run_BigDecimalQuery(BigDecimal_filterObj, AllTypesParameter, alltypes, bd, 1);

    BigInteger bi = new BigInteger("987034534985043985");
    run_BigIntegerQuery(BigInteger_filterL, BigIntegerParameter, bi, bi, 1);
    bi = new BigInteger("-999999999999999999");
    run_BigIntegerQuery(BigInteger_filterR, BigIntegerParameter, bi, bi, 1);
    bi = new BigInteger("-99999999999999999");
    run_BigIntegerQuery(BigInteger_filterR, BigIntegerParameter, bi, bi, 0);
    bi = new BigInteger("1333330");
    alltypes.setBigInteger(bi);
    run_BigIntegerQuery(BigInteger_filterObj, AllTypesParameter, alltypes, bi, 1);

    GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.UK);
    gc.clear();
    gc.set(1999, Calendar.DECEMBER, 31, 9, 0, 0);
    Date d = gc.getTime();
    run_DateQuery(Date_filterL, DateParameter, d, d, 1);
    gc.set(1992, Calendar.NOVEMBER, 22, 9, 0, 0);
    d = gc.getTime();
    run_DateQuery(Date_filterR, DateParameter, d, d, 1);
    gc.set(1959, Calendar.OCTOBER, 9, 9, 0, 0);
    d = gc.getTime();
    run_DateQuery(Date_filterR, DateParameter, d, d, 0);
    gc.set(1995, Calendar.JUNE, 14, 9, 0, 0);
    d = gc.getTime();
    alltypes.setDate(d);
    run_DateQuery(Date_filterObj, AllTypesParameter, alltypes, d, 1);
  }

  private void run_booleanQuery(
      String filter, String parameter, Object parameterValue, boolean value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      boolean val = obj.getboolean();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns object with incorrect value, retrieved value: "
                + val
                + ", expected value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_byteQuery(
      String filter, String parameter, Object parameterValue, byte value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      byte val = obj.getbyte();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_shortQuery(
      String filter, String parameter, Object parameterValue, short value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      short val = obj.getshort();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_charQuery(
      String filter, String parameter, Object parameterValue, char value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      char val = obj.getchar();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_intQuery(
      String filter, String parameter, Object parameterValue, int value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      int val = obj.getint();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_longQuery(
      String filter, String parameter, Object parameterValue, long value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      long val = obj.getlong();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_floatQuery(
      String filter, String parameter, Object parameterValue, float value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      float val = obj.getfloat();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_doubleQuery(
      String filter, String parameter, Object parameterValue, double value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      double val = obj.getdouble();
      if (val != value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_BooleanQuery(
      String filter, String parameter, Object parameterValue, Boolean value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Boolean val = obj.getBoolean();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns object with incorrect value",
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_ByteQuery(
      String filter, String parameter, Object parameterValue, Byte value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Byte val = obj.getByte();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_ShortQuery(
      String filter, String parameter, Object parameterValue, Short value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Short val = obj.getShort();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_CharacterQuery(
      String filter, String parameter, Object parameterValue, Character value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Character val = obj.getCharacter();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_IntegerQuery(
      String filter, String parameter, Object parameterValue, Integer value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Integer val = obj.getInteger();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_LongQuery(
      String filter, String parameter, Object parameterValue, Long value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Long val = obj.getLong();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_FloatQuery(
      String filter, String parameter, Object parameterValue, Float value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Float val = obj.getFloat();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_DoubleQuery(
      String filter, String parameter, Object parameterValue, Double value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Double val = obj.getDouble();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_StringQuery(
      String filter, String parameter, Object parameterValue, String value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      String val = obj.getString();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_LocaleQuery(
      String filter, String parameter, Object parameterValue, Locale value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Locale val = obj.getLocale();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_BigDecimalQuery(
      String filter,
      String parameter,
      Object parameterValue,
      BigDecimal value,
      int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      BigDecimal val = obj.getBigDecimal();
      //        if( !val.equals(value) ){
      if (val.compareTo(value) != 0) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_BigIntegerQuery(
      String filter,
      String parameter,
      Object parameterValue,
      BigInteger value,
      int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      BigInteger val = obj.getBigInteger();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  private void run_DateQuery(
      String filter, String parameter, Object parameterValue, Date value, int expected_count) {
    tx.begin();
    runQuery(pm, filter, parameter, parameterValue, ASSERTION_FAILED);
    if (queryResult == null) return;
    Iterator<AllTypes> iter = queryResult.iterator();
    int cnt = 0;
    while (iter.hasNext()) {
      AllTypes obj = iter.next();
      Date val = obj.getDate();
      if (!val.equals(value)) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Equality test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Equality test returns wrong number of instances",
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

  /** */
  @Override
  protected void localSetUp() {
    addTearDownClass(AllTypes.class);
    AllTypes.load(getPM());
  }
}
