/*
* Licensed to STRATIO (C) under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership. The STRATIO (C) 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 com.stratio.cassandra.lucene.testsAT.udt;
import com.datastax.driver.core.SimpleStatement;
import com.datastax.driver.core.exceptions.DriverException;
import com.stratio.cassandra.lucene.testsAT.BaseAT;
import com.stratio.cassandra.lucene.testsAT.util.CassandraUtils;
import com.stratio.cassandra.lucene.testsAT.util.CassandraUtilsSelect;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static com.stratio.cassandra.lucene.builder.Builder.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* @author Eduardo Alonso {@literal <eduardoalonso@stratio.com>}
*/
@RunWith(JUnit4.class)
public class UDTIndexingAT extends BaseAT {
private static CassandraUtils cassandraUtils;
@BeforeClass
public static void before() {
cassandraUtils = CassandraUtils.builder("udt_indexing")
.withUDT("geo_point", "latitude", "float")
.withUDT("geo_point", "longitude", "float")
.withUDT("address", "street", "text")
.withUDT("address", "city", "text")
.withUDT("address", "zip", "int")
.withUDT("address", "bool", "boolean")
.withUDT("address", "height", "float")
.withUDT("address", "point", "frozen<geo_point>")
.withUDT("address", "zips", "list<int>")
.withUDT("address", "zips_map", "map<int,text>")
.withUDT("address", "zips_set", "set<int>")
.withColumn("login", "text")
.withColumn("first_name", "text")
.withColumn("last_name", "text")
.withColumn("address", "frozen<address>")
.withPartitionKey("login")
.withMapper("address.zips", integerMapper())
.withMapper("address.zips_map", stringMapper())
.withMapper("address.zips_set", integerMapper())
.withMapper("address.bool", booleanMapper())
.withMapper("address.city", stringMapper())
.withMapper("address.point.latitude", floatMapper())
.withMapper("address.point.longitude", floatMapper())
.build()
.createKeyspace()
.createUDTs()
.createTable()
.createIndex();
Map<String, String> data = new HashMap<>();
data.put("login", "'USER1'");
data.put("first_name", "'Tom'");
data.put("last_name", "'Smith'");
data.put("address", "{" +
" street: '1021 West 4th St. #202'," +
" city: 'San Francisco'," +
" zip: 94110 ," +
" bool: true," +
" height:5.4 ," +
" zips:[ 2,4,6 ]," +
" zips_map : {" +
" 1 : '1A'," +
" 2 : '2A'," +
" 3 : '3A'" +
" }," +
" zips_set : {5,7,9}," +
" point : {" +
" latitude : 1.0," +
" longitude : -1.0" +
" }" +
"}");
Map<String, String> data2 = new HashMap<>();
data2.put("login", "'USER2'");
data2.put("first_name", "'Tom'");
data2.put("last_name", "'Smith'");
data2.put("address", "{ " +
" street: '1021 West 4th St. #202'," +
" city: 'San Francisco'," +
" zip: 94110 ," +
" bool: false," +
" height:5.4 ," +
" zips:[ 4,6,8 ]," +
" zips_map : { " +
" 1 : '1B'," +
" 2 : '2B'," +
" 3 : '3B'" +
" }," +
" zips_set : {7,9,11}," +
" point : {" +
" latitude : 2.0," +
" longitude : -2.0" +
" } " +
"}");
Map<String, String> data3 = new HashMap<>();
data3.put("login", "'USER3'");
data3.put("first_name", "'Tom'");
data3.put("last_name", "'Smith'");
data3.put("address", "{ " +
" street: '1021 West 4th St. #202'," +
" city: 'San Francisco'," +
" zip: 94110 ," +
" bool: true," +
" height:5.4 ," +
" zips:[ 6,8,10 ]," +
" zips_map : {" +
" 1 : '1A'," +
" 2 : '2A'," +
" 3 : '3A'" +
" }," +
" zips_set : {9,11,13}," +
" point : {" +
" latitude : 3.0," +
" longitude : -3.0" +
" } " +
"}");
Map<String, String> data4 = new HashMap<>();
data4.put("login", "'USER4'");
data4.put("first_name", "'Tom'");
data4.put("last_name", "'Smith'");
data4.put("address", "{ " +
" street: '1021 West 4th St. #202'," +
" city: 'Paris'," +
" zip: 94110 ," +
" bool: false," +
" height:5.4 ," +
" zips:[ 8,10,12 ]," +
" zips_map : {" +
" 1 : '1B'," +
" 2 : '2B'," +
" 3 : '3B'" +
" }," +
" zips_set : {11,13,15}," +
" point : {" +
" latitude : 4.0," +
" longitude : -4.0" +
" } " +
"}");
Map<String, String> data5 = new HashMap<>();
data5.put("login", "'USER5'");
data5.put("first_name", "'Tom'");
data5.put("last_name", "'Smith'");
data5.put("address", "{ " +
" street: '1021 West 4th St. #202'," +
" city: 'Paris'," +
" zip: 94110 ," +
" bool: true," +
" height:5.4 ," +
" zips:[ 10,12,14]," +
" zips_map : {" +
" 1 : '1A'," +
" 2 : '2A'," +
" 3 : '3A'" +
" }," +
" zips_set : {13,15,17}," +
" point : {" +
" latitude : 5.0," +
" longitude : -5.0" +
" } " +
"}");
Map<String, String> data6 = new HashMap<>();
data6.put("login", "'USER6'");
data6.put("first_name", "'Tom'");
data6.put("last_name", "'Smith'");
data6.put("address", "{ " +
" street: '1021 West 4th St. #202'," +
" city: 'Paris'," +
" zip: 94110 ," +
" bool: false," +
" height:5.4 ," +
" zips:[ 12,14,16 ]," +
" zips_map : {" +
" 1 : '1B'," +
" 2 : '2B'," +
" 3 : '3B'" +
" }," +
" zips_set : {15,17,19}," +
" point : {" +
" latitude : 6.0," +
" longitude : -6.0" +
" } " +
"}");
Map<String, String> data7 = new HashMap<>();
data7.put("login", "'USER7'");
data7.put("first_name", "'Tom'");
data7.put("last_name", "'Smith'");
data7.put("address", "{ " +
" street: '1021 West 4th St. #202'," +
" city: 'Paris'," +
" zip: 94110 ," +
" bool: true," +
" height:5.4 ," +
" zips:[ 14,16,18 ]," +
" zips_map : {" +
" 1 : '1A'," +
" 2 : '2A'," +
" 3 : '3A'" +
" }," +
" zips_set : {17,19,21}," +
" point : {" +
" latitude : 7.0," +
" longitude : -7.0" +
" } " +
"}");
cassandraUtils.insert(data, data2, data3, data4, data5, data6, data7);
cassandraUtils.refresh();
}
@AfterClass
public static void after() {
cassandraUtils.dropTable().dropKeyspace();
}
private boolean isThisAndOnlyThis(String[] received, String[] expected) {
if (received.length != expected.length) {
return false;
} else {
for (String i : received) {
boolean found = false;
for (String j : expected) {
if (i.equals(j)) {
found = true;
}
}
if (!found) {
return false;
}
}
return true;
}
}
private void assertEqualsAndOnlyThisString(String[] received, String[] expected) {
assertEquals("Expected " + expected.length + " results but received: " + received.length,
expected.length,
received.length);
assertTrue("Unexpected results!! Expected: " +
Arrays.toString(expected) +
", but got: " +
Arrays.toString(received), isThisAndOnlyThis(received, expected));
}
@Test
public void testUDTInternal() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.city", "Paris"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER4", "USER5", "USER6", "USER7"});
select = cassandraUtils.filter(match("address.city", "San Francisco"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER2", "USER3"});
select = cassandraUtils.filter(match("address.bool", true));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER3", "USER5", "USER7"});
select = cassandraUtils.filter(match("address.bool", false));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER4", "USER6"});
}
@Test(expected = DriverException.class)
public void testUDTInternalThatFails() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.point", "Paris"));
select.count();
assertTrue("Selecting a type that is no matched must return an Exception", true);
}
@Test
public void testUDTList() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.zips", 10));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER3", "USER4", "USER5"});
select = cassandraUtils.filter(match("address.zips", 12));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER4", "USER5", "USER6"});
select = cassandraUtils.filter(match("address.zips", 14));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER5", "USER6", "USER7"});
select = cassandraUtils.filter(match("address.zips", 15));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{});
select = cassandraUtils.filter(match("address.zips", 16));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER6", "USER7"});
select = cassandraUtils.filter(match("address.zips", 18));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER7"});
}
@Test
public void testUDTMap() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.zips_map$1", "1A")).refresh(true);
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER3", "USER5", "USER7"});
select = cassandraUtils.filter(match("address.zips_map$1", "1B"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER4", "USER6"});
select = cassandraUtils.filter(match("address.zips_map$2", "2A"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER3", "USER5", "USER7"});
select = cassandraUtils.filter(match("address.zips_map$2", "2B"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER4", "USER6"});
select = cassandraUtils.filter(match("address.zips_map$3", "3A"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER3", "USER5", "USER7"});
select = cassandraUtils.filter(match("address.zips_map$3", "3B"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER4", "USER6"});
}
@Test
public void testUDTMapThatFails() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.zips_map", 1));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{});
}
@Test
public void testUDTSet() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.zips_set", 5));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1"});
select = cassandraUtils.filter(match("address.zips_set", 7));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER2"});
select = cassandraUtils.filter(match("address.zips_set", 9));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER2", "USER3"});
select = cassandraUtils.filter(match("address.zips_set", 11));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER3", "USER4"});
select = cassandraUtils.filter(match("address.zips_set", 12));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{});
select = cassandraUtils.filter(match("address.zips_set", 13));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER3", "USER4", "USER5"});
select = cassandraUtils.filter(match("address.zips_set", 14));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{});
select = cassandraUtils.filter(match("address.zips_set", 15));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER4", "USER5", "USER6"});
select = cassandraUtils.filter(match("address.zips_set", 17));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER5", "USER6", "USER7"});
select = cassandraUtils.filter(match("address.zips_set", 19));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER6", "USER7"});
select = cassandraUtils.filter(match("address.zips_set", 20));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{});
select = cassandraUtils.filter(match("address.zips_set", 21));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER7"});
}
@Test
public void testUDTOverUDT() {
CassandraUtilsSelect select = cassandraUtils.filter(match("address.point.latitude", 1.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1"});
select = cassandraUtils.filter(match("address.point.latitude", 2.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2"});
select = cassandraUtils.filter(match("address.point.latitude", 3.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER3"});
select = cassandraUtils.filter(match("address.point.latitude", 4.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER4"});
select = cassandraUtils.filter(match("address.point.latitude", 5.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER5"});
select = cassandraUtils.filter(match("address.point.latitude", 6.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER6"});
select = cassandraUtils.filter(match("address.point.latitude", 7.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER7"});
select = cassandraUtils.filter(match("address.point.longitude", -1.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1"});
select = cassandraUtils.filter(match("address.point.longitude", -2.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2"});
select = cassandraUtils.filter(match("address.point.longitude", -3.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER3"});
select = cassandraUtils.filter(match("address.point.longitude", -4.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER4"});
select = cassandraUtils.filter(match("address.point.longitude", -5.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER5"});
select = cassandraUtils.filter(match("address.point.longitude", -6.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER6"});
select = cassandraUtils.filter(match("address.point.longitude", -7.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER7"});
select = cassandraUtils.filter(range("address.point.latitude").lower(1.0)
.upper(3.0)
.includeLower(true)
.includeUpper(true));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER2", "USER3"});
select = cassandraUtils.filter(range("address.point.latitude").lower(2.0)
.upper(5.0)
.includeLower(true)
.includeUpper(true));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER3", "USER4", "USER5"});
select = cassandraUtils.filter(range("address.point.latitude").lower(1.0)
.upper(7.0)
.includeLower(true)
.includeUpper(true));
assertEqualsAndOnlyThisString(select.stringColumn("login"),
new String[]{"USER1", "USER2", "USER3", "USER4", "USER5", "USER6", "USER7"});
select = cassandraUtils.filter(range("address.point.longitude").lower(-3.0).upper(-1.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2"});
select = cassandraUtils.filter(range("address.point.longitude").lower(-5.0).upper(-2.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER3", "USER4"});
select = cassandraUtils.filter(range("address.point.longitude").lower(-7.0).upper(-1.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"),
new String[]{"USER2", "USER3", "USER4", "USER5", "USER6"});
select = cassandraUtils.filter(range("address.point.latitude").lower(1.0)
.upper(3.0)
.includeLower(true)
.includeUpper(true));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER1", "USER2", "USER3"});
select = cassandraUtils.filter(range("address.point.latitude").lower(2.0)
.upper(5.0)
.includeLower(true)
.includeUpper(true));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2", "USER3", "USER4", "USER5"});
select = cassandraUtils.filter(range("address.point.latitude").lower(1.0)
.upper(7.0)
.includeLower(true)
.includeUpper(true));
assertEqualsAndOnlyThisString(select.stringColumn("login"),
new String[]{"USER1", "USER2", "USER3", "USER4", "USER5", "USER6", "USER7"});
select = cassandraUtils.filter(range("address.point.longitude").lower(-3.0).upper(-1.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER2"});
select = cassandraUtils.filter(range("address.point.longitude").lower(-5.0).upper(-2.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER3", "USER4"});
select = cassandraUtils.filter(range("address.point.longitude").lower(-7.0).upper(-1.0));
assertEqualsAndOnlyThisString(select.stringColumn("login"),
new String[]{"USER2", "USER3", "USER4", "USER5", "USER6"});
}
@Test(expected = DriverException.class)
public void testUDTOverUDTThatFails() {
cassandraUtils.filter(range("address.point.non-existent").lower(-1.0).upper(-3.0)).get();
assertTrue("Selecting a non-existent type inside udt inside udt must return an Exception", true);
}
@Test
public void testNonCompleteUDT() {
String insert = "INSERT INTO " +
cassandraUtils.getKeyspace() +
"." +
cassandraUtils.getTable() +
"(login, first_name, last_name, address) VALUES (" +
"'USER10'," +
"'Tom'," +
"'Smith',{" +
"city: 'Madrid'});";
cassandraUtils.execute(new SimpleStatement(insert));
cassandraUtils.refresh();
CassandraUtilsSelect select = cassandraUtils.filter(match("address.city", "Madrid"));
assertEqualsAndOnlyThisString(select.stringColumn("login"), new String[]{"USER10"});
}
}