blob: dd2b899644458fb288d9c5c5b21ba7a2fd2165dc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.carbondata.spark.testsuite.filterexpr
import org.apache.spark.sql.Row
import org.apache.spark.sql.test.util.QueryTest
import org.scalatest.BeforeAndAfterAll
class TestInFilter extends QueryTest with BeforeAndAfterAll{
override def beforeAll: Unit = {
sql("drop table if exists test_table")
sql("create table test_table(intField INT, floatField FLOAT, doubleField DOUBLE, " +
"decimalField DECIMAL(18,2)) stored by 'carbondata'")
// turn on row level filter in carbon
// because only row level is on, 'in' will be pushdowned into CarbonScanRDD
// or in filter will be handled by spark.
sql("set carbon.push.rowfilters.for.vector=true")
sql("insert into test_table values(8,8,8,8),(5,5.0,5.0,5.0),(4,1.00,2.00,3.00)," +
"(6,6.0000,6.0000,6.0000),(4743,4743.00,4743.0000,4743.0),(null,null,null,null)")
}
test("sql with in different measurement type") {
// the precision of filter value is less one digit than column value
// float type test
checkAnswer(
sql("select * from test_table where floatField in(1.0)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where floatField in(4743.0)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where floatField in(5)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where floatField in(6.000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// double type test
checkAnswer(
sql("select * from test_table where doubleField in(2.0)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where doubleField in(4743.000)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where doubleField in(5)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where doubleField in(6.000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// decimalField type test
checkAnswer(
sql("select * from test_table where decimalField in(3.0)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where decimalField in(4743)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where decimalField in(5)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where decimalField in(6.000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// the precision of filter value is more one digit than column value
// int type test
checkAnswer(
sql("select * from test_table where intField in(4.0)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where intField in(4743.0)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where intField in(5.0)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where intField in(6.0)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// float type test
checkAnswer(
sql("select * from test_table where floatField in(1.000)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where floatField in(4743.000)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where floatField in(5.00)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where floatField in(6.00000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// double type test
checkAnswer(
sql("select * from test_table where doubleField in(2.000)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where doubleField in(4743.00000)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where doubleField in(5.00)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where doubleField in(6.00000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// decimalField type test
checkAnswer(
sql("select * from test_table where decimalField in(3.000)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
checkAnswer(
sql("select * from test_table where decimalField in(4743.00)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where decimalField in(5.00)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where decimalField in(6.00000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
// case: filter value is null
checkAnswer(
sql("select * from test_table where decimalField is null"),
Seq(Row(null, null, null, null)))
// filter value and column 's precision are the same
checkAnswer(
sql("select * from test_table where doubleField in(5.0) " +
"and floatField in(5.0) and decimalField in(5.0) and intField in(5)"),
Seq(Row(5, 5.0, 5.0, 5.0)))
checkAnswer(
sql("select * from test_table where doubleField in(6.0000) " +
"and floatField in(6.0000) and decimalField in(6.0000) and intField in(6.0000)"),
Seq(Row(6, 6.0000, 6.0000, 6.0000)))
checkAnswer(
sql("select * from test_table where doubleField in(8) " +
"and floatField in(8) and decimalField in(8) and intField in(8)"),
Seq(Row(8, 8, 8, 8)))
checkAnswer(
sql("select * from test_table where doubleField in(4743.0000) " +
"and floatField in(4743.00) and decimalField in(4743.0) and intField in(4743)"),
Seq(Row(4743, 4743.00, 4743.0000, 4743.0)))
checkAnswer(
sql("select * from test_table where doubleField in(2.00) " +
"and floatField in(1.00) and decimalField in(3.00) and intField in(4)"),
Seq(Row(4, 1.00, 2.00, 3.00)))
}
override def afterAll(): Unit = {
sql("drop table if exists test_table")
sql("set carbon.push.rowfilters.for.vector=false")
}
}