/* * 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.mapping; import com.datastax.driver.core.CCMConfig; import com.datastax.driver.core.CCMTestsSupport; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Session; import com.datastax.driver.core.utils.CassandraVersion; import com.datastax.driver.mapping.annotations.*; import com.google.common.collect.ImmutableMap; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Map; @CassandraVersion("2.1.0") @CCMConfig(createCluster = false) @SuppressWarnings("unused") public class UDTFieldMapperTest extends CCMTestsSupport { @Test(groups = "short") public void udt_and_tables_with_ks_created_in_another_session_should_be_mapped() { Cluster cluster1 = register(Cluster.builder() .addContactPoints(getContactPoints().get(0)) .withPort(ccm().getBinaryPort()) .build()); Session session1 = cluster1.connect(); // Create type and table session1.execute("create schema if not exists java_509 " + "with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };"); session1.execute("create type java_509.my_tuple (" + "type text, " + "value text);"); session1.execute("create table java_509.my_hash (" + "key int primary key, " + "properties map<text, frozen<java_509.my_tuple>>);"); cluster1.close(); // Create entities with another connection Cluster cluster2 = register(Cluster.builder() .addContactPoints(getContactPoints().get(0)) .withPort(ccm().getBinaryPort()) .build()); Session session2 = cluster2.newSession(); Mapper<MyHashWithKeyspace> hashMapper = new MappingManager(session2).mapper(MyHashWithKeyspace.class); hashMapper.save(new MyHashWithKeyspace( 1, ImmutableMap.of("key-1", new MyTupleWithKeyspace("first-half-1", "second-half-1")))); hashMapper.save(new MyHashWithKeyspace( 2, ImmutableMap.of("key-2", new MyTupleWithKeyspace("first-half-2", null)))); hashMapper.save(new MyHashWithKeyspace( 3, ImmutableMap.of("key-3", new MyTupleWithKeyspace(null, "second-half-3")))); hashMapper.save(new MyHashWithKeyspace( 4, new HashMap<String, MyTupleWithKeyspace>())); hashMapper.save(new MyHashWithKeyspace( 5, null)); } @Test(groups = "short") public void udt_and_tables_without_ks_created_in_another_session_should_be_mapped() { Cluster cluster1 = register(Cluster.builder() .addContactPoints(getContactPoints().get(0)) .withPort(ccm().getBinaryPort()) .build()); Session session1 = cluster1.connect(); session1.execute("create schema if not exists java_509b " + "with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };"); session1.execute("use java_509b"); session1.execute("create type my_tuple (" + "type text, " + "value text);"); session1.execute("create table my_hash (" + "key int primary key, " + "properties map<text, frozen<my_tuple>>);"); cluster1.close(); // Create entities with another connection Cluster cluster2 = register(Cluster.builder() .addContactPoints(getContactPoints().get(0)) .withPort(ccm().getBinaryPort()) .build()); Session session2 = cluster2.newSession(); session2.execute("use java_509b"); Mapper<MyHash> hashMapper = new MappingManager(session2).mapper(MyHash.class); hashMapper.save(new MyHash( 1, ImmutableMap.of("key-1", new MyTuple("first-half-1", "second-half-1")))); hashMapper.save(new MyHash( 2, ImmutableMap.of("key-2", new MyTuple("first-half-2", null)))); hashMapper.save(new MyHash( 3, ImmutableMap.of("key-3", new MyTuple(null, "second-half-3")))); hashMapper.save(new MyHash( 4, new HashMap<String, MyTuple>())); hashMapper.save(new MyHash( 5, null)); } @UDT(name = "my_tuple") static class MyTuple { @Field(name = "type") private String type; @Field(name = "value") private String value; public MyTuple() { } public MyTuple(String type, String value) { this.type = type; this.value = value; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } @Table(name = "my_hash") static class MyHash { @PartitionKey @Column(name = "key") private int key; @FrozenValue @Column(name = "properties") private Map<String, MyTuple> properties; public MyHash() { } public MyHash(int key, Map<String, MyTuple> properties) { this.key = key; this.properties = properties; } public int getKey() { return key; } public void setKey(int key) { this.key = key; } public Map<String, MyTuple> getProperties() { return properties; } public void setProperties(Map<String, MyTuple> properties) { this.properties = properties; } } @UDT(name = "my_tuple", keyspace = "java_509") static class MyTupleWithKeyspace { @Field(name = "type") private String type; @Field(name = "value") private String value; public MyTupleWithKeyspace() { } public MyTupleWithKeyspace(String type, String value) { this.type = type; this.value = value; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } @Table(name = "my_hash", keyspace = "java_509") static class MyHashWithKeyspace { @PartitionKey @Column(name = "key") private int key; @FrozenValue @Column(name = "properties") private Map<String, MyTupleWithKeyspace> properties; public MyHashWithKeyspace() { } public MyHashWithKeyspace(int key, Map<String, MyTupleWithKeyspace> properties) { this.key = key; this.properties = properties; } public int getKey() { return key; } public void setKey(int key) { this.key = key; } public Map<String, MyTupleWithKeyspace> getProperties() { return properties; } public void setProperties(Map<String, MyTupleWithKeyspace> properties) { this.properties = properties; } } }