Skip to content

Commit ce1b249

Browse files
author
Otavio Santana
committed
ADds UDT supports
1 parent 393f9b6 commit ce1b249

File tree

7 files changed

+191
-81
lines changed

7 files changed

+191
-81
lines changed

cassandra-driver/src/main/java/org/jnosql/diana/cassandra/column/CassandraColumnFamilyManager.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public class CassandraColumnFamilyManager implements ColumnFamilyManager {
6666
@Override
6767
public ColumnEntity save(ColumnEntity entity) {
6868
Objects.requireNonNull(entity, "entity is required");
69-
Insert insert = QueryUtils.insert(entity, keyspace);
69+
Insert insert = QueryUtils.insert(entity, keyspace, session);
7070
session.execute(insert);
7171
return entity;
7272
}
@@ -81,7 +81,7 @@ public ColumnEntity update(ColumnEntity entity) throws NullPointerException {
8181
public ColumnEntity save(ColumnEntity entity, Duration ttl) throws NullPointerException {
8282
Objects.requireNonNull(entity, "entity is required");
8383
Objects.requireNonNull(ttl, "ttl is required");
84-
Insert insert = QueryUtils.insert(entity, keyspace);
84+
Insert insert = QueryUtils.insert(entity, keyspace, session);
8585
insert.using(QueryBuilder.ttl((int) ttl.getSeconds()));
8686
session.execute(insert);
8787
return entity;
@@ -115,7 +115,7 @@ public List<ColumnEntity> find(ColumnQuery query) {
115115
*/
116116
public ColumnEntity save(ColumnEntity entity, ConsistencyLevel level) throws NullPointerException {
117117
Objects.requireNonNull(entity, "entity is required");
118-
Insert insert = QueryUtils.insert(entity, keyspace);
118+
Insert insert = QueryUtils.insert(entity, keyspace, session);
119119
insert.setConsistencyLevel(Objects.requireNonNull(level, "ConsistencyLevel is required"));
120120
session.execute(insert);
121121
return entity;
@@ -135,7 +135,7 @@ public ColumnEntity save(ColumnEntity entity, Duration ttl, ConsistencyLevel lev
135135
Objects.requireNonNull(entity, "entity is required");
136136
Objects.requireNonNull(ttl, "ttl is required");
137137
Objects.requireNonNull(level, "level is required");
138-
Insert insert = QueryUtils.insert(entity, keyspace);
138+
Insert insert = QueryUtils.insert(entity, keyspace, session);
139139
insert.setConsistencyLevel(Objects.requireNonNull(level, "ConsistencyLevel is required"));
140140
insert.using(QueryBuilder.ttl((int) ttl.getSeconds()));
141141
session.execute(insert);

cassandra-driver/src/main/java/org/jnosql/diana/cassandra/column/CassandraColumnFamilyManagerAsync.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public class CassandraColumnFamilyManagerAsync implements ColumnFamilyManagerAsy
6767
@Override
6868
public void save(ColumnEntity entity) {
6969
Objects.requireNonNull(entity, "entity is required");
70-
Insert insert = QueryUtils.insert(entity, keyspace);
70+
Insert insert = QueryUtils.insert(entity, keyspace, session);
7171
session.executeAsync(insert);
7272
}
7373

@@ -79,7 +79,7 @@ public void save(ColumnEntity entity) {
7979
*/
8080
public void save(ColumnEntity entity, ConsistencyLevel level) throws ExecuteAsyncQueryException, UnsupportedOperationException {
8181
Objects.requireNonNull(entity, "entity is required");
82-
Insert insert = QueryUtils.insert(entity, keyspace);
82+
Insert insert = QueryUtils.insert(entity, keyspace, session);
8383
insert.setConsistencyLevel(Objects.requireNonNull(level, "ConsistencyLevel is required"));
8484
session.executeAsync(insert);
8585
}
@@ -106,7 +106,7 @@ public void save(ColumnEntity entity, ConsistencyLevel level, Consumer<ColumnEnt
106106
Objects.requireNonNull(entity, "entity is required");
107107
Objects.requireNonNull(callBack, "consumer is required");
108108

109-
Insert insert = QueryUtils.insert(entity, keyspace);
109+
Insert insert = QueryUtils.insert(entity, keyspace, session);
110110
insert.setConsistencyLevel(Objects.requireNonNull(level, "ConsistencyLevel is required"));
111111
ResultSetFuture resultSetFuture = session.executeAsync(insert);
112112
resultSetFuture.addListener(() -> callBack.accept(entity), executor);
@@ -116,7 +116,7 @@ public void save(ColumnEntity entity, ConsistencyLevel level, Consumer<ColumnEnt
116116
public void save(ColumnEntity entity, Duration ttl) throws ExecuteAsyncQueryException, UnsupportedOperationException {
117117
Objects.requireNonNull(entity, "entity is required");
118118
Objects.requireNonNull(ttl, "ttl is required");
119-
Insert insert = QueryUtils.insert(entity, keyspace);
119+
Insert insert = QueryUtils.insert(entity, keyspace, session);
120120
insert.using(QueryBuilder.ttl((int) ttl.getSeconds()));
121121
session.executeAsync(insert);
122122
}
@@ -133,7 +133,7 @@ public void save(ColumnEntity entity, Duration ttl) throws ExecuteAsyncQueryExce
133133
public void save(ColumnEntity entity, Duration ttl, ConsistencyLevel level) throws ExecuteAsyncQueryException, UnsupportedOperationException {
134134
Objects.requireNonNull(entity, "entity is required");
135135
Objects.requireNonNull(ttl, "ttl is required");
136-
Insert insert = QueryUtils.insert(entity, keyspace);
136+
Insert insert = QueryUtils.insert(entity, keyspace, session);
137137
insert.setConsistencyLevel(Objects.requireNonNull(level, "ConsistencyLevel is required"));
138138
insert.using(QueryBuilder.ttl((int) ttl.getSeconds()));
139139
session.executeAsync(insert);
@@ -152,7 +152,7 @@ public void save(ColumnEntity entity, Duration ttl, ConsistencyLevel level) thro
152152
public void save(ColumnEntity entity, Duration ttl, ConsistencyLevel level, Consumer<ColumnEntity> callBack) throws ExecuteAsyncQueryException, UnsupportedOperationException {
153153
Objects.requireNonNull(entity, "entity is required");
154154
Objects.requireNonNull(callBack, "consumer is required");
155-
Insert insert = QueryUtils.insert(entity, keyspace);
155+
Insert insert = QueryUtils.insert(entity, keyspace, session);
156156
insert.setConsistencyLevel(Objects.requireNonNull(level, "ConsistencyLevel is required"));
157157
insert.using(QueryBuilder.ttl((int) ttl.getSeconds()));
158158
ResultSetFuture resultSetFuture = session.executeAsync(insert);
@@ -175,14 +175,14 @@ public void save(Iterable<ColumnEntity> entities, Duration ttl, ConsistencyLevel
175175

176176
@Override
177177
public void save(ColumnEntity entity, Consumer<ColumnEntity> consumer) {
178-
Insert insert = QueryUtils.insert(entity, keyspace);
178+
Insert insert = QueryUtils.insert(entity, keyspace, session);
179179
ResultSetFuture resultSetFuture = session.executeAsync(insert);
180180
resultSetFuture.addListener(() -> consumer.accept(entity), executor);
181181
}
182182

183183
@Override
184184
public void save(ColumnEntity entity, Duration ttl, Consumer<ColumnEntity> callBack) throws ExecuteAsyncQueryException, UnsupportedOperationException {
185-
Insert insert = QueryUtils.insert(entity, keyspace);
185+
Insert insert = QueryUtils.insert(entity, keyspace, session);
186186
insert.using(QueryBuilder.ttl((int) ttl.getSeconds()));
187187
ResultSetFuture resultSetFuture = session.executeAsync(insert);
188188
resultSetFuture.addListener(() -> callBack.accept(entity), executor);

cassandra-driver/src/main/java/org/jnosql/diana/cassandra/column/CassandraConverter.java

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,18 @@
2121
package org.jnosql.diana.cassandra.column;
2222

2323

24+
import com.datastax.driver.core.CodecRegistry;
2425
import com.datastax.driver.core.ColumnDefinitions;
2526
import com.datastax.driver.core.DataType;
2627
import com.datastax.driver.core.Row;
28+
import com.datastax.driver.core.TypeCodec;
29+
import com.datastax.driver.core.UDTValue;
30+
import com.datastax.driver.core.UserType;
31+
import com.google.common.reflect.TypeToken;
2732
import org.jnosql.diana.api.Value;
2833
import org.jnosql.diana.api.column.Column;
2934
import org.jnosql.diana.api.column.ColumnEntity;
35+
import org.jnosql.diana.api.document.Document;
3036

3137
import java.math.BigDecimal;
3238
import java.math.BigInteger;
@@ -36,6 +42,8 @@
3642

3743
final class CassandraConverter {
3844

45+
private static CodecRegistry CODE_REGISTRY = CodecRegistry.DEFAULT_INSTANCE;
46+
3947
private CassandraConverter() {
4048
}
4149

@@ -53,75 +61,41 @@ public static ColumnEntity toDocumentEntity(Row row) {
5361
}
5462

5563
public static Object get(ColumnDefinitions.Definition definition, Row row) {
56-
String name = definition.getName();
57-
Class classType = get(definition.getType().getName());
58-
if (classType == List.class) {
59-
DataType dataType = definition.getType().getTypeArguments().get(0);
60-
return row.getList(name, get(dataType.getName()));
61-
}
62-
63-
if (classType == Set.class) {
64-
DataType dataType = definition.getType().getTypeArguments().get(0);
65-
return row.getSet(name, get(dataType.getName()));
66-
}
67-
68-
if (classType == Map.class) {
69-
DataType keyType = definition.getType().getTypeArguments().get(0);
70-
DataType valueType = definition.getType().getTypeArguments().get(1);
71-
return row.getMap(name, get(keyType.getName()), get(valueType.getName()));
72-
}
73-
return row.get(name, classType);
74-
75-
}
7664

77-
private static Class get(DataType.Name name) {
78-
switch (name) {
79-
case ASCII:
80-
case TEXT:
81-
case VARCHAR:
82-
return String.class;
83-
case BIGINT:
84-
case COUNTER:
85-
return Long.class;
86-
case INT:
87-
case SMALLINT:
88-
case TINYINT:
89-
return Integer.class;
90-
case BLOB:
91-
return ByteBuffer.class;
92-
case BOOLEAN:
93-
return Boolean.class;
94-
case DECIMAL:
95-
return BigDecimal.class;
96-
case VARINT:
97-
return BigInteger.class;
98-
case DOUBLE:
99-
return Double.class;
100-
case FLOAT:
101-
return Float.class;
102-
case INET:
103-
return InetAddress.class;
104-
105-
case UUID:
106-
case TIMEUUID:
107-
return UUID.class;
65+
String name = definition.getName();
66+
switch (definition.getType().getName()) {
10867
case LIST:
109-
return List.class;
68+
DataType typeList = definition.getType().getTypeArguments().get(0);
69+
TypeToken<Object> javaTypeList = CODE_REGISTRY.codecFor(typeList).getJavaType();
70+
return row.getList(name, javaTypeList);
11071
case SET:
111-
return Set.class;
72+
DataType typeSet = definition.getType().getTypeArguments().get(0);
73+
TypeToken<Object> javaTypeSet = CODE_REGISTRY.codecFor(typeSet).getJavaType();
74+
return row.getList(name, javaTypeSet);
11275
case MAP:
113-
return Map.class;
114-
case TIMESTAMP:
115-
case DATE:
116-
case TIME:
117-
return Date.class;
118-
119-
case TUPLE:
120-
case CUSTOM:
76+
DataType typeKey = definition.getType().getTypeArguments().get(0);
77+
DataType typeValue = definition.getType().getTypeArguments().get(1);
78+
TypeToken<Object> javaTypeKey = CODE_REGISTRY.codecFor(typeKey).getJavaType();
79+
TypeToken<Object> javaTypeValue = CODE_REGISTRY.codecFor(typeValue).getJavaType();
80+
return row.getMap(name, javaTypeKey, javaTypeValue);
12181
case UDT:
122-
default:
123-
throw new IllegalArgumentException("The type is not supported " + name);
124-
82+
UDTValue udtValue = row.getUDTValue(name);
83+
UserType type = udtValue.getType();
84+
List<Column> columns = new ArrayList<>();
85+
for (String fieldName : type.getFieldNames()) {
86+
DataType fieldType = type.getFieldType(fieldName);
87+
Object elementValue = udtValue.get(fieldName, CODE_REGISTRY.codecFor(fieldType));
88+
if (elementValue != null) {
89+
columns.add(Column.of(fieldName, elementValue));
90+
}
91+
}
92+
return new UDT(name, type.getTypeName(), columns);
12593
}
94+
95+
TypeCodec<Object> objectTypeCodec = CODE_REGISTRY.codecFor(definition.getType());
96+
return row.get(name, objectTypeCodec);
97+
12698
}
99+
100+
127101
}

cassandra-driver/src/main/java/org/jnosql/diana/cassandra/column/QueryUtils.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
package org.jnosql.diana.cassandra.column;
2222

2323

24+
import com.datastax.driver.core.CodecRegistry;
25+
import com.datastax.driver.core.Session;
26+
import com.datastax.driver.core.TypeCodec;
27+
import com.datastax.driver.core.UDTValue;
28+
import com.datastax.driver.core.UserType;
2429
import com.datastax.driver.core.querybuilder.BuiltStatement;
2530
import com.datastax.driver.core.querybuilder.Clause;
2631
import com.datastax.driver.core.querybuilder.Delete;
@@ -42,6 +47,7 @@
4247
import java.util.List;
4348
import java.util.Objects;
4449
import java.util.Optional;
50+
import java.util.function.Consumer;
4551
import java.util.function.Function;
4652
import java.util.stream.StreamSupport;
4753

@@ -65,12 +71,29 @@ private QueryUtils() {
6571
}
6672

6773

68-
public static Insert insert(ColumnEntity entity, String keyspace) {
74+
public static Insert insert(ColumnEntity entity, String keyspace, Session session) {
6975
Insert insert = insertInto(keyspace, entity.getName());
70-
entity.getColumns().forEach(d -> insert.value(d.getName(), ValueUtil.convert(d.getValue())));
76+
entity.getColumns().stream().filter(d -> !UDT.class.isInstance(d))
77+
.forEach(d -> insert.value(d.getName(), ValueUtil.convert(d.getValue())));
78+
Consumer<? super UDT> ss;
79+
entity.getColumns().stream()
80+
.filter(d -> UDT.class.isInstance(d))
81+
.map(d -> UDT.class.cast(d))
82+
.forEach(udt -> insertUDT(udt, keyspace, session, insert));
7183
return insert;
7284
}
7385

86+
private static void insertUDT(UDT udt, String keyspace, Session session, Insert insert) {
87+
UserType userType = session.getCluster().getMetadata().getKeyspace(keyspace).getUserType(udt.getUserType());
88+
UDTValue udtValue = userType.newValue();
89+
for (Column column : udt.getColumns()) {
90+
Object convert = ValueUtil.convert(column.getValue());
91+
TypeCodec<Object> objectTypeCodec = CodecRegistry.DEFAULT_INSTANCE.codecFor(convert);
92+
udtValue.set(column.getName(), convert, objectTypeCodec);
93+
}
94+
insert.value(udt.getName(), udtValue);
95+
}
96+
7497

7598
public static BuiltStatement add(ColumnQuery query, String keySpace) {
7699
String columnFamily = query.getColumnFamily();
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.jnosql.diana.cassandra.column;
2+
3+
4+
import org.jnosql.diana.api.TypeSupplier;
5+
import org.jnosql.diana.api.Value;
6+
import org.jnosql.diana.api.column.Column;
7+
8+
import java.util.Collections;
9+
import java.util.List;
10+
import java.util.Objects;
11+
12+
public class UDT implements Column {
13+
14+
private final String name;
15+
16+
private final String userType;
17+
18+
private final List<Column> columns;
19+
20+
public UDT(String name, String userType, List<Column> columns) {
21+
this.name = name;
22+
this.userType = userType;
23+
this.columns = columns;
24+
}
25+
26+
@Override
27+
public String getName() {
28+
return name;
29+
}
30+
31+
@Override
32+
public Value getValue() {
33+
return Value.of(columns);
34+
}
35+
36+
@Override
37+
public <T> T get(Class<T> clazz) throws NullPointerException, UnsupportedOperationException {
38+
if (Iterable.class.isAssignableFrom(clazz)) {
39+
return (T) columns;
40+
}
41+
throw new IllegalArgumentException("This method just returns a list of document");
42+
}
43+
44+
@Override
45+
public <T> T get(TypeSupplier<T> typeSupplier) throws NullPointerException, UnsupportedOperationException {
46+
throw new UnsupportedOperationException("This method is not supported");
47+
}
48+
49+
@Override
50+
public Object get() {
51+
return columns;
52+
}
53+
54+
public List<Column> getColumns() {
55+
return Collections.unmodifiableList(columns);
56+
}
57+
58+
public String getUserType() {
59+
return userType;
60+
}
61+
62+
@Override
63+
public boolean equals(Object o) {
64+
if (this == o) {
65+
return true;
66+
}
67+
if (!(o instanceof UDT)) {
68+
return false;
69+
}
70+
UDT udt = (UDT) o;
71+
return Objects.equals(name, udt.name) &&
72+
Objects.equals(userType, udt.userType) &&
73+
Objects.equals(columns, udt.columns);
74+
}
75+
76+
@Override
77+
public int hashCode() {
78+
return Objects.hash(name, userType, columns);
79+
}
80+
81+
@Override
82+
public String toString() {
83+
final StringBuilder sb = new StringBuilder("UDT{");
84+
sb.append("name='").append(name).append('\'');
85+
sb.append(", userType='").append(userType).append('\'');
86+
sb.append(", columns=").append(columns);
87+
sb.append('}');
88+
return sb.toString();
89+
}
90+
}

0 commit comments

Comments
 (0)