/**
 * 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
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * 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 jp.co.yahoo.yosegi.blackbox;

import java.io.IOException;

import java.util.Set;
import java.util.HashSet;
import java.util.stream.Stream;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.Arguments;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.params.provider.Arguments.arguments;

import jp.co.yahoo.yosegi.config.Configuration;

import jp.co.yahoo.yosegi.message.objects.*;

import jp.co.yahoo.yosegi.spread.expression.*;
import jp.co.yahoo.yosegi.spread.column.filter.*;
import jp.co.yahoo.yosegi.spread.column.*;
import jp.co.yahoo.yosegi.binary.*;
import jp.co.yahoo.yosegi.binary.maker.*;

public class TestNumberCellIndex{

  public static Stream<Arguments> data1() throws IOException{
    return Stream.of(
      arguments( createByteTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeLongColumnBinaryMaker" ) ),
      arguments( createByteTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeDumpLongColumnBinaryMaker" ) ),
      arguments( createByteTestData( "jp.co.yahoo.yosegi.binary.maker.RleLongColumnBinaryMaker" ) ),
      arguments( createByteTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayLongColumnBinaryMaker" ) ),
      arguments( createByteTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpLongColumnBinaryMaker" ) ),

      arguments( createShortTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeLongColumnBinaryMaker" ) ),
      arguments( createShortTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeDumpLongColumnBinaryMaker" ) ),
      arguments( createShortTestData( "jp.co.yahoo.yosegi.binary.maker.RleLongColumnBinaryMaker" ) ),
      arguments( createShortTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayLongColumnBinaryMaker" ) ),
      arguments( createShortTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpLongColumnBinaryMaker" ) ),

      arguments( createIntTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeLongColumnBinaryMaker" ) ),
      arguments( createIntTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeDumpLongColumnBinaryMaker" ) ),
      arguments( createIntTestData( "jp.co.yahoo.yosegi.binary.maker.RleLongColumnBinaryMaker" ) ),
      arguments( createIntTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayLongColumnBinaryMaker" ) ),
      arguments( createIntTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpLongColumnBinaryMaker" ) ),

      arguments( createLongTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeLongColumnBinaryMaker" ) ),
      arguments( createLongTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeDumpLongColumnBinaryMaker" ) ),
      arguments( createLongTestData( "jp.co.yahoo.yosegi.binary.maker.RleLongColumnBinaryMaker" ) ),
      arguments( createLongTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayLongColumnBinaryMaker" ) ),
      arguments( createLongTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpLongColumnBinaryMaker" ) ),

      arguments( createFloatTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeRangeDumpFloatColumnBinaryMaker" ) ),
      arguments( createFloatTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeRangeDumpFloatColumnBinaryMaker" ) ),
      arguments( createFloatTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayFloatColumnBinaryMaker" ) ),
      arguments( createFloatTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpFloatColumnBinaryMaker" ) ),

      arguments( createDoubleTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeRangeDumpDoubleColumnBinaryMaker" ) ),
      arguments( createDoubleTestData( "jp.co.yahoo.yosegi.binary.maker.UnsafeOptimizeDoubleColumnBinaryMaker" ) ),
      arguments( createDoubleTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDoubleColumnBinaryMaker" ) ),
      arguments( createDoubleTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpDoubleColumnBinaryMaker" ) ),

      arguments( createBytesTestData( "jp.co.yahoo.yosegi.binary.maker.DumpBytesColumnBinaryMaker" ) ),
      arguments( createBytesTestData( "jp.co.yahoo.yosegi.binary.maker.OptimizedNullArrayDumpBytesColumnBinaryMaker" ) )
    );
  }

  public static IColumn createByteTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.BYTE , "column" );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-10 ) , 0 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-11 ) , 1 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-12 ) , 2 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-13 ) , 3 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-14 ) , 4 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-15 ) , 5 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-16 ) , 6 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-17 ) , 7 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-18 ) , 8 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)-19 ) , 9 );

    column.add( ColumnType.BYTE , new ByteObj( (byte)20 ) , 20 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)21 ) , 21 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)22 ) , 22 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)23 ) , 23 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)24 ) , 24 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)25 ) , 25 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)26 ) , 26 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)27 ) , 27 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)28 ) , 28 );
    column.add( ColumnType.BYTE , new ByteObj( (byte)29 ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createShortTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.SHORT , "column" );
    column.add( ColumnType.SHORT , new ShortObj( (short)-10 ) , 0 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-11 ) , 1 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-12 ) , 2 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-13 ) , 3 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-14 ) , 4 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-15 ) , 5 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-16 ) , 6 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-17 ) , 7 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-18 ) , 8 );
    column.add( ColumnType.SHORT , new ShortObj( (short)-19 ) , 9 );

    column.add( ColumnType.SHORT , new ShortObj( (short)20 ) , 20 );
    column.add( ColumnType.SHORT , new ShortObj( (short)21 ) , 21 );
    column.add( ColumnType.SHORT , new ShortObj( (short)22 ) , 22 );
    column.add( ColumnType.SHORT , new ShortObj( (short)23 ) , 23 );
    column.add( ColumnType.SHORT , new ShortObj( (short)24 ) , 24 );
    column.add( ColumnType.SHORT , new ShortObj( (short)25 ) , 25 );
    column.add( ColumnType.SHORT , new ShortObj( (short)26 ) , 26 );
    column.add( ColumnType.SHORT , new ShortObj( (short)27 ) , 27 );
    column.add( ColumnType.SHORT , new ShortObj( (short)28 ) , 28 );
    column.add( ColumnType.SHORT , new ShortObj( (short)29 ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createIntTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.INTEGER , "column" );
    column.add( ColumnType.INTEGER , new IntegerObj( -10 ) , 0 );
    column.add( ColumnType.INTEGER , new IntegerObj( -11 ) , 1 );
    column.add( ColumnType.INTEGER , new IntegerObj( -12 ) , 2 );
    column.add( ColumnType.INTEGER , new IntegerObj( -13 ) , 3 );
    column.add( ColumnType.INTEGER , new IntegerObj( -14 ) , 4 );
    column.add( ColumnType.INTEGER , new IntegerObj( -15 ) , 5 );
    column.add( ColumnType.INTEGER , new IntegerObj( -16 ) , 6 );
    column.add( ColumnType.INTEGER , new IntegerObj( -17 ) , 7 );
    column.add( ColumnType.INTEGER , new IntegerObj( -18 ) , 8 );
    column.add( ColumnType.INTEGER , new IntegerObj( -19 ) , 9 );

    column.add( ColumnType.INTEGER , new IntegerObj( 20 ) , 20 );
    column.add( ColumnType.INTEGER , new IntegerObj( 21 ) , 21 );
    column.add( ColumnType.INTEGER , new IntegerObj( 22 ) , 22 );
    column.add( ColumnType.INTEGER , new IntegerObj( 23 ) , 23 );
    column.add( ColumnType.INTEGER , new IntegerObj( 24 ) , 24 );
    column.add( ColumnType.INTEGER , new IntegerObj( 25 ) , 25 );
    column.add( ColumnType.INTEGER , new IntegerObj( 26 ) , 26 );
    column.add( ColumnType.INTEGER , new IntegerObj( 27 ) , 27 );
    column.add( ColumnType.INTEGER , new IntegerObj( 28 ) , 28 );
    column.add( ColumnType.INTEGER , new IntegerObj( 29 ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createLongTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.LONG , "column" );
    column.add( ColumnType.LONG , new LongObj( -10 ) , 0 );
    column.add( ColumnType.LONG , new LongObj( -11 ) , 1 );
    column.add( ColumnType.LONG , new LongObj( -12 ) , 2 );
    column.add( ColumnType.LONG , new LongObj( -13 ) , 3 );
    column.add( ColumnType.LONG , new LongObj( -14 ) , 4 );
    column.add( ColumnType.LONG , new LongObj( -15 ) , 5 );
    column.add( ColumnType.LONG , new LongObj( -16 ) , 6 );
    column.add( ColumnType.LONG , new LongObj( -17 ) , 7 );
    column.add( ColumnType.LONG , new LongObj( -18 ) , 8 );
    column.add( ColumnType.LONG , new LongObj( -19 ) , 9 );

    column.add( ColumnType.LONG , new LongObj( 20 ) , 20 );
    column.add( ColumnType.LONG , new LongObj( 21 ) , 21 );
    column.add( ColumnType.LONG , new LongObj( 22 ) , 22 );
    column.add( ColumnType.LONG , new LongObj( 23 ) , 23 );
    column.add( ColumnType.LONG , new LongObj( 24 ) , 24 );
    column.add( ColumnType.LONG , new LongObj( 25 ) , 25 );
    column.add( ColumnType.LONG , new LongObj( 26 ) , 26 );
    column.add( ColumnType.LONG , new LongObj( 27 ) , 27 );
    column.add( ColumnType.LONG , new LongObj( 28 ) , 28 );
    column.add( ColumnType.LONG , new LongObj( 29 ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createFloatTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.FLOAT , "column" );
    column.add( ColumnType.FLOAT , new FloatObj( -10.0f ) , 0 );
    column.add( ColumnType.FLOAT , new FloatObj( -11.0f ) , 1 );
    column.add( ColumnType.FLOAT , new FloatObj( -12.0f ) , 2 );
    column.add( ColumnType.FLOAT , new FloatObj( -13.0f ) , 3 );
    column.add( ColumnType.FLOAT , new FloatObj( -14.0f ) , 4 );
    column.add( ColumnType.FLOAT , new FloatObj( -15.0f ) , 5 );
    column.add( ColumnType.FLOAT , new FloatObj( -16.0f ) , 6 );
    column.add( ColumnType.FLOAT , new FloatObj( -17.0f ) , 7 );
    column.add( ColumnType.FLOAT , new FloatObj( -18.0f ) , 8 );
    column.add( ColumnType.FLOAT , new FloatObj( -19.0f ) , 9 );

    column.add( ColumnType.FLOAT , new FloatObj( 20.0f ) , 20 );
    column.add( ColumnType.FLOAT , new FloatObj( 21.0f ) , 21 );
    column.add( ColumnType.FLOAT , new FloatObj( 22.0f ) , 22 );
    column.add( ColumnType.FLOAT , new FloatObj( 23.0f ) , 23 );
    column.add( ColumnType.FLOAT , new FloatObj( 24.0f ) , 24 );
    column.add( ColumnType.FLOAT , new FloatObj( 25.0f ) , 25 );
    column.add( ColumnType.FLOAT , new FloatObj( 26.0f ) , 26 );
    column.add( ColumnType.FLOAT , new FloatObj( 27.0f ) , 27 );
    column.add( ColumnType.FLOAT , new FloatObj( 28.0f ) , 28 );
    column.add( ColumnType.FLOAT , new FloatObj( 29.0f ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createDoubleTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.DOUBLE , "column" );
    column.add( ColumnType.DOUBLE , new DoubleObj( -10.0d ) , 0 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -11.0d ) , 1 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -12.0d ) , 2 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -13.0d ) , 3 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -14.0d ) , 4 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -15.0d ) , 5 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -16.0d ) , 6 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -17.0d ) , 7 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -18.0d ) , 8 );
    column.add( ColumnType.DOUBLE , new DoubleObj( -19.0d ) , 9 );

    column.add( ColumnType.DOUBLE , new DoubleObj( 20.0d ) , 20 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 21.0d ) , 21 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 22.0d ) , 22 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 23.0d ) , 23 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 24.0d ) , 24 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 25.0d ) , 25 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 26.0d ) , 26 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 27.0d ) , 27 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 28.0d ) , 28 );
    column.add( ColumnType.DOUBLE , new DoubleObj( 29.0d ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createStringTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.STRING , "column" );
    column.add( ColumnType.STRING , new StringObj( "-10" ) , 0 );
    column.add( ColumnType.STRING , new StringObj( "-11" ) , 1 );
    column.add( ColumnType.STRING , new StringObj( "-12" ) , 2 );
    column.add( ColumnType.STRING , new StringObj( "-13" ) , 3 );
    column.add( ColumnType.STRING , new StringObj( "-14" ) , 4 );
    column.add( ColumnType.STRING , new StringObj( "-15" ) , 5 );
    column.add( ColumnType.STRING , new StringObj( "-16" ) , 6 );
    column.add( ColumnType.STRING , new StringObj( "-17" ) , 7 );
    column.add( ColumnType.STRING , new StringObj( "-18" ) , 8 );
    column.add( ColumnType.STRING , new StringObj( "-19" ) , 9 );

    column.add( ColumnType.STRING , new StringObj( "20" ) , 20 );
    column.add( ColumnType.STRING , new StringObj( "21" ) , 21 );
    column.add( ColumnType.STRING , new StringObj( "22" ) , 22 );
    column.add( ColumnType.STRING , new StringObj( "23" ) , 23 );
    column.add( ColumnType.STRING , new StringObj( "24" ) , 24 );
    column.add( ColumnType.STRING , new StringObj( "25" ) , 25 );
    column.add( ColumnType.STRING , new StringObj( "26" ) , 26 );
    column.add( ColumnType.STRING , new StringObj( "27" ) , 27 );
    column.add( ColumnType.STRING , new StringObj( "28" ) , 28 );
    column.add( ColumnType.STRING , new StringObj( "29" ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public static IColumn createBytesTestData( final String targetClassName ) throws IOException{
    IColumn column = new PrimitiveColumn( ColumnType.BYTES , "column" );
    column.add( ColumnType.BYTES , new BytesObj( "-10".getBytes() ) , 0 );
    column.add( ColumnType.BYTES , new BytesObj( "-11".getBytes() ) , 1 );
    column.add( ColumnType.BYTES , new BytesObj( "-12".getBytes() ) , 2 );
    column.add( ColumnType.BYTES , new BytesObj( "-13".getBytes() ) , 3 );
    column.add( ColumnType.BYTES , new BytesObj( "-14".getBytes() ) , 4 );
    column.add( ColumnType.BYTES , new BytesObj( "-15".getBytes() ) , 5 );
    column.add( ColumnType.BYTES , new BytesObj( "-16".getBytes() ) , 6 );
    column.add( ColumnType.BYTES , new BytesObj( "-17".getBytes() ) , 7 );
    column.add( ColumnType.BYTES , new BytesObj( "-18".getBytes() ) , 8 );
    column.add( ColumnType.BYTES , new BytesObj( "-19".getBytes() ) , 9 );

    column.add( ColumnType.BYTES , new BytesObj( "20".getBytes() ) , 20 );
    column.add( ColumnType.BYTES , new BytesObj( "21".getBytes() ) , 21 );
    column.add( ColumnType.BYTES , new BytesObj( "22".getBytes() ) , 22 );
    column.add( ColumnType.BYTES , new BytesObj( "23".getBytes() ) , 23 );
    column.add( ColumnType.BYTES , new BytesObj( "24".getBytes() ) , 24 );
    column.add( ColumnType.BYTES , new BytesObj( "25".getBytes() ) , 25 );
    column.add( ColumnType.BYTES , new BytesObj( "26".getBytes() ) , 26 );
    column.add( ColumnType.BYTES , new BytesObj( "27".getBytes() ) , 27 );
    column.add( ColumnType.BYTES , new BytesObj( "28".getBytes() ) , 28 );
    column.add( ColumnType.BYTES , new BytesObj( "29".getBytes() ) , 29 );

    IColumnBinaryMaker maker = FindColumnBinaryMaker.get( targetClassName );
    ColumnBinaryMakerConfig defaultConfig = new ColumnBinaryMakerConfig();
    ColumnBinaryMakerCustomConfigNode configNode = new ColumnBinaryMakerCustomConfigNode( "root" , defaultConfig );
    ColumnBinary columnBinary = maker.toBinary( defaultConfig , null , new CompressResultNode() , column );
    return maker.toColumn( columnBinary );
  }

  public void dumpFilterResult( final boolean[] result ){
    System.out.println( "-----------------------" );
    System.out.println( "Integer cell index test result." );
    System.out.println( "-----------------------" );
    for( int i = 0 ; i < result.length ; i++ ){
      System.out.println( String.format( "index:%d = %s" , i , Boolean.toString( result[i] ) ) );
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_equal_obj_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)-10 ) , new ShortObj( (short)-10 ) , new IntegerObj( -10 ) , new LongObj( -10 ) , new FloatObj( -10.0f ) , new DoubleObj( -10.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.EQUAL , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_equal_obj_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 22 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)22 ) , new ShortObj( (short)22 ) , new IntegerObj( 22 ) , new LongObj( 22 ) , new FloatObj( 22.0f ) , new DoubleObj( 22.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.EQUAL , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_equal_obj_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)29 ) , new ShortObj( (short)29 ) , new IntegerObj( 29 ) , new LongObj( 29 ) , new FloatObj( 29.0f ) , new DoubleObj( 29.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.EQUAL , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_notequal_obj_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)-10 ) , new ShortObj( (short)-10 ) , new IntegerObj( -10 ) , new LongObj( -10 ) , new FloatObj( -10.0f ) , new DoubleObj( -10.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.NOT_EQUAL , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_notequal_obj_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)22 ) , new ShortObj( (short)22 ) , new IntegerObj( 22 ) , new LongObj( 22 ) , new FloatObj( 22.0f ) , new DoubleObj( 22.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.NOT_EQUAL , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_notequal_obj_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)29 ) , new ShortObj( (short)29 ) , new IntegerObj( 29 ) , new LongObj( 29 ) , new FloatObj( 29.0f ) , new DoubleObj( 29.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.NOT_EQUAL , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_lt_obj_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 9 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)-18 ) , new ShortObj( (short)-18 ) , new IntegerObj( -18 ) , new LongObj( -18 ) , new FloatObj( -18.0f ) , new DoubleObj( -18.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.LT , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_lt_obj_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)29 ) , new ShortObj( (short)29 ) , new IntegerObj( 29 ) , new LongObj( 29 ) , new FloatObj( 29.0f ) , new DoubleObj( 29.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.LT , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_lt_obj_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)0 ) , new ShortObj( (short)0 ) , new IntegerObj( 0 ) , new LongObj( 0 ) , new FloatObj( 0.0f ) , new DoubleObj( 0.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.LT , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_le_obj_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 8 , 9 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)-18 ) , new ShortObj( (short)-18 ) , new IntegerObj( -18 ) , new LongObj( -18 ) , new FloatObj( -18.0f ) , new DoubleObj( -18.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.LE , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_le_obj_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)29 ) , new ShortObj( (short)29 ) , new IntegerObj( 29 ) , new LongObj( 29 ) , new FloatObj( 29.0f ) , new DoubleObj( 29.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.LE , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_le_obj_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)0 ) , new ShortObj( (short)0 ) , new IntegerObj( 0 ) , new LongObj( 0 ) , new FloatObj( 0.0f ) , new DoubleObj( 0.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.LE , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_gt_obj_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)-19 ) , new ShortObj( (short)-19 ) , new IntegerObj( -19 ) , new LongObj( -19 ) , new FloatObj( -19.0f ) , new DoubleObj( -19.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.GT , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_gt_obj_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)28 ) , new ShortObj( (short)28 ) , new IntegerObj( 28 ) , new LongObj( 28 ) , new FloatObj( 28.0f ) , new DoubleObj( 28.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.GT , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_gt_obj_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)0 ) , new ShortObj( (short)0 ) , new IntegerObj( 0 ) , new LongObj( 0 ) , new FloatObj( 0.0f ) , new DoubleObj( 0.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.GT , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_ge_obj_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)-19 ) , new ShortObj( (short)-19 ) , new IntegerObj( -19 ) , new LongObj( -19 ) , new FloatObj( -19.0f ) , new DoubleObj( -19.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.GE , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return ;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_ge_obj_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)28 ) , new ShortObj( (short)28 ) , new IntegerObj( 28 ) , new LongObj( 28 ) , new FloatObj( 28.0f ) , new DoubleObj( 28.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.GE , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_ge_obj_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData = new PrimitiveObject[]{ new ByteObj( (byte)0 ) , new ShortObj( (short)0 ) , new IntegerObj( 0 ) , new LongObj( 0 ) , new FloatObj( 0.0f ) , new DoubleObj( 0.0d ) };
    for( PrimitiveObject obj : compareData ){
      IFilter filter = new NumberFilter( NumberFilterType.GE , obj );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int i = 0 ; i < mustReadIndex.length ; i++ ){
        assertTrue( filterResult[mustReadIndex[i]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_1( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 20 , 21 , 22 , 23 , 24 , 25 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( compareData1[i] , true , compareData2[i] , true );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_2( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 21 , 22 , 23 , 24 , 25 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( compareData1[i] , false , compareData2[i] , true );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_3( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 20 , 21 , 22 , 23 , 24 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( compareData1[i] , true , compareData2[i] , false );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_4( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 21 , 22 , 23 , 24  };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( compareData1[i] , false , compareData2[i] , false );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_5( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( true , compareData1[i] , true , compareData2[i] , true );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_6( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( true , compareData1[i] , false , compareData2[i] , true );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_7( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( true , compareData1[i] , true , compareData2[i] , false );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

  @ParameterizedTest
  @MethodSource( "data1" )
  public void T_range_8( final IColumn column ) throws IOException{
    int[] mustReadIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 25 , 26 , 27 , 28 , 29 };
    PrimitiveObject[] compareData1 = new PrimitiveObject[]{ new ByteObj( (byte)20 ) , new ShortObj( (short)20 ) , new IntegerObj( 20 ) , new LongObj( 20 ) , new FloatObj( 20.0f ) , new DoubleObj( 20.0d ) };
    PrimitiveObject[] compareData2 = new PrimitiveObject[]{ new ByteObj( (byte)25 ) , new ShortObj( (short)25 ) , new IntegerObj( 25 ) , new LongObj( 25 ) , new FloatObj( 25.0f ) , new DoubleObj( 25.0d ) };
    for( int i = 0 ; i < compareData1.length ; i++ ){
      IFilter filter = new NumberRangeFilter( true , compareData1[i] , false , compareData2[i] , false );
      boolean[] filterResult = new boolean[30];
      filterResult = column.filter( filter , filterResult );
      if( filterResult == null ){
        assertTrue( true );
        return;
      }
      for( int ii = 0 ; ii < mustReadIndex.length ; ii++ ){
        assertTrue( filterResult[mustReadIndex[ii]] );
      }
    }
  }

}