blob: ae2a062a14efc1b284c17bbdb258d46070777375 [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.integration.spark.testsuite.complexType
import java.sql.{Date, Timestamp}
import scala.collection.mutable
import org.apache.spark.sql.Row
import org.apache.spark.sql.test.util.QueryTest
import org.scalatest.BeforeAndAfterAll
import org.apache.carbondata.core.constants.CarbonCommonConstants
import org.apache.carbondata.core.util.CarbonProperties
class TestArrayContainsPushDown extends QueryTest with BeforeAndAfterAll {
override protected def afterAll(): Unit = {
CarbonProperties.getInstance()
.addProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT,
CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT)
sql("DROP TABLE IF EXISTS compactComplex")
}
test("test array contains pushdown for array of string") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<String>) stored as carbondata")
sql("insert into complex1 select array('as') union all " +
"select array('sd','df','gh') union all " +
"select array('rt','ew','rtyu','jk',null) union all " +
"select array('ghsf','dbv','','ty') union all " +
"select array('hjsd','fggb','nhj','sd','asd')")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,'sd')"),
true,
"PushedFilters: [*EqualTo(arr,sd)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,'sd')"),
true,
"PushedFilters: [*EqualTo(arr,sd)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,'sd')"),
Seq(Row(mutable.WrappedArray.make(Array("sd", "df", "gh"))),
Row(mutable.WrappedArray.make(Array("hjsd", "fggb", "nhj", "sd", "asd")))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,'sd')"), Seq(Row(2)))
// test for empty
checkAnswer(sql(" select * from complex1 where array_contains(arr,'')"),
Seq(Row(mutable.WrappedArray.make(Array("ghsf", "dbv","","ty")))))
sql("drop table complex1")
}
test("test array contains pushdown for array of boolean") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<boolean>) stored as carbondata")
sql("insert into complex1 select array(true) union all " +
"select array(false, null, false) union all " +
"select array(false, false, true, false) union all " +
"select array(true, true, true, false) union all " +
"select array(false)")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,true)"),
true,
"PushedFilters: [*EqualTo(arr,true)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,true)"),
true,
"PushedFilters: [*EqualTo(arr,true)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,true)"),
Seq(Row(mutable.WrappedArray.make(Array(true))),
Row(mutable.WrappedArray.make(Array(false, false, true, false))),
Row(mutable.WrappedArray.make(Array(true, true, true, false)))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,true)"), Seq(Row(3)))
sql("drop table complex1")
}
test("test array contains pushdown for array of short") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<short>) stored as carbondata")
sql("insert into complex1 select array(12) union all " +
"select array(20, 30, 31000) union all " +
"select array(11, 12, 13, 14, 15, 16, -31000) union all " +
"select array(20, 31000, 60, 80) union all " +
"select array(41, 41, -41, -42)")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,31000)"),
true,
"PushedFilters: [*EqualTo(arr,31000)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,31000)"),
true,
"PushedFilters: [*EqualTo(arr,31000)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,31000)"),
Seq(Row(mutable.WrappedArray.make(Array(20, 30, 31000))),
Row(mutable.WrappedArray.make(Array(20, 31000, 60, 80)))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,31000)"), Seq(Row(2)))
sql("drop table complex1")
}
test("test array contains pushdown for array of int") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<int>) stored as carbondata")
sql("insert into complex1 select array(12) union all " +
"select array(20, 30, 33000) union all " +
"select array(11, 12, 13, 14, 15, 16, -33000) union all " +
"select array(20, 33000, 60, 80) union all " +
"select array(41, 41, -41, -42)")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,33000)"),
true,
"PushedFilters: [*EqualTo(arr,33000)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,33000)"),
true,
"PushedFilters: [*EqualTo(arr,33000)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,33000)"),
Seq(Row(mutable.WrappedArray.make(Array(20, 30, 33000))),
Row(mutable.WrappedArray.make(Array(20, 33000, 60, 80)))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,33000)"), Seq(Row(2)))
sql("drop table complex1")
}
test("test array contains pushdown for array of long") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<long>) stored as carbondata")
sql("insert into complex1 select array(12) union all " +
"select array(20, 30, 33000) union all " +
"select array(11, 12, 13, 14, 15, 16, -33000) union all " +
"select array(20, 33000, 60, 80) union all " +
"select array(41, 41, -41, -42)")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,33000)"),
true,
"PushedFilters: [*EqualTo(arr,33000)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,33000)"),
true,
"PushedFilters: [*EqualTo(arr,33000)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,33000)"),
Seq(Row(mutable.WrappedArray.make(Array(20, 30, 33000))),
Row(mutable.WrappedArray.make(Array(20, 33000, 60, 80)))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,33000)"), Seq(Row(2)))
sql("drop table complex1")
}
test("test array contains pushdown for array of double") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<double>) stored as carbondata")
sql("insert into complex1 select array(2.2) union all " +
"select array(3.3, 4.4) union all " +
"select array(3.3, 4.4, 2.2) union all " +
"select array(-2.2, 3.3, 4.4)")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,cast(2.2 as double))"),
true,
"PushedFilters: [*EqualTo(arr,2.2)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,cast(2.2 as double))"),
true,
"PushedFilters: [*EqualTo(arr,2.2)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,cast(2.2 as double))"),
Seq(Row(mutable.WrappedArray.make(Array(2.2))),
Row(mutable.WrappedArray.make(Array(3.3, 4.4, 2.2)))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,cast(2.2 as double))"), Seq(Row(2)))
sql("drop table complex1")
}
test("test array contains pushdown for array of decimal") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<decimal(5,2)>) stored as carbondata")
sql("insert into complex1 select array(2.2) union all " +
"select array(3.3, 4.4) union all " +
"select array(3.3, 4.4, 2.2) union all " +
"select array(-2.2, 3.3, 4.4)")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,cast(2.2 as decimal(5,2)))"),
true,
"PushedFilters: [*EqualTo(arr,2.20)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,cast(2.2 as decimal(5,2)))"),
true,
"PushedFilters: [*EqualTo(arr,2.20)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,cast(2.2 as decimal(5,2)))"),
Seq(Row(mutable.WrappedArray.make(Array(java.math.BigDecimal.valueOf(2.20).setScale(2)))),
Row(mutable.WrappedArray.make(Array(
java.math.BigDecimal.valueOf(3.30).setScale(2),
java.math.BigDecimal.valueOf(4.40).setScale(2),
java.math.BigDecimal.valueOf(2.20).setScale(2))))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,cast(2.2 as decimal(5,2)))"), Seq(Row(2)))
sql("drop table complex1")
}
test("test array contains pushdown for array of timestamp") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<timestamp>) stored as carbondata")
sql("insert into complex1 select array('2017-01-01 00:00:00','2018-01-01 00:00:00') union all " +
"select array('2019-01-01 00:00:00') union all " +
"select array('2018-01-01 00:00:00') ")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,cast('2018-01-01 00:00:00' as timestamp))"),
true,
"PushedFilters: [*EqualTo(arr,1514793600000000)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,cast('2018-01-01 00:00:00' as timestamp))"),
true,
"PushedFilters: [*EqualTo(arr,1514793600000000)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,cast('2018-01-01 00:00:00' as timestamp))"),
Seq(Row(mutable.WrappedArray.make(Array(Timestamp.valueOf("2017-01-01 00:00:00.0"),Timestamp.valueOf("2018-01-01 00:00:00.0")))),
Row(mutable.WrappedArray.make(Array(Timestamp.valueOf("2018-01-01 00:00:00.0"))))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,cast('2018-01-01 00:00:00' as timestamp))"), Seq(Row(2)))
sql("drop table complex1")
}
test("test array contains pushdown for array of date") {
sql("drop table if exists complex1")
sql("create table complex1 (arr array<date>) stored as carbondata")
sql("insert into complex1 select array('2017-01-01','2018-01-01') union all " +
"select array('2019-01-01') union all " +
"select array('2018-01-01') ")
checkExistence(sql(" explain select * from complex1 where array_contains(arr,cast('2018-01-01' as date))"),
true,
"PushedFilters: [*EqualTo(arr,17532)]")
checkExistence(sql(" explain select count(*) from complex1 where array_contains(arr,cast('2018-01-01' as date))"),
true,
"PushedFilters: [*EqualTo(arr,17532)]")
checkAnswer(sql(" select * from complex1 where array_contains(arr,cast('2018-01-01' as date))"),
Seq(Row(mutable.WrappedArray.make(Array(Date.valueOf("2017-01-01"),Date.valueOf("2018-01-01")))),
Row(mutable.WrappedArray.make(Array(Date.valueOf("2018-01-01"))))))
checkAnswer(sql(" select count(*) from complex1 where array_contains(arr,cast('2018-01-01' as date))"), Seq(Row(2)))
sql("drop table complex1")
}
}