add casser entity type to differ table and user type entities
This commit is contained in:
parent
9eeee7d119
commit
f8bbcd1cd3
20 changed files with 265 additions and 133 deletions
2
pom.xml
2
pom.xml
|
@ -42,7 +42,7 @@
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
|
||||||
<cassandra-unit.version>2.0.2.2</cassandra-unit.version>
|
<cassandra-unit.version>2.0.2.2</cassandra-unit.version>
|
||||||
<cassandra-driver-core.version>2.1.4</cassandra-driver-core.version>
|
<cassandra-driver-core.version>2.1.5</cassandra-driver-core.version>
|
||||||
<cassandra>2.1.2</cassandra>
|
<cassandra>2.1.2</cassandra>
|
||||||
<guava.version>16.0.1</guava.version>
|
<guava.version>16.0.1</guava.version>
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ import com.datastax.driver.core.RegularStatement;
|
||||||
import com.datastax.driver.core.ResultSet;
|
import com.datastax.driver.core.ResultSet;
|
||||||
import com.datastax.driver.core.ResultSetFuture;
|
import com.datastax.driver.core.ResultSetFuture;
|
||||||
import com.datastax.driver.core.Session;
|
import com.datastax.driver.core.Session;
|
||||||
|
import com.datastax.driver.core.Statement;
|
||||||
import com.datastax.driver.core.querybuilder.BuiltStatement;
|
import com.datastax.driver.core.querybuilder.BuiltStatement;
|
||||||
|
|
||||||
public abstract class AbstractSessionOperations {
|
public abstract class AbstractSessionOperations {
|
||||||
|
@ -40,27 +41,13 @@ public abstract class AbstractSessionOperations {
|
||||||
|
|
||||||
abstract public Executor getExecutor();
|
abstract public Executor getExecutor();
|
||||||
|
|
||||||
public ResultSet execute(String cql) {
|
public ResultSet execute(Statement statement) {
|
||||||
|
|
||||||
try {
|
return executeAsync(statement).getUninterruptibly();
|
||||||
|
|
||||||
if (logger.isInfoEnabled()) {
|
|
||||||
logger.info("Execute query " + cql);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isShowCql() && cql != null) {
|
|
||||||
System.out.println(cql);
|
|
||||||
}
|
|
||||||
|
|
||||||
return currentSession().execute(cql);
|
|
||||||
}
|
|
||||||
catch(RuntimeException e) {
|
|
||||||
throw translateException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultSetFuture executeAsync(BuiltStatement statement) {
|
public ResultSetFuture executeAsync(Statement statement) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
@ -70,20 +57,30 @@ public abstract class AbstractSessionOperations {
|
||||||
|
|
||||||
if (isShowCql()) {
|
if (isShowCql()) {
|
||||||
|
|
||||||
RegularStatement regular = statement.setForceNoValues(true);
|
if (statement instanceof BuiltStatement) {
|
||||||
|
|
||||||
String cql = regular.getQueryString();
|
BuiltStatement builtStatement = (BuiltStatement) statement;
|
||||||
|
|
||||||
System.out.println(cql);
|
RegularStatement regularStatement = builtStatement.setForceNoValues(true);
|
||||||
|
|
||||||
return currentSession().executeAsync(regular);
|
System.out.println(regularStatement.getQueryString());
|
||||||
}
|
}
|
||||||
else {
|
else if (statement instanceof RegularStatement) {
|
||||||
|
|
||||||
|
RegularStatement regularStatement = (RegularStatement) statement;
|
||||||
|
|
||||||
|
System.out.println(regularStatement.getQueryString());
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
System.out.println(statement.toString());
|
||||||
|
}
|
||||||
|
|
||||||
return currentSession().executeAsync(statement);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return currentSession().executeAsync(statement);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch(RuntimeException e) {
|
catch(RuntimeException e) {
|
||||||
throw translateException(e);
|
throw translateException(e);
|
||||||
|
|
|
@ -271,9 +271,7 @@ public class CasserSession extends AbstractSessionOperations implements Closeabl
|
||||||
|
|
||||||
private void dropEntity(CasserMappingEntity<?> entity) {
|
private void dropEntity(CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
String cql = SchemaUtil.dropTableCql(entity);
|
execute(SchemaUtil.dropTable(entity));
|
||||||
|
|
||||||
execute(cql);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import casser.mapping.CasserEntityType;
|
||||||
import casser.mapping.CasserMappingEntity;
|
import casser.mapping.CasserMappingEntity;
|
||||||
import casser.mapping.CasserMappingProperty;
|
import casser.mapping.CasserMappingProperty;
|
||||||
import casser.mapping.CqlUtil;
|
import casser.mapping.CqlUtil;
|
||||||
|
@ -29,29 +30,49 @@ import casser.support.CasserMappingException;
|
||||||
|
|
||||||
import com.datastax.driver.core.ColumnMetadata;
|
import com.datastax.driver.core.ColumnMetadata;
|
||||||
import com.datastax.driver.core.DataType;
|
import com.datastax.driver.core.DataType;
|
||||||
|
import com.datastax.driver.core.RegularStatement;
|
||||||
|
import com.datastax.driver.core.SimpleStatement;
|
||||||
import com.datastax.driver.core.TableMetadata;
|
import com.datastax.driver.core.TableMetadata;
|
||||||
import com.datastax.driver.core.schemabuilder.Alter;
|
import com.datastax.driver.core.schemabuilder.Alter;
|
||||||
import com.datastax.driver.core.schemabuilder.Create;
|
import com.datastax.driver.core.schemabuilder.Create;
|
||||||
import com.datastax.driver.core.schemabuilder.Create.Options;
|
import com.datastax.driver.core.schemabuilder.Create.Options;
|
||||||
|
import com.datastax.driver.core.schemabuilder.CreateType;
|
||||||
import com.datastax.driver.core.schemabuilder.SchemaBuilder;
|
import com.datastax.driver.core.schemabuilder.SchemaBuilder;
|
||||||
|
import com.datastax.driver.core.schemabuilder.SchemaStatement;
|
||||||
|
|
||||||
public final class SchemaUtil {
|
public final class SchemaUtil {
|
||||||
|
|
||||||
private SchemaUtil() {
|
private SchemaUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String useCql(String keyspace, boolean forceQuote) {
|
public static RegularStatement use(String keyspace, boolean forceQuote) {
|
||||||
if (forceQuote) {
|
if (forceQuote) {
|
||||||
return "USE " + keyspace;
|
return new SimpleStatement("USE" + CqlUtil.forceQuote(keyspace));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return "USE" + CqlUtil.forceQuote(keyspace);
|
return new SimpleStatement("USE " + keyspace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String createTableCql(CasserMappingEntity<?> entity) {
|
public static SchemaStatement createUserType(CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
Create create = SchemaBuilder.createTable(entity.getTableName());
|
if (entity.getType() != CasserEntityType.USER_DEFINED_TYPE) {
|
||||||
|
throw new CasserMappingException("expected user defined type entity " + entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateType create = SchemaBuilder.createType(entity.getName());
|
||||||
|
|
||||||
|
|
||||||
|
return create;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SchemaStatement createTable(CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
|
if (entity.getType() != CasserEntityType.TABLE) {
|
||||||
|
throw new CasserMappingException("expected table entity " + entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
Create create = SchemaBuilder.createTable(entity.getName());
|
||||||
|
|
||||||
List<CasserMappingProperty<?>> partitionKeys = new ArrayList<CasserMappingProperty<?>>();
|
List<CasserMappingProperty<?>> partitionKeys = new ArrayList<CasserMappingProperty<?>>();
|
||||||
List<CasserMappingProperty<?>> clusteringColumns = new ArrayList<CasserMappingProperty<?>>();
|
List<CasserMappingProperty<?>> clusteringColumns = new ArrayList<CasserMappingProperty<?>>();
|
||||||
|
@ -102,16 +123,20 @@ public final class SchemaUtil {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return create.buildInternal();
|
return create;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String alterTableCql(TableMetadata tmd,
|
public static List<SchemaStatement> alterTable(TableMetadata tmd,
|
||||||
CasserMappingEntity<?> entity, boolean dropRemovedColumns) {
|
CasserMappingEntity<?> entity, boolean dropRemovedColumns) {
|
||||||
|
|
||||||
boolean altered = false;
|
if (entity.getType() != CasserEntityType.TABLE) {
|
||||||
|
throw new CasserMappingException("expected table entity " + entity);
|
||||||
|
}
|
||||||
|
|
||||||
Alter alter = SchemaBuilder.alterTable(entity.getTableName());
|
List<SchemaStatement> result = new ArrayList<SchemaStatement>();
|
||||||
|
|
||||||
|
Alter alter = SchemaBuilder.alterTable(entity.getName());
|
||||||
|
|
||||||
final Set<String> visitedColumns = dropRemovedColumns ? new HashSet<String>()
|
final Set<String> visitedColumns = dropRemovedColumns ? new HashSet<String>()
|
||||||
: Collections.<String> emptySet();
|
: Collections.<String> emptySet();
|
||||||
|
@ -138,32 +163,40 @@ public final class SchemaUtil {
|
||||||
throw new CasserMappingException(
|
throw new CasserMappingException(
|
||||||
"unable to alter column that is a part of primary key '"
|
"unable to alter column that is a part of primary key '"
|
||||||
+ columnName + "' for entity "
|
+ columnName + "' for entity "
|
||||||
+ entity.getName());
|
+ entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (columnMetadata == null) {
|
if (columnMetadata == null) {
|
||||||
|
|
||||||
alter.addColumn(columnName).type(columnDataType);
|
result.add(alter.addColumn(columnName).type(columnDataType));
|
||||||
altered = true;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
alter.alterColumn(columnName).type(columnDataType);
|
result.add(alter.alterColumn(columnName).type(columnDataType));
|
||||||
altered = true;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (altered) {
|
if (dropRemovedColumns) {
|
||||||
return alter.buildInternal();
|
for (ColumnMetadata cm : tmd.getColumns()) {
|
||||||
|
if (!visitedColumns.contains(cm.getName())) {
|
||||||
|
|
||||||
|
result.add(alter.dropColumn(cm.getName()));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String dropTableCql(CasserMappingEntity<?> entity) {
|
public static SchemaStatement dropTable(CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
return SchemaBuilder.dropTable(entity.getTableName()).buildInternal();
|
if (entity.getType() != CasserEntityType.TABLE) {
|
||||||
|
throw new CasserMappingException("expected table entity " + entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
return SchemaBuilder.dropTable(entity.getName());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -140,13 +140,13 @@ public class SessionInitializer extends AbstractSessionOperations {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SessionInitializer use(String keyspace) {
|
public SessionInitializer use(String keyspace) {
|
||||||
session.execute(SchemaUtil.useCql(keyspace, false));
|
session.execute(SchemaUtil.use(keyspace, false));
|
||||||
this.usingKeyspace = keyspace;
|
this.usingKeyspace = keyspace;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SessionInitializer use(String keyspace, boolean forceQuote) {
|
public SessionInitializer use(String keyspace, boolean forceQuote) {
|
||||||
session.execute(SchemaUtil.useCql(keyspace, forceQuote));
|
session.execute(SchemaUtil.use(keyspace, forceQuote));
|
||||||
this.usingKeyspace = keyspace;
|
this.usingKeyspace = keyspace;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -236,7 +236,7 @@ public class SessionInitializer extends AbstractSessionOperations {
|
||||||
}
|
}
|
||||||
|
|
||||||
private TableMetadata getTableMetadata(CasserMappingEntity<?> entity) {
|
private TableMetadata getTableMetadata(CasserMappingEntity<?> entity) {
|
||||||
String tableName = entity.getTableName();
|
String tableName = entity.getName();
|
||||||
return getKeyspaceMetadata().getTable(tableName.toLowerCase());
|
return getKeyspaceMetadata().getTable(tableName.toLowerCase());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,16 @@
|
||||||
*/
|
*/
|
||||||
package casser.core;
|
package casser.core;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import casser.mapping.CasserMappingEntity;
|
import casser.mapping.CasserMappingEntity;
|
||||||
import casser.support.CasserException;
|
import casser.support.CasserException;
|
||||||
|
|
||||||
|
import com.datastax.driver.core.RegularStatement;
|
||||||
import com.datastax.driver.core.TableMetadata;
|
import com.datastax.driver.core.TableMetadata;
|
||||||
|
import com.datastax.driver.core.querybuilder.Batch;
|
||||||
|
import com.datastax.driver.core.querybuilder.QueryBuilder;
|
||||||
|
import com.datastax.driver.core.schemabuilder.SchemaStatement;
|
||||||
|
|
||||||
public final class TableOperations {
|
public final class TableOperations {
|
||||||
|
|
||||||
|
@ -31,23 +37,19 @@ public final class TableOperations {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createTable(CasserMappingEntity<?> entity) {
|
public void createTable(CasserMappingEntity<?> entity) {
|
||||||
|
sessionOps.execute(SchemaUtil.createTable(entity));
|
||||||
String cql = SchemaUtil.createTableCql(entity);
|
|
||||||
|
|
||||||
sessionOps.execute(cql);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validateTable(TableMetadata tmd, CasserMappingEntity<?> entity) {
|
public void validateTable(TableMetadata tmd, CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
if (tmd == null) {
|
if (tmd == null) {
|
||||||
throw new CasserException("table not exists " + entity.getTableName() + "for entity " + entity.getMappingInterface());
|
throw new CasserException("table not exists " + entity.getName() + "for entity " + entity.getMappingInterface());
|
||||||
}
|
}
|
||||||
|
|
||||||
String cql = SchemaUtil.alterTableCql(tmd, entity, dropRemovedColumns);
|
List<SchemaStatement> list = SchemaUtil.alterTable(tmd, entity, dropRemovedColumns);
|
||||||
|
|
||||||
if (cql != null) {
|
if (!list.isEmpty()) {
|
||||||
throw new CasserException("schema changed for entity " + entity.getMappingInterface() + ", apply this command: " + cql);
|
throw new CasserException("schema changed for entity " + entity.getMappingInterface() + ", apply this command: " + list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,10 +59,11 @@ public final class TableOperations {
|
||||||
createTable(entity);
|
createTable(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
String cql = SchemaUtil.alterTableCql(tmd, entity, dropRemovedColumns);
|
List<SchemaStatement> list = SchemaUtil.alterTable(tmd, entity, dropRemovedColumns);
|
||||||
|
|
||||||
if (cql != null) {
|
if (!list.isEmpty()) {
|
||||||
sessionOps.execute(cql);
|
Batch b = QueryBuilder.batch(list.toArray(new RegularStatement[list.size()]));
|
||||||
|
sessionOps.execute(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package casser.core;
|
package casser.core;
|
||||||
|
|
||||||
import casser.mapping.CasserMappingUserType;
|
import casser.mapping.CasserMappingEntity;
|
||||||
|
|
||||||
import com.datastax.driver.core.UserType;
|
import com.datastax.driver.core.UserType;
|
||||||
|
|
||||||
|
@ -27,16 +27,18 @@ public final class UserTypeOperations {
|
||||||
this.sessionOps = sessionOps;
|
this.sessionOps = sessionOps;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createUserType(String name, CasserMappingUserType<?> type) {
|
public void createUserType(String name, CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validateUserType(String name, UserType userType, CasserMappingUserType<?> type) {
|
public void validateUserType(String name, UserType userType, CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void updateUserType(String name, UserType userType, CasserMappingUserType<?> type) {
|
public void updateUserType(String name, UserType userType, CasserMappingEntity<?> entity) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ public final class CountOperation extends AbstractFilterOperation<Long, CountOpe
|
||||||
@Override
|
@Override
|
||||||
public BuiltStatement buildStatement() {
|
public BuiltStatement buildStatement() {
|
||||||
|
|
||||||
Select select = QueryBuilder.select().countAll().from(entity.getTableName());
|
Select select = QueryBuilder.select().countAll().from(entity.getName());
|
||||||
|
|
||||||
if (filters != null && !filters.isEmpty()) {
|
if (filters != null && !filters.isEmpty()) {
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ public final class DeleteOperation extends AbstractFilterOperation<ResultSet, De
|
||||||
|
|
||||||
if (filters != null && !filters.isEmpty()) {
|
if (filters != null && !filters.isEmpty()) {
|
||||||
|
|
||||||
Delete delete = QueryBuilder.delete().from(entity.getTableName());
|
Delete delete = QueryBuilder.delete().from(entity.getName());
|
||||||
|
|
||||||
Where where = delete.where();
|
Where where = delete.where();
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ public final class DeleteOperation extends AbstractFilterOperation<ResultSet, De
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return QueryBuilder.truncate(entity.getTableName());
|
return QueryBuilder.truncate(entity.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,7 @@ public final class SelectOperation<E> extends AbstractFilterStreamOperation<E, S
|
||||||
throw new CasserMappingException("no entity or table to select data");
|
throw new CasserMappingException("no entity or table to select data");
|
||||||
}
|
}
|
||||||
|
|
||||||
Select select = selection.from(entity.getTableName());
|
Select select = selection.from(entity.getName());
|
||||||
|
|
||||||
if (ordering != null && !ordering.isEmpty()) {
|
if (ordering != null && !ordering.isEmpty()) {
|
||||||
select.orderBy(ordering.toArray(new Ordering[ordering.size()]));
|
select.orderBy(ordering.toArray(new Ordering[ordering.size()]));
|
||||||
|
|
|
@ -85,7 +85,7 @@ public final class UpdateOperation extends AbstractFilterOperation<ResultSet, Up
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Update update = QueryBuilder.update(entity.getTableName());
|
Update update = QueryBuilder.update(entity.getName());
|
||||||
|
|
||||||
for (int i = 0; i != props.length; ++i) {
|
for (int i = 0; i != props.length; ++i) {
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ public final class UpsertOperation extends AbstractObjectOperation<ResultSet, Up
|
||||||
public UpsertOperation(AbstractSessionOperations sessionOperations, CasserMappingEntity<?> entity, Object pojo) {
|
public UpsertOperation(AbstractSessionOperations sessionOperations, CasserMappingEntity<?> entity, Object pojo) {
|
||||||
super(sessionOperations);
|
super(sessionOperations);
|
||||||
|
|
||||||
this.insert = QueryBuilder.insertInto(entity.getTableName());
|
this.insert = QueryBuilder.insertInto(entity.getName());
|
||||||
|
|
||||||
for (CasserMappingProperty<?> prop : entity.getMappingProperties()) {
|
for (CasserMappingProperty<?> prop : entity.getMappingProperties()) {
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,9 @@ import java.util.Collection;
|
||||||
|
|
||||||
public interface CasserEntity<E> {
|
public interface CasserEntity<E> {
|
||||||
|
|
||||||
String getName();
|
CasserEntityType getType();
|
||||||
|
|
||||||
String getTableName();
|
String getName();
|
||||||
|
|
||||||
Collection<CasserProperty<E>> getProperties();
|
Collection<CasserProperty<E>> getProperties();
|
||||||
|
|
||||||
|
|
|
@ -15,15 +15,6 @@
|
||||||
*/
|
*/
|
||||||
package casser.mapping;
|
package casser.mapping;
|
||||||
|
|
||||||
public class CasserMappingUserType<E> implements CasserUserType<E> {
|
public enum CasserEntityType {
|
||||||
|
TABLE, USER_DEFINED_TYPE;
|
||||||
public CasserMappingUserType(Class<E> clazz) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -72,12 +72,17 @@ public class CasserMappingEntity<E> implements CasserEntity<E> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CasserEntityType getType() {
|
||||||
|
return CasserEntityType.TABLE;
|
||||||
|
}
|
||||||
|
|
||||||
public Class<E> getMappingInterface() {
|
public Class<E> getMappingInterface() {
|
||||||
return iface;
|
return iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String toString() {
|
||||||
return iface.toString();
|
return iface.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +96,7 @@ public class CasserMappingEntity<E> implements CasserEntity<E> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getTableName() {
|
public String getName() {
|
||||||
|
|
||||||
if (tableName == null) {
|
if (tableName == null) {
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ public class CasserMappingRepository {
|
||||||
|
|
||||||
private final Map<Class<?>, CasserMappingEntity<?>> entityMap = new HashMap<Class<?>, CasserMappingEntity<?>>();
|
private final Map<Class<?>, CasserMappingEntity<?>> entityMap = new HashMap<Class<?>, CasserMappingEntity<?>>();
|
||||||
|
|
||||||
private final Map<String, CasserMappingUserType<?>> udtMap = new HashMap<String, CasserMappingUserType<?>>();
|
private final Map<String, CasserMappingEntity<?>> udtMap = new HashMap<String, CasserMappingEntity<?>>();
|
||||||
|
|
||||||
private boolean readOnly = false;
|
private boolean readOnly = false;
|
||||||
|
|
||||||
|
@ -42,15 +42,15 @@ public class CasserMappingRepository {
|
||||||
throw new CasserException("read-only mode");
|
throw new CasserException("read-only mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
udtMap.putIfAbsent(name, new CasserMappingUserType(userTypeClass));
|
udtMap.putIfAbsent(name, new CasserMappingEntity(userTypeClass));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, CasserMappingUserType<?>> knownUserTypes() {
|
public Map<String, CasserMappingEntity<?>> knownUserTypes() {
|
||||||
return Collections.unmodifiableMap(udtMap);
|
return Collections.unmodifiableMap(udtMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CasserMappingUserType<?> findUserType(Class<?> userTypeClass) {
|
public CasserMappingEntity<?> findUserType(Class<?> userTypeClass) {
|
||||||
return udtMap.get(userTypeClass);
|
return udtMap.get(userTypeClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,12 @@
|
||||||
*/
|
*/
|
||||||
package casser.mapping;
|
package casser.mapping;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
public interface CasserUserType<E> {
|
public interface CasserUserType<E> {
|
||||||
|
|
||||||
public String getName();
|
String getName();
|
||||||
|
|
||||||
|
Collection<CasserProperty<E>> getProperties();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Noorq, 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 casser.test.integration.core.usertype;
|
package casser.test.integration.core.usertype;
|
||||||
|
|
||||||
import casser.mapping.PartitionKey;
|
import casser.mapping.PartitionKey;
|
||||||
|
|
|
@ -1,50 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Noorq, 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 casser.test.integration.core.usertype;
|
package casser.test.integration.core.usertype;
|
||||||
|
|
||||||
import casser.mapping.Field;
|
import casser.mapping.Field;
|
||||||
import casser.mapping.UserDefinedType;
|
import casser.mapping.UserDefinedType;
|
||||||
|
|
||||||
@UserDefinedType("address")
|
@UserDefinedType("address")
|
||||||
public class Address {
|
public interface Address {
|
||||||
|
|
||||||
@Field("line_1")
|
@Field("line_1")
|
||||||
private String street;
|
String getStreet();
|
||||||
|
|
||||||
private String city;
|
void setStreet(String street);
|
||||||
|
|
||||||
private int zip;
|
String getCity();
|
||||||
|
|
||||||
private String country;
|
void setCity(String city);
|
||||||
|
|
||||||
public String getStreet() {
|
int getZip();
|
||||||
return street;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStreet(String street) {
|
void setZip(int zip);
|
||||||
this.street = street;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCity() {
|
String getCountry();
|
||||||
return city;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCity(String city) {
|
void setCountry(String country);
|
||||||
this.city = city;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getZip() {
|
|
||||||
return zip;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setZip(int zip) {
|
|
||||||
this.zip = zip;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCountry() {
|
|
||||||
return country;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCountry(String country) {
|
|
||||||
this.country = country;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Noorq, 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 casser.test.integration.core.usertype;
|
package casser.test.integration.core.usertype;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -7,24 +24,100 @@ import casser.core.Casser;
|
||||||
import casser.core.CasserSession;
|
import casser.core.CasserSession;
|
||||||
import casser.test.integration.build.AbstractEmbeddedCassandraTest;
|
import casser.test.integration.build.AbstractEmbeddedCassandraTest;
|
||||||
|
|
||||||
|
import com.datastax.driver.core.DataType;
|
||||||
|
import com.datastax.driver.core.KeyspaceMetadata;
|
||||||
|
import com.datastax.driver.core.ResultSet;
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
import com.datastax.driver.core.UserType;
|
||||||
|
import com.datastax.driver.core.querybuilder.QueryBuilder;
|
||||||
|
import com.datastax.driver.core.querybuilder.Select;
|
||||||
|
import com.datastax.driver.core.schemabuilder.Create;
|
||||||
|
import com.datastax.driver.core.schemabuilder.CreateType;
|
||||||
|
import com.datastax.driver.core.schemabuilder.SchemaBuilder;
|
||||||
|
|
||||||
public class UserDefinedTypeTest extends AbstractEmbeddedCassandraTest {
|
public class UserDefinedTypeTest extends AbstractEmbeddedCassandraTest {
|
||||||
|
|
||||||
Account account;
|
Account account;
|
||||||
|
|
||||||
CasserSession session;
|
CasserSession csession;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void beforeTest() {
|
public void beforeTest() {
|
||||||
|
|
||||||
account = Casser.dsl(Account.class);
|
account = Casser.dsl(Account.class);
|
||||||
|
|
||||||
//session = Casser.init(getSession()).showCql().add(Account.class).autoCreateDrop().get();
|
//csession = Casser.init(getSession()).showCql().add(Account.class).autoCreateDrop().get();
|
||||||
|
|
||||||
|
Session session = getSession();
|
||||||
|
|
||||||
|
|
||||||
|
CreateType ct = SchemaBuilder.createType("address");
|
||||||
|
ct.addColumn("street", DataType.text());
|
||||||
|
ct.addColumn("city", DataType.text());
|
||||||
|
ct.addColumn("zip_code", DataType.cint());
|
||||||
|
ct.addColumn("phones", DataType.set(DataType.text()));
|
||||||
|
String cql = ct.build();
|
||||||
|
|
||||||
|
System.out.println(cql);
|
||||||
|
|
||||||
|
//session.execute("CREATE TYPE address (street text, city text, zip_code int, phones set<text>)");
|
||||||
|
|
||||||
|
session.execute(cql);
|
||||||
|
|
||||||
|
|
||||||
|
ct = SchemaBuilder.createType("fullname");
|
||||||
|
ct.addColumn("firstname", DataType.text());
|
||||||
|
ct.addColumn("lastname", DataType.text());
|
||||||
|
cql = ct.build();
|
||||||
|
|
||||||
|
System.out.println(cql);
|
||||||
|
|
||||||
|
session.execute(cql);
|
||||||
|
|
||||||
|
//session.execute("CREATE TYPE fullname (firstname text,lastname text)");
|
||||||
|
|
||||||
|
System.out.println("keyspace = " + session.getLoggedKeyspace());
|
||||||
|
|
||||||
|
KeyspaceMetadata km = session.getCluster().getMetadata().getKeyspace(session.getLoggedKeyspace());
|
||||||
|
|
||||||
|
UserType address = km.getUserType("address");
|
||||||
|
UserType fullname = km.getUserType("fullname");
|
||||||
|
|
||||||
|
Create create = SchemaBuilder.createTable("users");
|
||||||
|
|
||||||
|
create.addPartitionKey("id", DataType.uuid());
|
||||||
|
create.addUDTColumn("name", SchemaBuilder.frozen("fullname"));
|
||||||
|
create.addUDTMapColumn("addresses", DataType.ascii(), SchemaBuilder.frozen("address"));
|
||||||
|
|
||||||
|
cql = create.buildInternal();
|
||||||
|
|
||||||
|
System.out.println(cql);
|
||||||
|
|
||||||
|
session.execute(create);
|
||||||
|
|
||||||
|
//session.execute("CREATE TABLE users (id uuid PRIMARY KEY, name fullname, "
|
||||||
|
// + "addresses map<string, address>)");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUDT() {
|
public void testUDT() {
|
||||||
|
|
||||||
System.out.println("test it");
|
|
||||||
|
|
||||||
|
Session session = getSession();
|
||||||
|
|
||||||
|
Select select = QueryBuilder.select().column("\"name\".\"lastname\"").from("users");
|
||||||
|
|
||||||
|
System.out.println(select);
|
||||||
|
|
||||||
|
ResultSet resultSet = session.execute("SELECT \"name\".\"lastname\" FROM users;");
|
||||||
|
|
||||||
|
System.out.println("resultSet = " + resultSet);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//csession.select(account.getAddress()::getStreet).sync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue