Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id DB109200497 for ; Wed, 23 Aug 2017 22:55:03 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id D9B29169AA6; Wed, 23 Aug 2017 20:55:03 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 9850B169AA1 for ; Wed, 23 Aug 2017 22:55:02 +0200 (CEST) Received: (qmail 57491 invoked by uid 500); 23 Aug 2017 20:55:01 -0000 Mailing-List: contact commits-help@gora.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@gora.apache.org Delivered-To: mailing list commits@gora.apache.org Received: (qmail 56911 invoked by uid 99); 23 Aug 2017 20:55:01 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 23 Aug 2017 20:55:00 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7D13CF5EFB; Wed, 23 Aug 2017 20:54:59 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: lewismc@apache.org To: commits@gora.apache.org Date: Wed, 23 Aug 2017 20:55:07 -0000 Message-Id: <4ca562fc8758487a95512dc902f27ef3@git.apache.org> In-Reply-To: <82e06533fe704bfdb7827a835514d66c@git.apache.org> References: <82e06533fe704bfdb7827a835514d66c@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [09/37] gora git commit: Add tests for schemaExists and truncateSchema methods archived-at: Wed, 23 Aug 2017 20:55:04 -0000 Add tests for schemaExists and truncateSchema methods Project: http://git-wip-us.apache.org/repos/asf/gora/repo Commit: http://git-wip-us.apache.org/repos/asf/gora/commit/89109b85 Tree: http://git-wip-us.apache.org/repos/asf/gora/tree/89109b85 Diff: http://git-wip-us.apache.org/repos/asf/gora/diff/89109b85 Branch: refs/heads/master Commit: 89109b855537050f5b9d125a88d26ca2c1d12f78 Parents: 2695794 Author: madhawa Authored: Sun Jun 25 02:35:02 2017 +0530 Committer: madhawa Committed: Sun Jun 25 02:41:37 2017 +0530 ---------------------------------------------------------------------- .../cassandra/store/CassandraQueryFactory.java | 146 ++++++++++++++++++- .../gora/cassandra/store/CassandraStore.java | 31 ++-- .../compositeKey/gora-cassandra-mapping.xml | 78 ++++++++++ ...stCassandraStoreWithNativeSerialization.java | 34 ++++- 4 files changed, 272 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/gora/blob/89109b85/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 index 422fbc6..fc90c5f 100644 --- 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 @@ -16,9 +16,13 @@ */ package org.apache.gora.cassandra.store; +import org.apache.gora.cassandra.bean.CassandraKey; +import org.apache.gora.cassandra.bean.ClusterKeyField; import org.apache.gora.cassandra.bean.Field; import org.apache.gora.cassandra.bean.KeySpace; +import org.apache.gora.cassandra.bean.PartitionKeyField; +import java.util.List; import java.util.Map; /** @@ -26,6 +30,13 @@ import java.util.Map; */ class CassandraQueryFactory { + /** + * This method returns the CQL query to create key space. + * refer : http://docs.datastax.com/en/cql/3.1/cql/cql_reference/create_keyspace_r.html + * + * @param mapping Cassandra Mapping + * @return CQL Query + */ static String getCreateKeySpaceQuery(CassandraMapping mapping) { KeySpace keySpace = mapping.getKeySpace(); StringBuilder stringBuffer = new StringBuilder(); @@ -59,6 +70,25 @@ class CassandraQueryFactory { StringBuilder stringBuffer = new StringBuilder(); stringBuffer.append("CREATE TABLE IF NOT EXISTS ").append(mapping.getKeySpace().getName()).append(".").append(mapping.getCoreName()).append(" ("); boolean isCommaNeeded = false; + CassandraKey cassandraKey = mapping.getCassandraKey(); + // appending Cassandra key columns into db schema + if (cassandraKey != null) { + for (PartitionKeyField partitionKeyField : cassandraKey.getPartitionKeyFields()) { + if (partitionKeyField.isComposite()) { + for (Field compositeField : partitionKeyField.getFields()) { + stringBuffer = processFields(stringBuffer, compositeField, isCommaNeeded); + } + + } else { + stringBuffer = processFields(stringBuffer, partitionKeyField, isCommaNeeded); + } + isCommaNeeded = true; + } + for (ClusterKeyField clusterKeyField : cassandraKey.getClusterKeyFields()) { + stringBuffer = processFields(stringBuffer, clusterKeyField, isCommaNeeded); + } + } + // appending Other columns for (Field field : mapping.getFieldList()) { if (isCommaNeeded) { stringBuffer.append(", "); @@ -69,22 +99,126 @@ class CassandraQueryFactory { if (isStaticColumn) { stringBuffer.append(" STATIC"); } - if(isPrimaryKey) { + if (isPrimaryKey) { stringBuffer.append(" PRIMARY KEY "); } isCommaNeeded = true; } + if (cassandraKey != null) { + List pkey = cassandraKey.getPartitionKeyFields(); + if (pkey != null) { + stringBuffer.append(", PRIMARY KEY ("); + boolean isCommaNeededToApply = false; + for (PartitionKeyField keyField : pkey) { + if (isCommaNeededToApply) { + stringBuffer.append(","); + } + if (keyField.isComposite()) { + stringBuffer.append("("); + boolean isCommaNeededHere = false; + for (Field field : keyField.getFields()) { + if (isCommaNeededHere) { + stringBuffer.append(", "); + } + stringBuffer.append(field.getColumnName()); + isCommaNeededHere = true; + } + stringBuffer.append(")"); + } else { + stringBuffer.append(keyField.getColumnName()); + } + isCommaNeededToApply = true; + } + stringBuffer.append(")"); + } + } + stringBuffer.append(")"); - if(Boolean.parseBoolean(mapping.getProperty("compactStorage"))) { + boolean isWithNeeded = true; + if (Boolean.parseBoolean(mapping.getProperty("compactStorage"))) { stringBuffer.append(" WITH COMPACT STORAGE "); - } else { - String id = mapping.getProperty("id"); - if (id != null) { - stringBuffer.append(" WITH ID = '").append(id).append("'"); + isWithNeeded = false; + } + + String id = mapping.getProperty("id"); + if (id != null) { + if (isWithNeeded) { + stringBuffer.append(" WITH "); + } else { + stringBuffer.append(" AND "); + } + stringBuffer.append("ID = '").append(id).append("'"); + isWithNeeded = false; + } + if (cassandraKey != null) { + List clusterKeyFields = cassandraKey.getClusterKeyFields(); + if (clusterKeyFields != null) { + if (isWithNeeded) { + stringBuffer.append(" WITH "); + } else { + stringBuffer.append(" AND "); + } + stringBuffer.append(" CLUSTERING ORDER BY ("); + boolean isCommaNeededToApply = false; + for (ClusterKeyField keyField : clusterKeyFields) { + if (isCommaNeededToApply) { + stringBuffer.append(", "); + } + stringBuffer.append(keyField.getColumnName()).append(" "); + if (keyField.getOrder() != null) { + stringBuffer.append(keyField.getOrder()); + } + isCommaNeededToApply = true; + } + stringBuffer.append(")"); } } return stringBuffer.toString(); } + private static StringBuilder processFields(StringBuilder stringBuilder, Field field, boolean isCommaNeeded) { + if (isCommaNeeded) { + stringBuilder.append(", "); + } + stringBuilder.append(field.getColumnName()).append(" ").append(field.getType()); + boolean isStaticColumn = Boolean.parseBoolean(field.getProperty("static")); + if (isStaticColumn) { + stringBuilder.append(" STATIC"); + } + return stringBuilder; + } + + /** + * This method returns the CQL query to drop table. + * refer : http://docs.datastax.com/en/cql/3.1/cql/cql_reference/drop_table_r.html + * + * @param mapping Cassandra Mapping + * @return CQL query + */ + static String getDropTableQuery(CassandraMapping mapping) { + return "DROP TABLE IF EXISTS " + mapping.getKeySpace().getName() + "." + mapping.getCoreName(); + } + + /** + * This method returns the CQL query to drop key space. + * refer : http://docs.datastax.com/en/cql/3.1/cql/cql_reference/drop_keyspace_r.html + * + * @param mapping Cassandra Mapping + * @return CQL query + */ + static String getDropKeySpaceQuery(CassandraMapping mapping) { + return "DROP KEYSPACE IF EXISTS " + mapping.getKeySpace().getName(); + } + + /** + * This method returns the CQL query to truncate (removes all the data) in the table. + * refer : http://docs.datastax.com/en/cql/3.1/cql/cql_reference/truncate_r.html + * + * @param mapping Cassandra Mapping + * @return CQL query + */ + static String getTruncateTableQuery(CassandraMapping mapping) { + return "TRUNCATE TABLE " + mapping.getKeySpace().getName() + "." + mapping.getCoreName(); + } } http://git-wip-us.apache.org/repos/asf/gora/blob/89109b85/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 fad0fd4..113d0c4 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 @@ -20,12 +20,14 @@ package org.apache.gora.cassandra.store; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.ConsistencyLevel; import com.datastax.driver.core.HostDistance; +import com.datastax.driver.core.KeyspaceMetadata; import com.datastax.driver.core.PoolingOptions; import com.datastax.driver.core.ProtocolOptions; import com.datastax.driver.core.ProtocolVersion; import com.datastax.driver.core.QueryOptions; import com.datastax.driver.core.Session; import com.datastax.driver.core.SocketOptions; +import com.datastax.driver.core.TableMetadata; import com.datastax.driver.core.TypeCodec; import com.datastax.driver.core.policies.ConstantReconnectionPolicy; import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy; @@ -249,7 +251,7 @@ public class CassandraStore implements DataStore Element partitionKeys = key.getChild("partitionKey"); Element clusterKeys = key.getChild("clusterKey"); List partitionKeyFields = partitionKeys.getChildren("field"); - List partitionCompositeKeyFields = partitionKeys.getChildren("compositeField"); + List partitionCompositeKeyFields = partitionKeys.getChildren("compositeKey"); // process non composite partition keys for (Element partitionKeyField : partitionKeyFields) { PartitionKeyField fieldKey = new PartitionKeyField(); @@ -458,7 +460,7 @@ public class CassandraStore implements DataStore break; } default: - LOG.error("Unsupported Cassandra load balancing " + "policy: " + loadBalancingProp); + LOG.error("Unsupported Cassandra load balancing policy: {} ", loadBalancingProp); break; } } @@ -549,7 +551,7 @@ public class CassandraStore implements DataStore break; } default: - LOG.error("Unsupported reconnection policy " + reconnectionPolicy); + LOG.error("Unsupported reconnection policy : {} ", reconnectionPolicy); } } return builder; @@ -578,7 +580,7 @@ public class CassandraStore implements DataStore builder = builder.withRetryPolicy(new LoggingRetryPolicy(FallthroughRetryPolicy.INSTANCE)); break; default: - LOG.error("Unsupported retry policy " + retryPolicy); + LOG.error("Unsupported retry policy : {} ", retryPolicy); break; } } @@ -643,20 +645,23 @@ public class CassandraStore implements DataStore @Override public String getSchemaName() { - return null; + return mapping.getCoreName(); } @Override public void createSchema() { - LOG.debug("creating Cassandra keyspace"); + LOG.debug("creating Cassandra keyspace {}", mapping.getKeySpace().getName()); this.session.execute(CassandraQueryFactory.getCreateKeySpaceQuery(mapping)); - LOG.debug("creating Cassandra column family / table"); + LOG.debug("creating Cassandra column family / table {}", mapping.getCoreName()); this.session.execute(CassandraQueryFactory.getCreateTableQuery(mapping)); } @Override public void deleteSchema() { - + LOG.debug("dropping Cassandra table {}", mapping.getCoreName()); + this.session.execute(CassandraQueryFactory.getDropTableQuery(mapping)); + LOG.debug("dropping Cassandra keyspace {}", mapping.getKeySpace().getName()); + this.session.execute(CassandraQueryFactory.getDropKeySpaceQuery(mapping)); } @Override @@ -765,11 +770,19 @@ public class CassandraStore implements DataStore @Override public void truncateSchema() { + LOG.debug("truncating Cassandra table {}", mapping.getCoreName()); + this.session.execute(CassandraQueryFactory.getTruncateTableQuery(mapping)); } @Override public boolean schemaExists() { - return false; + KeyspaceMetadata keyspace = cluster.getMetadata().getKeyspace(mapping.getKeySpace().getName()); + if (keyspace != null) { + TableMetadata table = keyspace.getTable(mapping.getCoreName()); + return table != null; + } else { + return false; + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/gora/blob/89109b85/gora-cassandra-cql/src/test/conf/compositeKey/gora-cassandra-mapping.xml ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/test/conf/compositeKey/gora-cassandra-mapping.xml b/gora-cassandra-cql/src/test/conf/compositeKey/gora-cassandra-mapping.xml new file mode 100644 index 0000000..556d553 --- /dev/null +++ b/gora-cassandra-cql/src/test/conf/compositeKey/gora-cassandra-mapping.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file http://git-wip-us.apache.org/repos/asf/gora/blob/89109b85/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStoreWithNativeSerialization.java ---------------------------------------------------------------------- diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStoreWithNativeSerialization.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStoreWithNativeSerialization.java index 217dea3..5bb1114 100644 --- a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStoreWithNativeSerialization.java +++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStoreWithNativeSerialization.java @@ -26,7 +26,7 @@ public class TestCassandraStoreWithNativeSerialization { public static void setUpClass() throws Exception { setProperties(); testDriver.setParameters(parameter); -// testDriver.setUpClass(); + testDriver.setUpClass(); userDataStore = testDriver.createDataStore(UUID.class, User.class); } @@ -47,7 +47,7 @@ public class TestCassandraStoreWithNativeSerialization { @AfterClass public static void tearDownClass() throws Exception { -// testDriver.tearDownClass(); + testDriver.tearDownClass(); } /** @@ -84,4 +84,34 @@ public class TestCassandraStoreWithNativeSerialization { User deletedUser = userDataStore.get(id); Assert.assertNull(deletedUser); } + + /** + * In this test case, schema exists method behavior of the data store is testing. + */ + @Test + public void testSchemaExists() { + userDataStore.deleteSchema(); + Assert.assertFalse(userDataStore.schemaExists()); + userDataStore.createSchema(); + Assert.assertTrue(userDataStore.schemaExists()); + } + + /** + * In this test case, schema exists method behavior of the data store is testing. + */ + @Test + public void testTruncateSchema() { + if(!userDataStore.schemaExists()) { + userDataStore.createSchema(); + } + UUID id = UUID.randomUUID(); + User user1 = new User(id, "Madhawa Kasun", Date.from(Instant.now())); + userDataStore.put(id, user1); + User olduser = userDataStore.get(id); + Assert.assertEquals(olduser.getName(), user1.getName()); + Assert.assertEquals(olduser.getDateOfBirth(), user1.getDateOfBirth()); + userDataStore.truncateSchema(); + olduser = userDataStore.get(id); + Assert.assertNull(olduser); + } }