Adding Cassandra Mapping file reading
Project: http://git-wip-us.apache.org/repos/asf/gora/repo Commit: http://git-wip-us.apache.org/repos/asf/gora/commit/a7b99f83 Tree: http://git-wip-us.apache.org/repos/asf/gora/tree/a7b99f83 Diff: http://git-wip-us.apache.org/repos/asf/gora/diff/a7b99f83 Branch: refs/heads/master Commit: a7b99f83aaf385cbe6772a5a0c7843b65153ec57 Parents: cd3522a Author: madhawa-gunasekara <madha...@wso2.com> Authored: Thu Jun 22 15:36:48 2017 +0530 Committer: madhawa <madhaw...@gmail.com> Committed: Fri Jun 23 00:52:39 2017 +0530 ---------------------------------------------------------------------- gora-cassandra-cql/pom.xml | 47 +---- .../org/apache/gora/cassandra/bean/Field.java | 54 ++++++ .../apache/gora/cassandra/bean/KeySpace.java | 84 +++++++++ .../apache/gora/cassandra/bean/PrimaryKey.java | 7 + .../gora/cassandra/store/CassandraMapping.java | 60 +++++++ .../cassandra/store/CassandraQueryFactory.java | 58 ++++++ .../gora/cassandra/store/CassandraStore.java | 178 +++++++++++++++++-- .../apache/gora/cassandra/store/Constants.java | 75 ++++---- .../src/test/conf/gora-cassandra-mapping.xml | 78 ++++---- .../gora/cassandra/GoraCassandraTestDriver.java | 3 +- .../cassandra/store/TestCassandraStore.java | 9 +- 11 files changed, 514 insertions(+), 139 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/pom.xml ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/pom.xml b/gora-cassandra-cql/pom.xml index b17fd41..11da4fc 100644 --- a/gora-cassandra-cql/pom.xml +++ b/gora-cassandra-cql/pom.xml @@ -17,22 +17,6 @@ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You 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. - --> <modelVersion>4.0.0</modelVersion> <parent> @@ -65,6 +49,7 @@ </ciManagement> <properties> + <guava.version>17.0</guava.version> <osgi.import>*</osgi.import> <osgi.export>org.apache.gora.cassandra*;version="${project.version}";-noimport:=true</osgi.export> </properties> @@ -136,12 +121,12 @@ <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>${cassandra-driver.version}</version> - <exclusions> - <exclusion> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - </exclusion> - </exclusions> + </dependency> + + <dependency> + <groupId>com.datastax.cassandra</groupId> + <artifactId>cassandra-driver-mapping</artifactId> + <version>${cassandra-driver.version}</version> </dependency> <!-- Cassandra Dependencies --> @@ -165,26 +150,11 @@ </exclusions> </dependency> - <!-- dependency> - <groupId>org.apache.cassandra</groupId> - <artifactId>cassandra-thrift</artifactId> - </dependency--> - - <!--<dependency>--> - <!--<groupId>org.hectorclient</groupId>--> - <!--<artifactId>hector-core</artifactId>--> - <!--<exclusions>--> - <!--<exclusion>--> - <!--<groupId>org.apache.cassandra</groupId>--> - <!--<artifactId>cassandra-all</artifactId>--> - <!--</exclusion>--> - <!--</exclusions>--> - <!--</dependency>--> - <!-- Misc Dependencies --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> + <version>${guava.version}</version> </dependency> <dependency> @@ -192,7 +162,6 @@ <artifactId>jdom</artifactId> </dependency> - <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/Field.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/Field.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/Field.java new file mode 100644 index 0000000..2bd997f --- /dev/null +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/Field.java @@ -0,0 +1,54 @@ +package org.apache.gora.cassandra.bean; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by madhawa on 6/22/17. + */ +public class Field { + + private String fieldName; + + private String columnName; + + private String type; + + public Field() { + properties = new HashMap<>(2); + } + + private Map<String, String> properties; + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public void addProperty(String key, String value) { + properties.put(key, value); + } + + public String getFieldName() { + return fieldName; + } + + public String getColumnName() { + return columnName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getProperty(String key) { + return this.properties.get(key); + } +} http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/KeySpace.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/KeySpace.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/KeySpace.java new file mode 100644 index 0000000..af563da --- /dev/null +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/KeySpace.java @@ -0,0 +1,84 @@ +package org.apache.gora.cassandra.bean; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This class represents the Cassandra Keyspace. + */ +public class KeySpace { + public String getName() { + return name; + } + + public boolean isDurableWritesEnabled() { + return durableWritesEnabled; + } + + public PlacementStrategy getPlacementStrategy() { + return placementStrategy; + } + + public int getReplicationFactor() { + return replicationFactor; + } + + public Map<String, Integer> getDataCenters() { + return dataCenters; + } + + public void addDataCenter(String key, Integer value) { + this.dataCenters.put(key, value); + } + + private String name; + + private Map<String, String> properties; + + private boolean durableWritesEnabled; + + public KeySpace() { + this.properties = new HashMap<>(); + } + + public enum PlacementStrategy { + SimpleStrategy, + NetworkTopologyStrategy, + } + + public void setPlacementStrategy(PlacementStrategy placementStrategy) { + this.placementStrategy = placementStrategy; + if(placementStrategy.equals(PlacementStrategy.NetworkTopologyStrategy) && this.dataCenters == null) { + this.dataCenters = new HashMap<>(); + } + } + + private PlacementStrategy placementStrategy; + + public void setReplicationFactor(int replicationFactor) { + this.replicationFactor = replicationFactor; + } + + private int replicationFactor; + + private Map<String, Integer> dataCenters; + + private List<String> tables; + + public void addProperty(String key, String value) { + this.properties.put(key, value); + } + + public String getProperty(String key) { + return this.properties.get(key); + } + + public void setName(String name) { + this.name = name; + } + + public void setDurableWritesEnabled(boolean durableWritesEnabled) { + this.durableWritesEnabled = durableWritesEnabled; + } +} http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/PrimaryKey.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/PrimaryKey.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/PrimaryKey.java new file mode 100644 index 0000000..d3477f2 --- /dev/null +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/bean/PrimaryKey.java @@ -0,0 +1,7 @@ +package org.apache.gora.cassandra.bean; + +/** + * Created by madhawa on 6/22/17. + */ +public class PrimaryKey { +} http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java new file mode 100644 index 0000000..e533d57 --- /dev/null +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java @@ -0,0 +1,60 @@ +package org.apache.gora.cassandra.store; + +import org.apache.gora.cassandra.bean.Field; +import org.apache.gora.cassandra.bean.KeySpace; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by madhawa on 6/22/17. + */ +public class CassandraMapping { + + public KeySpace getKeySpace() { + return keySpace; + } + + public void setKeySpace(KeySpace keySpace) { + this.keySpace = keySpace; + } + + private KeySpace keySpace; + + public List<Field> getFieldList() { + return fieldList; + } + + private List<Field> fieldList; + + private Map<String, String> tableProperties; + + public CassandraMapping() { + this.fieldList = new ArrayList<>(); + this.tableProperties = new HashMap<>(); + } + + public void setCoreName(String coreName) { + this.coreName = coreName; + } + + public String getCoreName() { + return coreName; + } + + private String coreName; + + public void addCassandraField(Field field) { + this.fieldList.add(field); + } + + public void addProperty(String key, String value) { + this.tableProperties.put(key,value); + } + + public String getProperty(String key) { + return this.tableProperties.get(key); + } +} http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraQueryFactory.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraQueryFactory.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraQueryFactory.java new file mode 100644 index 0000000..e70eaee --- /dev/null +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraQueryFactory.java @@ -0,0 +1,58 @@ +package org.apache.gora.cassandra.store; + +import org.apache.gora.cassandra.bean.Field; +import org.apache.gora.cassandra.bean.KeySpace; + +import java.util.Map; + +class CassandraQueryFactory { + + static String getCreateKeySpaceQuery(CassandraMapping mapping) { + KeySpace keySpace = mapping.getKeySpace(); + StringBuilder stringBuffer = new StringBuilder(); + stringBuffer.append("CREATE KEYSPACE ").append(keySpace.getName()).append(" WITH REPLICATION = { 'class' : "); + KeySpace.PlacementStrategy placementStrategy = keySpace.getPlacementStrategy(); + stringBuffer.append("'").append(placementStrategy).append("'").append(", ").append("'"); + switch (placementStrategy) { + case SimpleStrategy: + stringBuffer.append("replication_factor").append("'").append(" : ").append(keySpace.getReplicationFactor()).append(" }"); + break; + case NetworkTopologyStrategy: + boolean isCommaNeeded = false; + for (Map.Entry<String, Integer> entry : keySpace.getDataCenters().entrySet()) { + if (isCommaNeeded) { + stringBuffer.append(", '"); + } + stringBuffer.append(entry.getKey()).append("'").append(" : ").append(entry.getValue()); + isCommaNeeded = true; + } + stringBuffer.append(" }"); + break; + } + + if(keySpace.isDurableWritesEnabled()) { + stringBuffer.append(" AND DURABLE_WRITES = ").append(keySpace.isDurableWritesEnabled()); + } + return stringBuffer.toString(); + } + + static String getCreateTableQuery(CassandraMapping mapping) { + StringBuilder stringBuffer = new StringBuilder(); +stringBuffer.append("CREATE TABLE ").append(mapping.getCoreName()).append(" ("); + boolean isCommaNeeded = false; + for(Field field : mapping.getFieldList()) { + if(isCommaNeeded) { + stringBuffer.append(", "); + } + stringBuffer.append(field.getColumnName()).append(" ").append(field.getType()); + boolean isStaticColumn = Boolean.parseBoolean(field.getProperty("static")); + if( isStaticColumn) { + stringBuffer.append(" STATIC"); + } + isCommaNeeded =true; + } + + return stringBuffer.toString(); + } + +} http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java index b4c6e68..4bd1ad3 100644 --- a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java @@ -17,15 +17,24 @@ package org.apache.gora.cassandra.store; +import com.datastax.driver.mapping.Mapper; +import com.datastax.driver.mapping.MappingManager; import com.datastax.driver.core.*; import com.datastax.driver.core.policies.*; +import org.apache.gora.cassandra.bean.Field; +import org.apache.gora.cassandra.bean.KeySpace; import org.apache.gora.persistency.BeanFactory; import org.apache.gora.persistency.impl.PersistentBase; import org.apache.gora.query.PartitionQuery; import org.apache.gora.query.Query; import org.apache.gora.query.Result; +import org.apache.gora.store.DataStoreFactory; import org.apache.gora.store.impl.DataStoreBase; import org.apache.hadoop.conf.Configuration; +import org.jdom.Attribute; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.input.SAXBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,25 +46,18 @@ import java.util.Properties; public class CassandraStore<K, T extends PersistentBase> extends DataStoreBase<K, T> { - /** - * Consistency property level for Cassandra column families - */ - private static final String COL_FAM_CL = "cf.consistency.level"; - - /** - * Consistency property level for Cassandra read operations. - */ - private static final String READ_OP_CL = "read.consistency.level"; - - /** - * Consistency property level for Cassandra write operations. - */ - private static final String WRITE_OP_CL = "write.consistency.level"; + private static final String DEFAULT_MAPPING_FILE = "gora-cassandra-mapping.xml"; public static final Logger LOG = LoggerFactory.getLogger(CassandraStore.class); private Cluster cluster; + private CassandraMapping mapping; + + private boolean isUseCassandraMappingManager; + + private Mapper<T> mapper; + private Session session; public CassandraStore() { @@ -67,10 +69,19 @@ public class CassandraStore<K, T extends PersistentBase> extends DataStoreBase<K LOG.debug("Initializing Cassandra store"); super.initialize(keyClass, persistentClass, properties); try { + String mappingFile = DataStoreFactory.getMappingFile(properties, this, + DEFAULT_MAPPING_FILE); + mapping = readMapping(mappingFile); + isUseCassandraMappingManager = Boolean.parseBoolean(properties.getProperty(Constants.USE_CASSANDRA_MAPPING_MANAGER)); Cluster.Builder builder = Cluster.builder(); populateSettings(builder, properties); this.cluster = builder.build(); this.session = this.cluster.connect(); + if (isUseCassandraMappingManager) { + MappingManager mappingManager = new MappingManager(session); + mapper = mappingManager.mapper(persistentClass); + } + } catch (Exception e) { LOG.error("Error while initializing Cassandra store: {}", new Object[]{e.getMessage()}); @@ -78,6 +89,126 @@ public class CassandraStore<K, T extends PersistentBase> extends DataStoreBase<K } } + private CassandraMapping readMapping(String filename) throws IOException { + CassandraMapping map = new CassandraMapping(); + try { + SAXBuilder builder = new SAXBuilder(); + Document doc = builder.build(getClass().getClassLoader() + .getResourceAsStream(filename)); + + List<Element> keyspaces = doc.getRootElement().getChildren("keyspace"); + + List<Element> classes = doc.getRootElement().getChildren("class"); + + boolean classMatched = false; + for (Element classElement : classes) { + if (classElement.getAttributeValue("keyClass").equals( + keyClass.getCanonicalName()) + && classElement.getAttributeValue("name").equals( + persistentClass.getCanonicalName())) { + + classMatched = true; + String tableName = getSchemaName( + classElement.getAttributeValue("table"), persistentClass); + map.setCoreName(tableName); + + List classAttributes = classElement.getAttributes(); + for (Object anAttributeList : classAttributes) { + Attribute attribute = (Attribute) anAttributeList; + String attributeName = attribute.getName(); + String attributeValue = attribute.getValue(); + map.addProperty(attributeName, attributeValue); + } + + List<Element> fields = classElement.getChildren("field"); + + for (Element field : fields) { + Field cassandraField = new Field(); + + List fieldAttributes = field.getAttributes(); + for (Object anAttributeList : fieldAttributes) { + Attribute attribute = (Attribute) anAttributeList; + String attributeName = attribute.getName(); + String attributeValue = attribute.getValue(); + switch (attributeName) { + case "name": + cassandraField.setFieldName(attributeValue); + break; + case "column": + cassandraField.setColumnName(attributeValue); + break; + default: + cassandraField.addProperty(attributeName, attributeValue); + break; + } + } + map.addCassandraField(cassandraField); + } + break; + } + LOG.warn("Check that 'keyClass' and 'name' parameters in gora-solr-mapping.xml " + + "match with intended values. A mapping mismatch has been found therefore " + + "no mapping has been initialized for class mapping at position " + + " {} in mapping file.", classes.indexOf(classElement)); + } + if (!classMatched) { + LOG.error("Check that 'keyClass' and 'name' parameters in {} no mapping has been initialized for {} class mapping", filename, persistentClass); + } + + String keyspaceName = map.getProperty("keyspace"); + if (keyspaceName != null) { + KeySpace keyspace = null; + for (Element keyspaceElement : keyspaces) { + if (keyspaceName.equals(keyspaceElement.getAttributeValue("name"))) { + keyspace = new KeySpace(); + List fieldAttributes = keyspaceElement.getAttributes(); + for (Object attributeObject : fieldAttributes) { + Attribute attribute = (Attribute) attributeObject; + String attributeName = attribute.getName(); + String attributeValue = attribute.getValue(); + switch (attributeName) { + case "name": + keyspace.setName(attributeValue); + break; + case "durableWrite": + keyspace.setDurableWritesEnabled(Boolean.parseBoolean(attributeValue)); + break; + default: + keyspace.addProperty(attributeName, attributeValue); + break; + } + } + Element placementStrategy = keyspaceElement.getChild("placementStrategy"); + switch (KeySpace.PlacementStrategy.valueOf(placementStrategy.getAttributeValue("name"))) { + case SimpleStrategy: + keyspace.setPlacementStrategy(KeySpace.PlacementStrategy.SimpleStrategy); + keyspace.setReplicationFactor(Integer.parseInt(placementStrategy.getAttributeValue("replication_factor"))); + break; + case NetworkTopologyStrategy: + List<Element> dataCenters = placementStrategy.getChildren("datacenter"); + keyspace.setPlacementStrategy(KeySpace.PlacementStrategy.NetworkTopologyStrategy); + for(Element dataCenter : dataCenters) { + String dataCenterName = dataCenter.getAttributeValue("name"); + Integer dataCenterReplicationFactor = Integer.valueOf(dataCenter.getAttributeValue("replication_factor")); + keyspace.addDataCenter(dataCenterName, dataCenterReplicationFactor); + } + break; + } + map.setKeySpace(keyspace); + break; + } + + } + + } + + } catch (Exception ex) { + throw new IOException(ex); + } + + return map; + } + private void populateSettings(Cluster.Builder builder, Properties properties) { String serversParam = properties.getProperty(Constants.CASSANDRA_SERVERS); String[] servers = serversParam.split(","); @@ -416,7 +547,11 @@ public class CassandraStore<K, T extends PersistentBase> extends DataStoreBase<K @Override public T get(K key) { - return super.get(key); + if (isUseCassandraMappingManager) { + return mapper.get(key); + } else { + return super.get(key); + } } @Override @@ -426,12 +561,21 @@ public class CassandraStore<K, T extends PersistentBase> extends DataStoreBase<K @Override public void put(K key, T obj) { - + if (isUseCassandraMappingManager) { + mapper.save(obj); + } else { + super.get(key); + } } @Override public boolean delete(K key) { - return false; + if (isUseCassandraMappingManager) { + mapper.delete(key); + return true; + } else { + return false; + } } @Override http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java index d90a24b..c79301a 100644 --- a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java +++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java @@ -20,81 +20,82 @@ package org.apache.gora.cassandra.store; public class Constants { /* string (multiple values with comma separated) */ - public static final String CASSANDRA_SERVERS = "gora.cassandrastore.cassandraServers"; + public static final String CASSANDRA_SERVERS = "gora.cassandra.store.cassandraServers"; /* string */ - public static final String KEYSPACE = "gora.cassandrastore.keyspace"; + public static final String KEYSPACE = "gora.cassandra.store.keyspace"; /* integer */ - public static final String PORT = "gora.cassandrastore.port"; + public static final String PORT = "gora.cassandra.store.port"; /* string */ - public static final String CLUSTER_NAME = "gora.cassandrastore.clusterName"; + public static final String CLUSTER_NAME = "gora.cassandra.store.clusterName"; /* "LZ4", "SNAPPY", "NONE" */ - public static final String COMPRESSION = "gora.cassandrastore.compression"; + public static final String COMPRESSION = "gora.cassandra.store.compression"; /* string */ - public static final String USERNAME = "gora.cassandrastore.username"; + public static final String USERNAME = "gora.cassandra.store.username"; /* string */ - public static final String PASSWORD = "gora.cassandrastore.password"; + public static final String PASSWORD = "gora.cassandra.store.password"; /* "RoundRobinPolicy", "LatencyAwareRoundRobinPolicy", "TokenAwareRoundRobinPolicy" */ - public static final String LOAD_BALANCING_POLICY = "gora.cassandrastore.loadBalancingPolicy"; + public static final String LOAD_BALANCING_POLICY = "gora.cassandra.store.loadBalancingPolicy"; /* boolean */ - public static final String ENABLE_JMX_REPORTING = "gora.cassandrastore.enableJMXReporting"; + public static final String ENABLE_JMX_REPORTING = "gora.cassandra.store.enableJMXReporting"; /* boolean */ - public static final String ENABLE_METRICS = "gora.cassandrastore.enableMetrics"; + public static final String ENABLE_METRICS = "gora.cassandra.store.enableMetrics"; /* inter */ - public static final String LOCAL_CORE_CONNECTIONS_PER_HOST = "gora.cassandrastore.localCoreConnectionsPerHost"; + public static final String LOCAL_CORE_CONNECTIONS_PER_HOST = "gora.cassandra.store.localCoreConnectionsPerHost"; /* integer */ - public static final String REMOTE_CORE_CONNECTIONS_PER_HOST = "gora.cassandrastore.remoteCoreConnectionsPerHost"; + public static final String REMOTE_CORE_CONNECTIONS_PER_HOST = "gora.cassandra.store.remoteCoreConnectionsPerHost"; /* integer */ - public static final String LOCAL_MAX_CONNECTIONS_PER_HOST = "gora.cassandrastore.localMaxConnectionsPerHost"; + public static final String LOCAL_MAX_CONNECTIONS_PER_HOST = "gora.cassandra.store.localMaxConnectionsPerHost"; /* integer */ - public static final String REMOTE_MAX_CONNECTIONS_PER_HOST = "gora.cassandrastore.remoteMaxConnectionsPerHost"; + public static final String REMOTE_MAX_CONNECTIONS_PER_HOST = "gora.cassandra.store.remoteMaxConnectionsPerHost"; /* integer */ - public static final String LOCAL_NEW_CONNECTION_THRESHOLD= "gora.cassandrastore.localNewConnectionThreshold"; + public static final String LOCAL_NEW_CONNECTION_THRESHOLD= "gora.cassandra.store.localNewConnectionThreshold"; /* integer */ - public static final String REMOTE_NEW_CONNECTION_THRESHOLD = "gora.cassandrastore.remoteNewConnectionThreshold"; + public static final String REMOTE_NEW_CONNECTION_THRESHOLD = "gora.cassandra.store.remoteNewConnectionThreshold"; /* integer */ - public static final String LOCAL_MAX_REQUESTS_PER_CONNECTION = "gora.cassandrastore.localMaxRequestsPerConnection"; + public static final String LOCAL_MAX_REQUESTS_PER_CONNECTION = "gora.cassandra.store.localMaxRequestsPerConnection"; /* integer */ - public static final String REMOTE_MAX_REQUESTS_PER_CONNECTION = "gora.cassandrastore.remoteMaxRequestsPerConnection"; + public static final String REMOTE_MAX_REQUESTS_PER_CONNECTION = "gora.cassandra.store.remoteMaxRequestsPerConnection"; /* integer */ - public static final String PROTOCOL_VERSION = "gora.cassandrastore.protocolVersion"; + public static final String PROTOCOL_VERSION = "gora.cassandra.store.protocolVersion"; /* "ALL", "ANY", "EACH_QUORUM", "LOCAL_ONE", "LOCAL_QUORUM", "LOCAL_SERIAL", "ONE", "QUORUM", "SERIAL", "THREE", "TWO" */ - public static final String CONSISTENCY_LEVEL = "gora.cassandrastore.consistencyLevel"; + public static final String CONSISTENCY_LEVEL = "gora.cassandra.store.consistencyLevel"; /* integer */ public static final String FETCH_SIZE = "fetchSize"; /* "ALL", "ANY", "EACH_QUORUM", "LOCAL_ONE", "LOCAL_QUORUM", "LOCAL_SERIAL", "ONE", "QUORUM", "SERIAL", "THREE", "TWO" */ - public static final String SERIAL_CONSISTENCY_LEVEL = "gora.cassandrastore.serialConsistencyLevel"; + public static final String SERIAL_CONSISTENCY_LEVEL = "gora.cassandra.store.serialConsistencyLevel"; /* "ConstantReconnectionPolicy", "ExponentialReconnectionPolicy", */ - public static final String RECONNECTION_POLICY = "gora.cassandrastore.reconnectionPolicy"; + public static final String RECONNECTION_POLICY = "gora.cassandra.store.reconnectionPolicy"; /* long */ - public static final String CONSTANT_RECONNECTION_POLICY_DELAY = "gora.cassandrastore.constantReconnectionPolicyDelay"; + public static final String CONSTANT_RECONNECTION_POLICY_DELAY = "gora.cassandra.store.constantReconnectionPolicyDelay"; /* long */ - public static final String EXPONENTIAL_RECONNECTION_POLICY_BASE_DELAY = "gora.cassandrastore.exponentialReconnectionPolicyBaseDelay"; + public static final String EXPONENTIAL_RECONNECTION_POLICY_BASE_DELAY = "gora.cassandra.store.exponentialReconnectionPolicyBaseDelay"; /* long */ - public static final String EXPONENTIAL_RECONNECTION_POLICY_MAX_DELAY = "gora.cassandrastore.exponentialReconnectionPolicyMaxDelay"; + public static final String EXPONENTIAL_RECONNECTION_POLICY_MAX_DELAY = "gora.cassandra.store.exponentialReconnectionPolicyMaxDelay"; /* "DefaultRetryPolicy", "DowngradingConsistencyRetryPolicy", "FallthroughRetryPolicy", * "LoggingDefaultRetryPolicy", "LoggingDowngradingConsistencyRetryPolicy", "LoggingFallthroughRetryPolicy" */ - public static final String RETRY_POLICY = "gora.cassandrastore.retryPolicy"; + public static final String RETRY_POLICY = "gora.cassandra.store.retryPolicy"; /* integer */ - public static final String CONNECTION_TIMEOUT_MILLIS = "gora.cassandrastore.connectionTimeoutMillis"; + public static final String CONNECTION_TIMEOUT_MILLIS = "gora.cassandra.store.connectionTimeoutMillis"; /* boolean */ - public static final String KEEP_ALIVE = "gora.cassandrastore.keepAlive"; + public static final String KEEP_ALIVE = "gora.cassandra.store.keepAlive"; /* integer */ - public static final String READ_TIMEOUT_MILLIS = "gora.cassandrastore.readTimeoutMillis"; + public static final String READ_TIMEOUT_MILLIS = "gora.cassandra.store.readTimeoutMillis"; /* integer */ - public static final String RECEIVER_BUFFER_SIZE = "gora.cassandrastore.receiverBufferSize"; + public static final String RECEIVER_BUFFER_SIZE = "gora.cassandra.store.receiverBufferSize"; /* boolean */ - public static final String REUSE_ADDRESS = "gora.cassandrastore.reuseAddress"; + public static final String REUSE_ADDRESS = "gora.cassandra.store.reuseAddress"; /* integer */ - public static final String SEND_BUFFER_SIZE = "gora.cassandrastore.sendBufferSize"; + public static final String SEND_BUFFER_SIZE = "gora.cassandra.store.sendBufferSize"; /* integer */ - public static final String SO_LINGER = "gora.cassandrastore.soLinger"; + public static final String SO_LINGER = "gora.cassandra.store.soLinger"; /* boolean */ - public static final String TCP_NODELAY = "gora.cassandrastore.tcpNoDelay"; + public static final String TCP_NODELAY = "gora.cassandra.store.tcpNoDelay"; /* boolean */ - public static final String ENABLE_SSL = "gora.cassandrastore.enableSSL"; + public static final String ENABLE_SSL = "gora.cassandra.store.enableSSL"; /* string */ - public static final String DATA_CENTER = "gora.cassandrastore.dataCenter"; + public static final String DATA_CENTER = "gora.cassandra.store.dataCenter"; /* boolean */ - public static final String ALLOW_REMOTE_DCS_FOR_LOCAL_CONSISTENCY_LEVEL = "gora.cassandrastore.allowRemoteDCsForLocalConsistencyLevel"; + public static final String ALLOW_REMOTE_DCS_FOR_LOCAL_CONSISTENCY_LEVEL = "gora.cassandra.store.allowRemoteDCsForLocalConsistencyLevel"; + public static final String USE_CASSANDRA_MAPPING_MANAGER = "gora.cassandra.store.useCassandraMappingManager"; } http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml b/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml index 460063f..b039638 100644 --- a/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml +++ b/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml @@ -49,47 +49,49 @@ at http://gora.apache.org/current/gora-cassandra.html --> -<gora-otd> - <keyspace name="Employee" host="localhost:9160" placement_strategy="org.apache.cassandra.locator.SimpleStrategy" - replication_factor="1" cluster="Gora Cassandra Test Cluster"> - <family name="p" gc_grace_seconds="5"/> - <family name="sc" type="super" /> - </keyspace> - <keyspace name="WebPage" host="localhost:9160" placement_strategy="org.apache.cassandra.locator.SimpleStrategy" - replication_factor="1" cluster="Gora Cassandra Test Cluster"> - <family name="p" gc_grace_seconds="5"/> - <family name="sc" type="super"/> - </keyspace> +<gora-otd> + <keyspace name="EmployeeSpace" durableWrite="false"> + <placementStrategy name="SimpleStrategy" replication_factor="1"/> + </keyspace> - <keyspace name="TokenDatum" host="localhost:9160" placement_strategy="org.apache.cassandra.locator.SimpleStrategy" - replication_factor="1" cluster="Gora Cassandra Test Cluster"> - <family name="p" gc_grace_seconds="5"/> - <family name="sc" type="super"/> - </keyspace> + <keyspace name="WebPage" durableWrite="true"> + <placementStrategy name="NetworkTopologyStrategy"> + <datacenter name="dc1" replication_factor="1"/> + <datacenter name="dc2" replication_factor="1"/> + </placementStrategy> + </keyspace> - <class name="org.apache.gora.examples.generated.Employee" keyClass="java.lang.String" keyspace="Employee"> - <field name="name" family="p" qualifier="info:nm" ttl="10"/> - <field name="dateOfBirth" family="p" qualifier="info:db" ttl="10"/> - <field name="ssn" family="p" qualifier="info:sn" ttl="10"/> - <field name="salary" family="p" qualifier="info:sl" ttl="10"/> - <field name="boss" family="p" qualifier="info:bs" ttl="10"/> - <field name="webpage" family="p" qualifier="info:wp" ttl="10"/> - </class> + <class name="org.apache.gora.examples.generated.Employee1" keyClass="java.lang.String" keyspace="EmployeeSpace" + table="Employee" compactStorage="true" id="31323131"> + <field name="lname" column="name" type="text" ttl="10" static="true"/> + <field name="fname" column="name" type="text" ttl="10"/> + <field name="srilankan" column="srilankan" type="boolean" ttl="10"/> + <field name="age" column="srilankan" type="int" ttl="10"/> + <field name="id" column="srilankan" type="uuid" ttl="10"/> + </class> - <class name="org.apache.gora.examples.generated.WebPage" keyClass="java.lang.String" keyspace="WebPage"> - <field name="url" family="p" qualifier="c:u" ttl="10"/> - <field name="content" family="p" qualifier="p:cnt:c" ttl="10"/> - <field name="parsedContent" family="sc" qualifier="p:parsedContent" ttl="10"/> - <field name="outlinks" family="sc" qualifier="p:outlinks" ttl="10"/> - <field name="headers" family="sc" qualifier="p:headers" ttl="10"/> - <field name="metadata" family="p" qualifier="c:mt" ttl="10"/> - <field name="byteData" family="sc" qualifier="p:byteData" ttl="10"/> - <field name="stringData" family="sc" qualifier="p:stringData" ttl="10"/> - </class> + <class name="org.apache.gora.examples.generated.Employee" keyClass="org.apache.gora.examples.generated.SensorKey" keyspace="WebPage" + compactStorage="true" id="31323131"> + <field name="lname" column="name" type="text" ttl="10" primarykey="true"/> + <field name="fname" column="name" type="text" ttl="10"/> + <field name="srilankan" column="srilankan" type="boolean" ttl="10"/> + <field name="age" column="srilankan" type="int" ttl="10"/> + <field name="id" column="srilankan" type="uuid" ttl="10"/> + </class> - <class name="org.apache.gora.examples.generated.TokenDatum" keyClass="java.lang.String" keyspace="TokenDatum"> - <field name="count" family="p" qualifier="common:count" ttl="10"/> - </class> + <cassandraKey name="org.apache.gora.examples.generated.SensorKey"> + <partitionKey> + <field composite="true"> + <column name="id" type=""/> + <column name="name" type=""/> + </field> + <field name="sensorId" type="UTF8Type"/> + <field name="year" type="IntegerType"/> + </partitionKey> + <clusterKey> + <field name="date" type="LongType" order="desc"/> + </clusterKey> + </cassandraKey> -</gora-otd> +</gora-otd> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java index b36aca4..ccb9b97 100644 --- a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java +++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java @@ -40,8 +40,7 @@ import org.slf4j.LoggerFactory; * This driver is the base for all test cases that require an embedded Cassandra * server. In this case we draw on Hector's @see EmbeddedServerHelper. * It starts (setUp) and stops (tearDown) embedded Cassandra server. - * - * @author lewismc + * */ public class GoraCassandraTestDriver extends GoraTestDriver { http://git-wip-us.apache.org/repos/asf/gora/blob/a7b99f83/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java index 9518891..44c54b9 100644 --- a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java +++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java @@ -23,18 +23,14 @@ */ package org.apache.gora.cassandra.store; -import java.io.IOException; - import org.apache.gora.cassandra.GoraCassandraTestDriver; -import org.apache.gora.examples.generated.Employee; -import org.apache.gora.examples.generated.WebPage; -import org.apache.gora.store.DataStore; -import org.apache.gora.store.DataStoreFactory; import org.apache.gora.store.DataStoreTestBase; import org.apache.hadoop.conf.Configuration; import org.junit.Before; import org.junit.Ignore; +import java.io.IOException; + /** * Test for CassandraStore. */ @@ -42,6 +38,7 @@ public class TestCassandraStore extends DataStoreTestBase{ private Configuration conf; + static { setTestDriver(new GoraCassandraTestDriver()); }