/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* Licensed 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.datastax.driver.core.querybuilder;
import com.datastax.driver.core.*;
import com.datastax.driver.core.utils.CassandraVersion;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import org.testng.annotations.Test;
import java.net.InetAddress;
import java.util.List;
import java.util.Map;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static com.datastax.driver.core.schemabuilder.SchemaBuilder.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.Assert.assertEquals;
@CassandraVersion("2.1.3")
public class QueryBuilderUDTExecutionTest extends CCMTestsSupport {
@Override
public void onTestContextInitialized() {
execute("CREATE TYPE udt (i int, a inet)",
"CREATE TABLE udtTest(k int PRIMARY KEY, t frozen<udt>, l list<frozen<udt>>, m map<int, frozen<udt>>)");
}
@Test(groups = "short")
public void insertUdtTest() throws Exception {
UserType udtType = cluster().getMetadata().getKeyspace(keyspace).getUserType("udt");
UDTValue udtValue = udtType.newValue().setInt("i", 2).setInet("a", InetAddress.getByName("localhost"));
Statement insert = insertInto("udtTest").value("k", 1).value("t", udtValue);
assertEquals(insert.toString(), "INSERT INTO udtTest (k,t) VALUES (1,{i:2,a:'127.0.0.1'});");
session().execute(insert);
List<Row> rows = session().execute(select().from("udtTest").where(eq("k", 1))).all();
assertEquals(rows.size(), 1);
Row r1 = rows.get(0);
assertEquals("127.0.0.1", r1.getUDTValue("t").getInet("a").getHostAddress());
}
@Test(groups = "short")
public void should_handle_collections_of_UDT() throws Exception {
UserType udtType = cluster().getMetadata().getKeyspace(keyspace).getUserType("udt");
UDTValue udtValue = udtType.newValue().setInt("i", 2).setInet("a", InetAddress.getByName("localhost"));
UDTValue udtValue2 = udtType.newValue().setInt("i", 3).setInet("a", InetAddress.getByName("localhost"));
Statement insert = insertInto("udtTest").value("k", 1).value("l", ImmutableList.of(udtValue));
assertThat(insert.toString()).isEqualTo("INSERT INTO udtTest (k,l) VALUES (1,[{i:2,a:'127.0.0.1'}]);");
session().execute(insert);
List<Row> rows = session().execute(select().from("udtTest").where(eq("k", 1))).all();
assertThat(rows.size()).isEqualTo(1);
Row r1 = rows.get(0);
assertThat(r1.getList("l", UDTValue.class).get(0).getInet("a").getHostAddress()).isEqualTo("127.0.0.1");
Map<Integer, UDTValue> map = Maps.newHashMap();
map.put(0, udtValue);
map.put(2, udtValue2);
Statement updateMap = update("udtTest").with(putAll("m", map)).where(eq("k", 1));
assertThat(updateMap.toString())
.isEqualTo("UPDATE udtTest SET m=m+{0:{i:2,a:'127.0.0.1'},2:{i:3,a:'127.0.0.1'}} WHERE k=1;");
session().execute(updateMap);
rows = session().execute(select().from("udtTest").where(eq("k", 1))).all();
r1 = rows.get(0);
assertThat(r1.getMap("m", Integer.class, UDTValue.class)).isEqualTo(map);
}
/**
* Ensures that UDT fields can be set and retrieved on their own using {@link QueryBuilder#set} and
* {@link QueryBuilder#select} respectively.
*
* @test_category queries:builder
* @jira_ticket JAVA-1286
* @jira_ticket CASSANDRA-7423
*/
@CassandraVersion(value = "3.6", description = "Requires CASSANDRA-7423 introduced in Cassandra 3.6")
@Test(groups = "short")
public void should_support_setting_and_retrieving_udt_fields() {
//given
String table = "unfrozen_udt_table";
String udt = "person";
session().execute(createType(udt).addColumn("first", DataType.text()).addColumn("last", DataType.text()));
UserType userType = cluster().getMetadata().getKeyspace(keyspace).getUserType(udt);
assertThat(userType).isNotNull();
session().execute(createTable(table).addPartitionKey("k", DataType.text())
.addUDTColumn("u", udtLiteral(udt))
);
UDTValue value = userType.newValue();
value.setString("first", "Bob");
value.setString("last", "Smith");
session().execute(insertInto(table).value("k", "key").value("u", value));
//when - updating udt field
session().execute(update(table).with(
set(path("u", "first"), "Rick"))
.and(set(raw("u.last"), "Jones"))
.where(eq("k", "key")));
//then - field should be updated and retrievable by field name.
Row r = session().execute(select()
.path("u", "first")
.raw("u.last")
.from(table)
.where(eq("k", "key"))).one();
assertThat(r.getString("u.first")).isEqualTo("Rick");
assertThat(r.getString("u.last")).isEqualTo("Jones");
}
}