/*
 * 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> 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());
  }
}
