/*
* 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.CCMTestsSupport;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.utils.CassandraVersion;
import com.datastax.driver.mapping.annotations.*;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.datastax.driver.core.Assertions.assertThat;
@CassandraVersion("2.1.3")
@SuppressWarnings("unused")
public class MapperNestedCollectionsTest extends CCMTestsSupport {
@Override
public void onTestContextInitialized() {
execute(
"CREATE TYPE testType(i int, ls list<frozen<set<int>>>)",
"CREATE TABLE testTable (k int primary key, "
+ "m1 map<text, frozen<map<int, int>>>, " // nested collection
+ "m2 map<text, frozen<map<int, frozen<testType>>>>)" // nested collection with UDT
);
}
@Test(groups = "short")
public void should_map_fields_to_nested_collections() {
Mapper<TestTable> mapper = new MappingManager(session()).mapper(TestTable.class);
TestTable testTable = new TestTable();
testTable.setK(1);
testTable.setM1(ImmutableMap.<String, Map<Integer, Integer>>of("bar", ImmutableMap.of(1, 2)));
Set<Integer> s1 = Sets.newHashSet(1, 2, 3);
Set<Integer> s2 = Sets.newHashSet(4, 5, 6);
List<Set<Integer>> ls = new ArrayList<Set<Integer>>();
ls.add(s1);
ls.add(s2);
testTable.setM2(ImmutableMap.<String, Map<Integer, TestType>>of("bar", ImmutableMap.of(1, new TestType(2, ls))));
mapper.save(testTable);
TestTable testTable2 = mapper.get(1);
assertThat(testTable2.getM1()).isEqualTo(testTable.getM1());
assertThat(testTable2.getM2()).isEqualTo(testTable.getM2());
}
@Test(groups = "short")
public void should_map_accessor_params_to_nested_collections() {
MappingManager manager = new MappingManager(session());
Mapper<TestTable> mapper = manager.mapper(TestTable.class);
TestAccessor accessor = manager.createAccessor(TestAccessor.class);
TestTable testTable = new TestTable();
testTable.setK(1);
mapper.save(testTable);
Map<String, Map<Integer, Integer>> m1 = ImmutableMap.<String, Map<Integer, Integer>>of("bar", ImmutableMap.of(1, 2));
Map<String, Map<Integer, TestType>> m2 = ImmutableMap.<String, Map<Integer, TestType>>of("bar", ImmutableMap.of(1, new TestType(2)));
accessor.setM1(1, m1);
accessor.setM2(1, m2);
TestTable testTable2 = mapper.get(1);
assertThat(testTable2.getM1()).isEqualTo(m1);
assertThat(testTable2.getM2()).isEqualTo(m2);
}
@UDT(name = "testType")
public static class TestType {
private int i;
@Frozen("list<frozen<set<int>>>")
private List<Set<Integer>> ls;
public TestType() {
ls = Lists.newArrayList();
}
public TestType(int i) {
this();
this.i = i;
}
public TestType(int i, List<Set<Integer>> ls) {
this(i);
this.ls = ls;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public List<Set<Integer>> getLs() {
return ls;
}
public void setLs(List<Set<Integer>> ls) {
this.ls = ls;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof TestType))
return false;
TestType testType = (TestType) o;
return i == testType.i && ls.equals(testType.ls);
}
@Override
public int hashCode() {
int result = i;
result = 31 * result + ls.hashCode();
return result;
}
}
@Table(name = "testTable")
public static class TestTable {
@PartitionKey
private int k;
@Frozen("map<text, frozen<map<int, int>>>")
private Map<String, Map<Integer, Integer>> m1;
@Frozen("map<text, frozen<map<int, frozen<testType>>>>")
private Map<String, Map<Integer, TestType>> m2;
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public Map<String, Map<Integer, Integer>> getM1() {
return m1;
}
public void setM1(Map<String, Map<Integer, Integer>> m1) {
this.m1 = m1;
}
public Map<String, Map<Integer, TestType>> getM2() {
return m2;
}
public void setM2(Map<String, Map<Integer, TestType>> m2) {
this.m2 = m2;
}
}
@Accessor
public interface TestAccessor {
@Query("UPDATE testTable SET m1 = :m1 WHERE k = :k")
ResultSet setM1(@Param("k") int k, @Param("m1") Map<String, Map<Integer, Integer>> m1);
@Query("UPDATE testTable SET m2 = :m2 WHERE k = :k")
ResultSet setM2(@Param("k") int k, @Param("m2") Map<String, Map<Integer, TestType>> m2);
}
}