/*
 * 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.
 */

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> Greater Than Query Operator <br>
 * <B>Keywords:</B> query <br>
 * <B>Assertion ID:</B> A14.6.2-16. <br>
 * <B>Assertion Description: </B> The greater than operator (<code>&gt;</code>) is supported for all
 * types as they are defined in the Java language. This includes 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>Date, String</code>
 * </UL>
 *
 * The operation on object-valued fields of wrapper types (<code>Boolean, Byte,
 * Short, Integer, Long, Float</code>, and <code>Double</code>), and numeric types (<code>BigDecimal
 * </code> and <code>BigInteger</code>) use the wrapped values as operands.
 */
public class GreaterThan 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 > 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 = "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 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-16 (GreaterThan) 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(GreaterThan.class);
  }

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

  /** */
  private void runQueries() {
    AllTypes alltypes = new AllTypes();
    run_byteQuery(byte_filterL, byteParameter, Byte.valueOf((byte) 0), (byte) 0, true, 3);
    run_byteQuery(
        byte_filterR, byteParameter, Byte.valueOf(Byte.MIN_VALUE), Byte.MIN_VALUE, false, 9);
    run_byteQuery(byte_filterL, ByteParameter, Byte.valueOf((byte) 50), (byte) 50, true, 5);
    run_byteQuery(
        byte_filterR, ByteParameter, Byte.valueOf(Byte.MAX_VALUE), Byte.MAX_VALUE, false, 0);
    run_byteQuery(byte_filterL, shortParameter, Short.valueOf((short) 75), (byte) 75, true, 7);
    run_byteQuery(byte_filterR, shortParameter, Short.valueOf((short) 75), (byte) 75, false, 2);
    run_byteQuery(byte_filterL, ShortParameter, Short.valueOf((short) 10), (byte) 10, true, 4);
    run_byteQuery(byte_filterR, ShortParameter, Short.valueOf((short) 25), (byte) 25, false, 5);
    run_byteQuery(byte_filterL, charParameter, Character.valueOf((char) 101), (byte) 101, true, 9);
    run_byteQuery(byte_filterR, charParameter, Character.valueOf((char) 50), (byte) 50, false, 3);
    run_byteQuery(byte_filterL, CharacterParameter, Character.valueOf((char) 0), (byte) 0, true, 3);
    run_byteQuery(
        byte_filterR, CharacterParameter, Character.valueOf((char) 0), (byte) 0, false, 6);
    run_byteQuery(byte_filterL, intParameter, Integer.valueOf(25), (byte) 25, true, 5);
    run_byteQuery(byte_filterR, intParameter, Integer.valueOf(50), (byte) 50, false, 3);
    run_byteQuery(byte_filterL, IntegerParameter, Integer.valueOf(-10), (byte) -10, true, 2);
    run_byteQuery(byte_filterR, IntegerParameter, Integer.valueOf(-100), (byte) -100, false, 8);
    run_byteQuery(byte_filterL, longParameter, Long.valueOf(50), (byte) 50, true, 5);
    run_byteQuery(byte_filterR, longParameter, Long.valueOf(60), (byte) 60, false, 3);
    run_byteQuery(byte_filterL, LongParameter, Long.valueOf(-100), (byte) -100, true, 1);
    run_byteQuery(byte_filterR, LongParameter, Long.valueOf(-100), (byte) -100, false, 8);
    run_byteQuery(byte_filterL, floatParameter, Float.valueOf((float) 51), (byte) 51, true, 7);
    run_byteQuery(byte_filterR, floatParameter, Float.valueOf((float) -20), (byte) -20, false, 8);
    run_byteQuery(byte_filterL, FloatParameter, Float.valueOf((float) -99), (byte) -99, true, 2);
    run_byteQuery(byte_filterR, FloatParameter, Float.valueOf((float) -100), (byte) -100, false, 8);
    run_byteQuery(byte_filterL, doubleParameter, Double.valueOf(50), (byte) 50, true, 5);
    run_byteQuery(byte_filterR, doubleParameter, Double.valueOf(60), (byte) 60, false, 3);
    run_byteQuery(
        byte_filterL, DoubleParameter, Double.valueOf(Byte.MAX_VALUE), Byte.MAX_VALUE, true, 9);
    run_byteQuery(byte_filterR, DoubleParameter, Double.valueOf(25), (byte) 25, false, 5);
    run_byteQuery(byte_filterL, BigIntegerParameter, new BigInteger("50"), (byte) 50, true, 5);
    run_byteQuery(byte_filterR, BigIntegerParameter, new BigInteger("-100"), (byte) -100, false, 8);
    run_byteQuery(
        byte_filterL, BigDecimalParameter, new BigDecimal("50.000000"), (byte) 50, true, 5);
    run_byteQuery(
        byte_filterR, BigDecimalParameter, new BigDecimal("10.00000"), (byte) 10, false, 5);
    alltypes.setbyte((byte) 50);
    run_byteQuery(byte_filterObj, AllTypesParameter, alltypes, (byte) 50, true, 5);
    alltypes.setbyte((byte) 55);
    run_byteQuery(byte_filterObj, AllTypesParameter, alltypes, (byte) 55, true, 7);
    run_byteQuery(byte_filterVal, null, null, (byte) 100, false, 1);

    run_shortQuery(short_filterL, shortParameter, Short.valueOf((short) 100), (short) 100, true, 5);
    run_shortQuery(
        short_filterR, shortParameter, Short.valueOf((short) 100), (short) 100, false, 3);
    run_shortQuery(
        short_filterL, ShortParameter, Short.valueOf(Short.MIN_VALUE), Short.MIN_VALUE, true, 0);
    run_shortQuery(
        short_filterR, ShortParameter, Short.valueOf((short) 253), (short) 253, false, 3);
    run_shortQuery(
        short_filterR, shortParameter, Short.valueOf((short) 1000), (short) 1000, false, 2);
    run_shortQuery(short_filterL, byteParameter, Byte.valueOf((byte) 75), (short) 75, true, 5);
    run_shortQuery(short_filterR, byteParameter, Byte.valueOf((byte) -75), (short) -75, false, 6);
    run_shortQuery(short_filterL, ByteParameter, Byte.valueOf((byte) 100), (short) 100, true, 5);
    run_shortQuery(short_filterR, ByteParameter, Byte.valueOf((byte) 100), (short) 100, false, 3);
    run_shortQuery(short_filterL, charParameter, Character.valueOf((char) 75), (short) 75, true, 5);
    run_shortQuery(
        short_filterR, charParameter, Character.valueOf((char) 9999), (short) 9999, false, 2);
    run_shortQuery(
        short_filterL, CharacterParameter, Character.valueOf((char) 1000), (short) 1000, true, 7);
    run_shortQuery(
        short_filterR,
        CharacterParameter,
        Character.valueOf((char) 10000),
        (short) 10000,
        false,
        1);
    run_shortQuery(short_filterL, intParameter, Integer.valueOf(-10000), (short) -10000, true, 1);
    run_shortQuery(short_filterR, intParameter, Integer.valueOf(-10000), (short) -10000, false, 8);
    run_shortQuery(short_filterL, IntegerParameter, Integer.valueOf(10000), (short) 10000, true, 8);
    run_shortQuery(
        short_filterR, IntegerParameter, Integer.valueOf(30000), (short) 30000, false, 1);
    run_shortQuery(short_filterL, longParameter, Long.valueOf(10000), (short) 10000, true, 8);
    run_shortQuery(
        short_filterR, longParameter, Long.valueOf(Short.MAX_VALUE), Short.MAX_VALUE, false, 0);
    run_shortQuery(
        short_filterL, LongParameter, Long.valueOf(Short.MAX_VALUE), Short.MAX_VALUE, true, 9);
    run_shortQuery(short_filterR, LongParameter, Long.valueOf(100), (short) 100, false, 3);
    run_shortQuery(
        short_filterL, floatParameter, Float.valueOf((float) 23000), (short) 23000, true, 9);
    run_shortQuery(
        short_filterR, floatParameter, Float.valueOf((float) 23000), (short) 23000, false, 1);
    run_shortQuery(
        short_filterL, FloatParameter, Float.valueOf((float) -1000), (short) -1000, true, 2);
    run_shortQuery(
        short_filterR, FloatParameter, Float.valueOf((float) 100), (short) 100, false, 3);
    run_shortQuery(
        short_filterL, doubleParameter, Double.valueOf(-10000.0), (short) -10000, true, 1);
    run_shortQuery(short_filterR, doubleParameter, Double.valueOf(9999.0), (short) 9999, false, 2);
    run_shortQuery(short_filterL, DoubleParameter, Double.valueOf(23.0), (short) 23, true, 5);
    run_shortQuery(short_filterR, DoubleParameter, Double.valueOf(23.0), (short) 23, false, 5);
    run_shortQuery(
        short_filterL, BigIntegerParameter, new BigInteger("10000"), (short) 10000, true, 8);
    run_shortQuery(
        short_filterR, BigIntegerParameter, new BigInteger("30000"), (short) 30000, false, 1);
    run_shortQuery(short_filterL, BigDecimalParameter, new BigDecimal("23.0"), (short) 23, true, 5);
    run_shortQuery(
        short_filterR, BigDecimalParameter, new BigDecimal("23.0"), (short) 23, false, 5);
    alltypes.setshort((short) 100);
    run_shortQuery(short_filterObj, AllTypesParameter, alltypes, (short) 100, true, 5);
    alltypes.setshort((short) 23);
    run_shortQuery(short_filterObj, AllTypesParameter, alltypes, (short) 23, true, 5);
    run_shortQuery(short_filterVal, null, null, (short) 1000, true, 7);

    run_charQuery(
        char_filterL,
        charParameter,
        Character.valueOf(Character.MIN_VALUE),
        Character.MIN_VALUE,
        true,
        0);
    run_charQuery(
        char_filterR,
        charParameter,
        Character.valueOf(Character.MAX_VALUE),
        Character.MAX_VALUE,
        false,
        0);
    run_charQuery(char_filterL, charParameter, Character.valueOf('C'), 'C', true, 4);
    run_charQuery(char_filterR, charParameter, Character.valueOf('z'), 'z', false, 1);
    run_charQuery(char_filterL, CharacterParameter, Character.valueOf(' '), ' ', true, 1);
    run_charQuery(char_filterR, CharacterParameter, Character.valueOf('f'), 'f', false, 3);
    run_charQuery(
        char_filterL,
        byteParameter,
        Byte.valueOf((byte) Character.MIN_VALUE),
        Character.MIN_VALUE,
        true,
        0);
    run_charQuery(char_filterR, ByteParameter, Byte.valueOf((byte) 'a'), 'a', false, 3);
    run_charQuery(char_filterL, shortParameter, Short.valueOf((short) 'M'), 'M', true, 5);
    run_charQuery(char_filterR, shortParameter, Short.valueOf((short) 'M'), 'M', false, 3);
    run_charQuery(char_filterL, ShortParameter, Short.valueOf((short) 'A'), 'A', true, 2);
    run_charQuery(char_filterR, ShortParameter, Short.valueOf((short) 'A'), 'A', false, 7);
    run_charQuery(char_filterL, intParameter, Integer.valueOf('z'), 'z', true, 7);
    run_charQuery(char_filterR, intParameter, Integer.valueOf('z'), 'z', false, 1);
    run_charQuery(char_filterL, IntegerParameter, Integer.valueOf('B'), 'B', true, 3);
    run_charQuery(char_filterR, IntegerParameter, Integer.valueOf('B'), 'B', false, 6);
    run_charQuery(char_filterL, floatParameter, Float.valueOf('f'), 'f', true, 7);
    run_charQuery(char_filterR, floatParameter, Float.valueOf(' '), ' ', false, 8);
    run_charQuery(char_filterL, FloatParameter, Float.valueOf('z'), 'z', true, 7);
    run_charQuery(char_filterR, FloatParameter, Float.valueOf('z'), 'z', false, 1);
    run_charQuery(char_filterL, doubleParameter, Double.valueOf('B'), 'B', true, 3);
    run_charQuery(char_filterR, doubleParameter, Double.valueOf('B'), 'B', false, 6);
    run_charQuery(char_filterL, DoubleParameter, Double.valueOf('A'), 'A', true, 2);
    run_charQuery(char_filterR, DoubleParameter, Double.valueOf('A'), 'A', false, 7);
    run_charQuery(
        char_filterL, BigIntegerParameter, new BigInteger("65"), 'A', true, 2); // 'A' == 65
    run_charQuery(
        char_filterR, BigIntegerParameter, new BigInteger("122"), 'z', false, 1); // 'z' == 122
    run_charQuery(char_filterL, BigDecimalParameter, new BigDecimal("65.00000"), 'A', true, 2);
    run_charQuery(
        char_filterR, BigDecimalParameter, new BigDecimal("77.0000"), 'M', false, 3); // 'M' == 77
    alltypes.setchar('A');
    run_charQuery(char_filterObj, AllTypesParameter, alltypes, 'A', true, 2);
    alltypes.setchar('b');
    run_charQuery(char_filterObj, AllTypesParameter, alltypes, 'b', true, 7);
    run_charQuery(char_filterVal, null, null, 'M', true, 5);

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

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

    run_floatQuery(
        float_filterL,
        floatParameter,
        Float.valueOf(AllTypes.FLOAT_SMALLEST),
        AllTypes.FLOAT_SMALLEST,
        true,
        0);
    run_floatQuery(
        float_filterR,
        floatParameter,
        Float.valueOf(AllTypes.FLOAT_LARGEST),
        AllTypes.FLOAT_LARGEST,
        false,
        0);
    run_floatQuery(float_filterL, FloatParameter, Float.valueOf(4.0f), 4.0f, true, 4);
    run_floatQuery(float_filterR, FloatParameter, Float.valueOf(400.0f), 400.0f, false, 3);
    run_floatQuery(float_filterL, byteParameter, Byte.valueOf((byte) 4), 4.0f, true, 4);
    run_floatQuery(float_filterR, byteParameter, Byte.valueOf((byte) 23), 23.0f, false, 6);
    run_floatQuery(float_filterL, ByteParameter, Byte.valueOf((byte) 34), 34.0f, true, 4);
    run_floatQuery(float_filterR, ByteParameter, Byte.valueOf((byte) 100), 100.0f, false, 4);
    run_floatQuery(float_filterL, shortParameter, Short.valueOf((short) 10), 10.0f, true, 4);
    run_floatQuery(float_filterR, shortParameter, Short.valueOf((short) 23), 23.0f, false, 6);
    run_floatQuery(float_filterL, ShortParameter, Short.valueOf((short) 34), 34.0f, true, 4);
    run_floatQuery(float_filterR, ShortParameter, Short.valueOf((short) 100), 100.0f, false, 4);
    run_floatQuery(float_filterL, charParameter, Character.valueOf((char) 20), 20.0f, true, 4);
    run_floatQuery(float_filterR, charParameter, Character.valueOf((char) 23), 23.0f, false, 6);
    run_floatQuery(float_filterL, CharacterParameter, Character.valueOf((char) 34), 34.0f, true, 4);
    run_floatQuery(
        float_filterR, CharacterParameter, Character.valueOf((char) 100), 100.0f, false, 4);
    run_floatQuery(float_filterL, intParameter, Integer.valueOf(55000000), 55000000.0f, true, 8);
    run_floatQuery(float_filterR, intParameter, Integer.valueOf(23), 23.0f, false, 6);
    run_floatQuery(float_filterL, IntegerParameter, Integer.valueOf(34), 34.0f, true, 4);
    run_floatQuery(float_filterR, IntegerParameter, Integer.valueOf(100), 100.0f, false, 4);
    run_floatQuery(float_filterL, longParameter, Long.valueOf(55000000), 55000000.0f, true, 8);
    run_floatQuery(float_filterR, longParameter, Long.valueOf(23), 23.0f, false, 6);
    run_floatQuery(float_filterL, LongParameter, Long.valueOf(34), 34.0f, true, 4);
    run_floatQuery(float_filterR, LongParameter, Long.valueOf(100), 100.0f, false, 4);
    run_floatQuery(
        float_filterL, doubleParameter, Double.valueOf(55000000.0), 55000000.0f, true, 8);
    run_floatQuery(float_filterR, doubleParameter, Double.valueOf(-20.5), -20.5f, false, 7);
    run_floatQuery(float_filterL, DoubleParameter, Double.valueOf(2.0), 2.0f, true, 4);
    run_floatQuery(float_filterR, DoubleParameter, Double.valueOf(100.0), 100.0f, false, 4);
    run_floatQuery(
        float_filterL, BigIntegerParameter, new BigInteger("55000000"), 55000000.0f, true, 8);
    run_floatQuery(float_filterR, BigIntegerParameter, new BigInteger("23"), 23.0f, false, 6);
    run_floatQuery(
        float_filterL, BigDecimalParameter, new BigDecimal("55000000.0"), 55000000.0f, true, 8);
    run_floatQuery(float_filterR, BigDecimalParameter, new BigDecimal("-20.5"), -20.5f, false, 7);
    alltypes.setfloat(23.23f);
    run_floatQuery(float_filterObj, AllTypesParameter, alltypes, 23.23f, false, 6);
    run_floatQuery(float_filterVal, null, null, 100.0f, false, 4);

    run_doubleQuery(
        double_filterL,
        doubleParameter,
        Double.valueOf(AllTypes.DOUBLE_SMALLEST),
        AllTypes.DOUBLE_SMALLEST,
        true,
        0);
    run_doubleQuery(
        double_filterR,
        doubleParameter,
        Double.valueOf(AllTypes.DOUBLE_LARGEST),
        AllTypes.DOUBLE_LARGEST,
        false,
        0);
    run_doubleQuery(double_filterL, DoubleParameter, Double.valueOf(0.0), 0.0, true, 3);
    run_doubleQuery(double_filterR, DoubleParameter, Double.valueOf(23.34), 23.34, false, 6);
    run_doubleQuery(double_filterL, byteParameter, Byte.valueOf((byte) 100), 100.0, true, 4);
    run_doubleQuery(double_filterR, byteParameter, Byte.valueOf((byte) 0), 0.0, false, 6);
    run_doubleQuery(double_filterL, ByteParameter, Byte.valueOf((byte) 23), 23.0, true, 4);
    run_doubleQuery(double_filterR, ByteParameter, Byte.valueOf((byte) 100), 100.0, false, 4);
    run_doubleQuery(double_filterL, charParameter, Character.valueOf((char) 100), 100.0, true, 4);
    run_doubleQuery(double_filterR, charParameter, Character.valueOf((char) 0), 0.0, false, 6);
    run_doubleQuery(
        double_filterL, CharacterParameter, Character.valueOf((char) 23), 23.0, true, 4);
    run_doubleQuery(
        double_filterR, CharacterParameter, Character.valueOf((char) 100), 100.0, false, 4);
    run_doubleQuery(double_filterL, shortParameter, Short.valueOf((short) 100), 100.0, true, 4);
    run_doubleQuery(double_filterR, shortParameter, Short.valueOf((short) 0), 0.0, false, 6);
    run_doubleQuery(double_filterL, ShortParameter, Short.valueOf((short) 23), 23.0, true, 4);
    run_doubleQuery(double_filterR, ShortParameter, Short.valueOf((short) 100), 100.0, false, 4);
    run_doubleQuery(double_filterL, intParameter, Integer.valueOf(100), 100.0, true, 4);
    run_doubleQuery(double_filterR, intParameter, Integer.valueOf(0), 0.0, false, 6);
    run_doubleQuery(double_filterL, IntegerParameter, Integer.valueOf(5000), 5000.0, true, 7);
    run_doubleQuery(double_filterR, IntegerParameter, Integer.valueOf(-20), -20.0, false, 7);
    run_doubleQuery(double_filterL, longParameter, Long.valueOf(100), 100.0, true, 4);
    run_doubleQuery(double_filterR, longParameter, Long.valueOf(0), 0.0, false, 6);
    run_doubleQuery(double_filterL, LongParameter, Long.valueOf(5000), 5000.0, true, 7);
    run_doubleQuery(double_filterR, LongParameter, Long.valueOf(-20), -20.0, false, 7);
    run_doubleQuery(double_filterL, floatParameter, Float.valueOf(0.0f), 0.0f, true, 3);
    run_doubleQuery(double_filterR, floatParameter, Float.valueOf(100.0f), 100.0f, false, 4);
    run_doubleQuery(double_filterL, FloatParameter, Float.valueOf(100.0f), 100.0, true, 4);
    run_doubleQuery(double_filterR, FloatParameter, Float.valueOf(69.96f), 69.96, false, 6);
    run_doubleQuery(double_filterL, BigIntegerParameter, new BigInteger("5000"), 5000.0, true, 7);
    run_doubleQuery(double_filterR, BigIntegerParameter, new BigInteger("-20"), -20.0, false, 7);
    run_doubleQuery(double_filterL, BigDecimalParameter, new BigDecimal("100.0"), 100.0, true, 4);
    run_doubleQuery(double_filterR, BigDecimalParameter, new BigDecimal("69.96"), 69.96, false, 6);
    alltypes.setdouble(-25.5);
    run_doubleQuery(double_filterObj, AllTypesParameter, alltypes, -25.5, true, 2);
    run_doubleQuery(double_filterVal, null, null, 100.0, false, 4);

    run_ByteQuery(
        Byte_filterL, byteParameter, Byte.valueOf((byte) 50), Byte.valueOf((byte) 50), true, 5);
    run_ByteQuery(
        Byte_filterR,
        byteParameter,
        Byte.valueOf(Byte.MIN_VALUE),
        Byte.valueOf(Byte.MIN_VALUE),
        false,
        9);
    run_ByteQuery(
        Byte_filterL, ByteParameter, Byte.valueOf((byte) 20), Byte.valueOf((byte) 20), true, 5);
    run_ByteQuery(
        Byte_filterR,
        ByteParameter,
        Byte.valueOf(Byte.MAX_VALUE),
        Byte.valueOf(Byte.MAX_VALUE),
        false,
        0);
    run_ByteQuery(
        Byte_filterL, shortParameter, Short.valueOf((short) 60), Byte.valueOf((byte) 60), true, 7);
    run_ByteQuery(
        Byte_filterR, shortParameter, Short.valueOf((short) 51), Byte.valueOf((byte) 51), false, 3);
    run_ByteQuery(
        Byte_filterL,
        ShortParameter,
        Short.valueOf((short) -100),
        Byte.valueOf((byte) -100),
        true,
        1);
    run_ByteQuery(
        Byte_filterR,
        ShortParameter,
        Short.valueOf((short) -100),
        Byte.valueOf((byte) -100),
        false,
        8);
    run_ByteQuery(
        Byte_filterL,
        charParameter,
        Character.valueOf((char) 101),
        Byte.valueOf((byte) 101),
        true,
        9);
    run_ByteQuery(
        Byte_filterR,
        charParameter,
        Character.valueOf((char) 10),
        Byte.valueOf((byte) 10),
        false,
        5);
    run_ByteQuery(
        Byte_filterL,
        CharacterParameter,
        Character.valueOf((char) 50),
        Byte.valueOf((byte) 50),
        true,
        5);
    run_ByteQuery(
        Byte_filterR,
        CharacterParameter,
        Character.valueOf((char) 75),
        Byte.valueOf((byte) 75),
        false,
        2);
    run_ByteQuery(
        Byte_filterL, intParameter, Integer.valueOf(77), Byte.valueOf((byte) 77), true, 8);
    run_ByteQuery(
        Byte_filterR, intParameter, Integer.valueOf(60), Byte.valueOf((byte) 60), false, 3);
    run_ByteQuery(
        Byte_filterL, IntegerParameter, Integer.valueOf(40), Byte.valueOf((byte) 40), true, 5);
    run_ByteQuery(
        Byte_filterR, IntegerParameter, Integer.valueOf(75), Byte.valueOf((byte) 75), false, 2);
    run_ByteQuery(Byte_filterL, longParameter, Long.valueOf(50), Byte.valueOf((byte) 50), true, 5);
    run_ByteQuery(Byte_filterR, longParameter, Long.valueOf(50), Byte.valueOf((byte) 50), false, 3);
    run_ByteQuery(
        Byte_filterL, LongParameter, Long.valueOf(-100), Byte.valueOf((byte) -100), true, 1);
    run_ByteQuery(
        Byte_filterR, LongParameter, Long.valueOf(-100), Byte.valueOf((byte) -100), false, 8);
    run_ByteQuery(
        Byte_filterL, floatParameter, Float.valueOf((float) 50), Byte.valueOf((byte) 50), true, 5);
    run_ByteQuery(
        Byte_filterR, floatParameter, Float.valueOf((float) 50), Byte.valueOf((byte) 50), false, 3);
    run_ByteQuery(
        Byte_filterL,
        FloatParameter,
        Float.valueOf((float) -100),
        Byte.valueOf((byte) -100),
        true,
        1);
    run_ByteQuery(
        Byte_filterR,
        FloatParameter,
        Float.valueOf((float) -100),
        Byte.valueOf((byte) -100),
        false,
        8);
    run_ByteQuery(
        Byte_filterL, doubleParameter, Double.valueOf(50), Byte.valueOf((byte) 50), true, 5);
    run_ByteQuery(
        Byte_filterR, doubleParameter, Double.valueOf(50), Byte.valueOf((byte) 50), false, 3);
    run_ByteQuery(
        Byte_filterL, DoubleParameter, Double.valueOf(-100), Byte.valueOf((byte) -100), true, 1);
    run_ByteQuery(
        Byte_filterR, DoubleParameter, Double.valueOf(-100), Byte.valueOf((byte) -100), false, 8);
    run_ByteQuery(
        Byte_filterL, BigIntegerParameter, new BigInteger("50"), Byte.valueOf((byte) 50), true, 5);
    run_ByteQuery(
        Byte_filterR,
        BigIntegerParameter,
        new BigInteger("-100"),
        Byte.valueOf((byte) -100),
        false,
        8);
    run_ByteQuery(
        Byte_filterL,
        BigDecimalParameter,
        new BigDecimal("50.000000"),
        Byte.valueOf((byte) 50),
        true,
        5);
    run_ByteQuery(
        Byte_filterR,
        BigDecimalParameter,
        new BigDecimal("10.00000"),
        Byte.valueOf((byte) 10),
        false,
        5);
    Byte val = Byte.valueOf((byte) 50);
    alltypes.setByte(val);
    run_ByteQuery(Byte_filterObj, AllTypesParameter, alltypes, val, false, 3);
    val = Byte.valueOf((byte) 51);
    alltypes.setByte(val);
    run_ByteQuery(Byte_filterObj, AllTypesParameter, alltypes, val, false, 3);
    run_ByteQuery(Byte_filterVal, null, null, Byte.valueOf((byte) 100), true, 8);

    run_ShortQuery(
        Short_filterL,
        shortParameter,
        Short.valueOf((short) 100),
        Short.valueOf((short) 100),
        true,
        5);
    run_ShortQuery(
        Short_filterR,
        shortParameter,
        Short.valueOf((short) 100),
        Short.valueOf((short) 100),
        false,
        3);
    run_ShortQuery(
        Short_filterL,
        ShortParameter,
        Short.valueOf(Short.MIN_VALUE),
        Short.valueOf(Short.MIN_VALUE),
        true,
        0);
    run_ShortQuery(
        Short_filterR,
        ShortParameter,
        Short.valueOf((short) 253),
        Short.valueOf((short) 253),
        false,
        3);
    run_ShortQuery(
        Short_filterR,
        shortParameter,
        Short.valueOf((short) 1000),
        Short.valueOf((short) 1000),
        false,
        2);
    run_ShortQuery(
        Short_filterL, byteParameter, Byte.valueOf((byte) 75), Short.valueOf((short) 75), true, 5);
    run_ShortQuery(
        Short_filterR, byteParameter, Byte.valueOf((byte) 75), Short.valueOf((short) 75), false, 5);
    run_ShortQuery(
        Short_filterL,
        ByteParameter,
        Byte.valueOf((byte) 100),
        Short.valueOf((short) 100),
        true,
        5);
    run_ShortQuery(
        Short_filterR,
        ByteParameter,
        Byte.valueOf((byte) 100),
        Short.valueOf((short) 100),
        false,
        3);
    run_ShortQuery(
        Short_filterL,
        charParameter,
        Character.valueOf((char) 75),
        Short.valueOf((short) 75),
        true,
        5);
    run_ShortQuery(
        Short_filterR,
        charParameter,
        Character.valueOf((char) 75),
        Short.valueOf((short) 75),
        false,
        5);
    run_ShortQuery(
        Short_filterL,
        CharacterParameter,
        Character.valueOf((char) 100),
        Short.valueOf((short) 100),
        true,
        5);
    run_ShortQuery(
        Short_filterR,
        CharacterParameter,
        Character.valueOf((char) 200),
        Short.valueOf((short) 200),
        false,
        3);
    run_ShortQuery(
        Short_filterL,
        intParameter,
        Integer.valueOf(-10000),
        Short.valueOf((short) -10000),
        true,
        1);
    run_ShortQuery(
        Short_filterR,
        intParameter,
        Integer.valueOf(-10000),
        Short.valueOf((short) -10000),
        false,
        8);
    run_ShortQuery(
        Short_filterL,
        IntegerParameter,
        Integer.valueOf(10000),
        Short.valueOf((short) 10000),
        true,
        8);
    run_ShortQuery(
        Short_filterR,
        IntegerParameter,
        Integer.valueOf(10000),
        Short.valueOf((short) 10000),
        false,
        1);
    run_ShortQuery(
        Short_filterL, longParameter, Long.valueOf(20000), Short.valueOf((short) 20000), true, 9);
    run_ShortQuery(
        Short_filterR, longParameter, Long.valueOf(5000), Short.valueOf((short) 5000), false, 2);
    run_ShortQuery(
        Short_filterL, LongParameter, Long.valueOf(200), Short.valueOf((short) 200), true, 7);
    run_ShortQuery(
        Short_filterR, LongParameter, Long.valueOf(500), Short.valueOf((short) 500), false, 3);
    run_ShortQuery(
        Short_filterL,
        floatParameter,
        Float.valueOf(23000.0f),
        Short.valueOf((short) 23000),
        true,
        9);
    run_ShortQuery(
        Short_filterR,
        floatParameter,
        Float.valueOf(23000.0f),
        Short.valueOf((short) 23000),
        false,
        1);
    run_ShortQuery(
        Short_filterL, FloatParameter, Float.valueOf(10.0f), Short.valueOf((short) 10), true, 5);
    run_ShortQuery(
        Short_filterR, FloatParameter, Float.valueOf(101.0f), Short.valueOf((short) 101), false, 3);
    run_ShortQuery(
        Short_filterL,
        doubleParameter,
        Double.valueOf(-10000.0),
        Short.valueOf((short) -10000),
        true,
        1);
    run_ShortQuery(
        Short_filterR,
        doubleParameter,
        Double.valueOf(-10000.0),
        Short.valueOf((short) -10000),
        false,
        8);
    run_ShortQuery(
        Short_filterL, DoubleParameter, Double.valueOf(101.0), Short.valueOf((short) 101), true, 7);
    run_ShortQuery(
        Short_filterR, DoubleParameter, Double.valueOf(23.0), Short.valueOf((short) 23), false, 5);
    run_ShortQuery(
        Short_filterL,
        BigIntegerParameter,
        new BigInteger("10000"),
        Short.valueOf((short) 10000),
        true,
        8);
    run_ShortQuery(
        Short_filterR,
        BigIntegerParameter,
        new BigInteger("30000"),
        Short.valueOf((short) 30000),
        false,
        1);
    run_ShortQuery(
        Short_filterL,
        BigDecimalParameter,
        new BigDecimal("23.0"),
        Short.valueOf((short) 23),
        true,
        5);
    run_ShortQuery(
        Short_filterR,
        BigDecimalParameter,
        new BigDecimal("23.0"),
        Short.valueOf((short) 23),
        false,
        5);
    Short sval = Short.valueOf((short) 100);
    alltypes.setShort(sval);
    run_ShortQuery(Short_filterObj, AllTypesParameter, alltypes, sval, false, 3);
    sval = Short.valueOf((short) 23);
    alltypes.setShort(sval);
    run_ShortQuery(Short_filterObj, AllTypesParameter, alltypes, sval, false, 5);
    run_ShortQuery(Short_filterVal, null, null, Short.valueOf((short) -1000), true, 2);

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

    run_IntegerQuery(
        Integer_filterL,
        intParameter,
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        true,
        0);
    run_IntegerQuery(
        Integer_filterR,
        intParameter,
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        false,
        0);
    run_IntegerQuery(
        Integer_filterR, intParameter, Integer.valueOf(23), Integer.valueOf(23), false, 6);
    run_IntegerQuery(
        Integer_filterL,
        IntegerParameter,
        Integer.valueOf(1000000),
        Integer.valueOf(1000000),
        true,
        8);
    run_IntegerQuery(
        Integer_filterR, IntegerParameter, Integer.valueOf(1000), Integer.valueOf(1000), false, 3);
    run_IntegerQuery(
        Integer_filterL, byteParameter, Byte.valueOf((byte) 100), Integer.valueOf(100), true, 4);
    run_IntegerQuery(
        Integer_filterR, byteParameter, Byte.valueOf((byte) 0), Integer.valueOf(0), false, 6);
    run_IntegerQuery(
        Integer_filterL, ByteParameter, Byte.valueOf((byte) 100), Integer.valueOf(100), true, 4);
    run_IntegerQuery(
        Integer_filterR, ByteParameter, Byte.valueOf((byte) 0), Integer.valueOf(0), false, 6);
    run_IntegerQuery(
        Integer_filterL,
        shortParameter,
        Short.valueOf((short) 10000),
        Integer.valueOf(10000),
        true,
        7);
    run_IntegerQuery(
        Integer_filterR,
        shortParameter,
        Short.valueOf((short) -1000),
        Integer.valueOf(-1000),
        false,
        7);
    run_IntegerQuery(
        Integer_filterL,
        ShortParameter,
        Short.valueOf((short) -1000),
        Integer.valueOf(-1000),
        true,
        2);
    run_IntegerQuery(
        Integer_filterR,
        ShortParameter,
        Short.valueOf((short) -999),
        Integer.valueOf(-999),
        false,
        7);
    run_IntegerQuery(
        Integer_filterL,
        charParameter,
        Character.valueOf((char) 10000),
        Integer.valueOf(10000),
        true,
        7);
    run_IntegerQuery(
        Integer_filterR,
        charParameter,
        Character.valueOf((char) 10000),
        Integer.valueOf(10000),
        false,
        2);
    run_IntegerQuery(
        Integer_filterL,
        CharacterParameter,
        Character.valueOf((char) 100),
        Integer.valueOf(100),
        true,
        4);
    run_IntegerQuery(
        Integer_filterR,
        CharacterParameter,
        Character.valueOf((char) 10000),
        Integer.valueOf(10000),
        false,
        2);
    run_IntegerQuery(
        Integer_filterL,
        longParameter,
        Long.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        true,
        9);
    run_IntegerQuery(
        Integer_filterR,
        longParameter,
        Long.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        false,
        9);
    run_IntegerQuery(
        Integer_filterL, LongParameter, Long.valueOf(10000), Integer.valueOf(10000), true, 7);
    run_IntegerQuery(
        Integer_filterR, LongParameter, Long.valueOf(43), Integer.valueOf(43), false, 6);
    run_IntegerQuery(
        Integer_filterL,
        floatParameter,
        Float.valueOf((float) AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        true,
        9);
    run_IntegerQuery(
        Integer_filterR,
        floatParameter,
        Float.valueOf((float) AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        false,
        9);
    run_IntegerQuery(
        Integer_filterL,
        FloatParameter,
        Float.valueOf((float) 10000),
        Integer.valueOf(10000),
        true,
        7);
    run_IntegerQuery(
        Integer_filterR, FloatParameter, Float.valueOf((float) 43), Integer.valueOf(43), false, 6);
    run_IntegerQuery(
        Integer_filterL,
        doubleParameter,
        Double.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_POSITIVE_INT),
        true,
        9);
    run_IntegerQuery(
        Integer_filterR,
        doubleParameter,
        Double.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        Integer.valueOf(AllTypes.VERY_LARGE_NEGATIVE_INT),
        false,
        9);
    run_IntegerQuery(
        Integer_filterL, DoubleParameter, Double.valueOf(10000), Integer.valueOf(10000), true, 7);
    run_IntegerQuery(
        Integer_filterR,
        DoubleParameter,
        Double.valueOf(1000001.0),
        Integer.valueOf(1000001),
        false,
        1);
    run_IntegerQuery(
        Integer_filterL,
        BigIntegerParameter,
        new BigInteger("1000000"),
        Integer.valueOf(1000000),
        true,
        8);
    run_IntegerQuery(
        Integer_filterR,
        BigIntegerParameter,
        new BigInteger("1000"),
        Integer.valueOf(1000),
        false,
        3);
    run_IntegerQuery(
        Integer_filterL,
        BigDecimalParameter,
        new BigDecimal("10000.0"),
        Integer.valueOf(10000),
        true,
        7);
    run_IntegerQuery(
        Integer_filterR,
        BigDecimalParameter,
        new BigDecimal("43.0"),
        Integer.valueOf(43),
        false,
        6);
    alltypes.setInteger(Integer.valueOf(100));
    run_IntegerQuery(
        Integer_filterObj, AllTypesParameter, alltypes, Integer.valueOf(100), false, 4);
    run_IntegerQuery(Integer_filterVal, null, null, Integer.valueOf(100), false, 4);

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

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

    run_DoubleQuery(
        Double_filterL,
        doubleParameter,
        Double.valueOf(-999999999999.0),
        Double.valueOf(-999999999999.0),
        true,
        1);
    run_DoubleQuery(
        Double_filterR,
        doubleParameter,
        Double.valueOf(9999999999999.0),
        Double.valueOf(9999999999999.0),
        false,
        1);
    run_DoubleQuery(
        Double_filterL, DoubleParameter, Double.valueOf(0.0), Double.valueOf(0.0), true, 3);
    run_DoubleQuery(
        Double_filterR, DoubleParameter, Double.valueOf(23.34), Double.valueOf(23.34), false, 6);
    run_DoubleQuery(
        Double_filterL, byteParameter, Byte.valueOf((byte) 100), Double.valueOf(100.0), true, 4);
    run_DoubleQuery(
        Double_filterR, byteParameter, Byte.valueOf((byte) 0), Double.valueOf(0.0), false, 6);
    run_DoubleQuery(
        Double_filterL, ByteParameter, Byte.valueOf((byte) -23), Double.valueOf(-23.0), true, 3);
    run_DoubleQuery(
        Double_filterR, ByteParameter, Byte.valueOf((byte) 100), Double.valueOf(100.0), false, 4);
    run_DoubleQuery(
        Double_filterL, shortParameter, Short.valueOf((short) 100), Double.valueOf(100.0), true, 4);
    run_DoubleQuery(
        Double_filterR, shortParameter, Short.valueOf((short) 0), Double.valueOf(0.0), false, 6);
    run_DoubleQuery(
        Double_filterL, ShortParameter, Short.valueOf((short) 23), Double.valueOf(23.0), true, 4);
    run_DoubleQuery(
        Double_filterR,
        ShortParameter,
        Short.valueOf((short) 400),
        Double.valueOf(400.0),
        false,
        3);
    run_DoubleQuery(
        Double_filterL,
        charParameter,
        Character.valueOf((char) 100),
        Double.valueOf(100.0),
        true,
        4);
    run_DoubleQuery(
        Double_filterR, charParameter, Character.valueOf((char) 0), Double.valueOf(0.0), false, 6);
    run_DoubleQuery(
        Double_filterL,
        CharacterParameter,
        Character.valueOf((char) 23),
        Double.valueOf(23.0),
        true,
        4);
    run_DoubleQuery(
        Double_filterR,
        CharacterParameter,
        Character.valueOf((char) 400),
        Double.valueOf(400.0),
        false,
        3);
    run_DoubleQuery(
        Double_filterL, intParameter, Integer.valueOf(100), Double.valueOf(100.0), true, 4);
    run_DoubleQuery(
        Double_filterR, intParameter, Integer.valueOf(0), Double.valueOf(0.0), false, 6);
    run_DoubleQuery(
        Double_filterL, IntegerParameter, Integer.valueOf(23), Double.valueOf(23.0), true, 4);
    run_DoubleQuery(
        Double_filterR, IntegerParameter, Integer.valueOf(100), Double.valueOf(100.0), false, 4);
    run_DoubleQuery(
        Double_filterL, longParameter, Long.valueOf(100), Double.valueOf(100.0), true, 4);
    run_DoubleQuery(Double_filterR, longParameter, Long.valueOf(0), Double.valueOf(0.0), false, 6);
    run_DoubleQuery(Double_filterL, LongParameter, Long.valueOf(23), Double.valueOf(23.0), true, 4);
    run_DoubleQuery(
        Double_filterR, LongParameter, Long.valueOf(100), Double.valueOf(100.0), false, 4);
    run_DoubleQuery(
        Double_filterL, floatParameter, Float.valueOf(0.0f), Double.valueOf(0.0f), true, 3);
    run_DoubleQuery(
        Double_filterR, floatParameter, Float.valueOf(100.0f), Double.valueOf(100.0f), false, 4);
    run_DoubleQuery(
        Double_filterL, FloatParameter, Float.valueOf(100.0f), Double.valueOf(100.0f), true, 4);
    run_DoubleQuery(
        Double_filterR, FloatParameter, Float.valueOf(69.96f), Double.valueOf(69.96), false, 6);
    run_DoubleQuery(
        Double_filterL,
        BigIntegerParameter,
        new BigInteger("5000"),
        Double.valueOf(5000.0),
        true,
        7);
    run_DoubleQuery(
        Double_filterR,
        BigIntegerParameter,
        new BigInteger("-20"),
        Double.valueOf(-20.0),
        false,
        7);
    run_DoubleQuery(
        Double_filterL,
        BigDecimalParameter,
        new BigDecimal("100.0"),
        Double.valueOf(100.0),
        true,
        4);
    run_DoubleQuery(
        Double_filterR,
        BigDecimalParameter,
        new BigDecimal("69.96"),
        Double.valueOf(69.96),
        false,
        6);
    alltypes.setDouble(Double.valueOf(-999999999999.0));
    run_DoubleQuery(
        Double_filterObj, AllTypesParameter, alltypes, Double.valueOf(-999999999999.0), true, 1);
    run_DoubleQuery(Double_filterVal, null, null, Double.valueOf(100.0), false, 4);

    run_StringQuery(String_filterL, StringParameter, "JDO", "JDO", true, 1);
    run_StringQuery(String_filterR, StringParameter, "JDBC", "JDBC", false, 9);
    alltypes.setString("abcde");
    run_StringQuery(String_filterObj, AllTypesParameter, alltypes, "abcde", true, 7);
    run_StringQuery(String_filterVal1, null, null, "Java", false, 4);
    run_StringQuery(String_filterVal2, null, null, "", false, 9);

    BigDecimal bd = new BigDecimal("100.0");
    run_BigDecimalQuery(BigDecimal_filterL, BigDecimalParameter, bd, bd, true, 4);
    bd = new BigDecimal("-234234.23333");
    run_BigDecimalQuery(BigDecimal_filterR, BigDecimalParameter, bd, bd, false, 8);
    bd = new BigDecimal("989899.33304953");
    run_BigDecimalQuery(BigDecimal_filterL, BigDecimalParameter, bd, bd, true, 7);
    bd = new BigDecimal("-1123123.22");
    run_BigDecimalQuery(BigDecimal_filterR, BigDecimalParameter, bd, bd, false, 9);
    alltypes.setBigDecimal(bd);
    run_BigDecimalQuery(BigDecimal_filterObj, AllTypesParameter, alltypes, bd, true, 0);

    BigInteger bi = new BigInteger("987034534985043985");
    run_BigIntegerQuery(BigInteger_filterL, BigIntegerParameter, bi, bi, true, 9);
    bi = new BigInteger("-999999999999999999");
    run_BigIntegerQuery(BigInteger_filterR, BigIntegerParameter, bi, bi, false, 9);
    bi = new BigInteger("-9999999999999999999");
    run_BigIntegerQuery(BigInteger_filterR, BigIntegerParameter, bi, bi, false, 10);
    bi = new BigInteger("1333330");
    alltypes.setBigInteger(bi);
    run_BigIntegerQuery(BigInteger_filterObj, AllTypesParameter, alltypes, bi, false, 2);

    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, true, 7);
    gc.set(1992, Calendar.NOVEMBER, 22, 9, 0, 0);
    d = gc.getTime();
    run_DateQuery(Date_filterR, DateParameter, d, d, false, 4);
    gc.set(1959, Calendar.OCTOBER, 9, 9, 0, 0);
    d = gc.getTime();
    run_DateQuery(Date_filterR, DateParameter, d, d, false, 7);
    gc.set(1995, Calendar.JUNE, 14, 9, 0, 0);
    d = gc.getTime();
    alltypes.setDate(d);
    run_DateQuery(Date_filterObj, AllTypesParameter, alltypes, d, false, 3);
  }

  private void run_byteQuery(
      String filter,
      String parameter,
      Object parameterValue,
      byte value,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? value > val : val > value;
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than 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,
      boolean valueOnLeft,
      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();
      boolean correct_value = valueOnLeft ? (value.compareTo(val) > 0) : (val.compareTo(value) > 0);
      if (!correct_value) {
        fail(
            ASSERTION_FAILED,
            "JDOQL Greater Than test returns incorrect value, retrieved value: "
                + val
                + ", with parameter value: "
                + value,
            filter,
            parameter);
      }
      cnt++;
    }
    if (cnt != expected_count) {
      fail(
          ASSERTION_FAILED,
          "JDOQL Greater Than test returns wrong number of instances, expected "
              + expected_count
              + ", got "
              + cnt,
          filter,
          parameter);
    }
    query.close(queryResult);
    tx.rollback();
  }

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