blob: 411ffdbb65bee0531df561c0d87c076e4c620860 [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.calcite.test;
import com.datastax.oss.driver.api.core.CqlSession;
import com.google.common.collect.ImmutableMap;
import org.cassandraunit.CQLDataLoader;
import org.cassandraunit.dataset.cql.ClassPathCQLDataSet;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
/**
* Tests for the {@code org.apache.calcite.adapter.cassandra} package.
*
* <p>Will start embedded cassandra cluster and populate it from local {@code twissandra.cql} file.
* All configuration files are located in test classpath.
*
* <p>Note that tests will be skipped if running on JDK11+
* (which is not yet supported by cassandra) see
* <a href="https://issues.apache.org/jira/browse/CASSANDRA-9608">CASSANDRA-9608</a>.
*
*/
@Execution(ExecutionMode.SAME_THREAD)
@ExtendWith(CassandraExtension.class)
class CassandraAdapterTest {
/** Connection factory based on the "mongo-zips" model. */
private static final ImmutableMap<String, String> TWISSANDRA =
CassandraExtension.getDataset("/model.json");
@BeforeAll
static void load(CqlSession session) {
new CQLDataLoader(session)
.load(new ClassPathCQLDataSet("twissandra.cql"));
}
@Test void testSelect() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select * from \"users\"")
.returnsCount(10);
}
@Test void testFilter() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select * from \"userline\" where \"username\"='!PUBLIC!'")
.limit(1)
.returns("username=!PUBLIC!; time=e8754000-80b8-1fe9-8e73-e3698c967ddd; "
+ "tweet_id=f3c329de-d05b-11e5-b58b-90e2ba530b12\n")
.explainContains("PLAN=CassandraToEnumerableConverter\n"
+ " CassandraFilter(condition=[=($0, '!PUBLIC!')])\n"
+ " CassandraTableScan(table=[[twissandra, userline]]");
}
@Test void testFilterUUID() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select * from \"tweets\" where \"tweet_id\"='f3cd759c-d05b-11e5-b58b-90e2ba530b12'")
.limit(1)
.returns("tweet_id=f3cd759c-d05b-11e5-b58b-90e2ba530b12; "
+ "body=Lacus augue pede posuere.; username=JmuhsAaMdw\n")
.explainContains("PLAN=CassandraToEnumerableConverter\n"
+ " CassandraFilter(condition=[=(CAST($0):CHAR(36), 'f3cd759c-d05b-11e5-b58b-90e2ba530b12')])\n"
+ " CassandraTableScan(table=[[twissandra, tweets]]");
}
@Test void testSort() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select * from \"userline\" where \"username\" = '!PUBLIC!' order by \"time\" desc")
.returnsCount(146)
.explainContains("PLAN=CassandraToEnumerableConverter\n"
+ " CassandraSort(sort0=[$1], dir0=[DESC])\n"
+ " CassandraFilter(condition=[=($0, '!PUBLIC!')])\n");
}
@Test void testProject() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select \"tweet_id\" from \"userline\" where \"username\" = '!PUBLIC!' limit 2")
.returns("tweet_id=f3c329de-d05b-11e5-b58b-90e2ba530b12\n"
+ "tweet_id=f3dbb03a-d05b-11e5-b58b-90e2ba530b12\n")
.explainContains("PLAN=CassandraToEnumerableConverter\n"
+ " CassandraLimit(fetch=[2])\n"
+ " CassandraProject(tweet_id=[$2])\n"
+ " CassandraFilter(condition=[=($0, '!PUBLIC!')])\n");
}
@Test void testProjectAlias() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select \"tweet_id\" as \"foo\" from \"userline\" "
+ "where \"username\" = '!PUBLIC!' limit 1")
.returns("foo=f3c329de-d05b-11e5-b58b-90e2ba530b12\n");
}
@Test void testProjectConstant() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select 'foo' as \"bar\" from \"userline\" limit 1")
.returns("bar=foo\n");
}
@Test void testLimit() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select \"tweet_id\" from \"userline\" where \"username\" = '!PUBLIC!' limit 8")
.explainContains("CassandraLimit(fetch=[8])\n");
}
@Test void testSortLimit() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select * from \"userline\" where \"username\"='!PUBLIC!' "
+ "order by \"time\" desc limit 10")
.explainContains(" CassandraLimit(fetch=[10])\n"
+ " CassandraSort(sort0=[$1], dir0=[DESC])");
}
@Test void testSortOffset() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select \"tweet_id\" from \"userline\" where "
+ "\"username\"='!PUBLIC!' limit 2 offset 1")
.explainContains("CassandraLimit(offset=[1], fetch=[2])")
.returns("tweet_id=f3dbb03a-d05b-11e5-b58b-90e2ba530b12\n"
+ "tweet_id=f3e4182e-d05b-11e5-b58b-90e2ba530b12\n");
}
@Test void testMaterializedView() {
CalciteAssert.that()
.with(TWISSANDRA)
.query("select \"tweet_id\" from \"tweets\" where "
+ "\"username\"='JmuhsAaMdw' and \"tweet_id\"='f3d3d4dc-d05b-11e5-b58b-90e2ba530b12'")
.enableMaterializations(true)
.explainContains("CassandraTableScan(table=[[twissandra, Tweets_By_User]])");
}
}