Merge with master
This commit is contained in:
commit
1cbb8341cf
|
@ -0,0 +1,102 @@
|
||||||
|
<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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>cassandra-java-client</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<name>cassandra-java-client</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
|
||||||
|
<!-- logging -->
|
||||||
|
<org.slf4j.version>1.7.21</org.slf4j.version>
|
||||||
|
<logback.version>1.1.7</logback.version>
|
||||||
|
|
||||||
|
<!-- testing -->
|
||||||
|
<org.hamcrest.version>1.3</org.hamcrest.version>
|
||||||
|
<junit.version>4.12</junit.version>
|
||||||
|
<mockito.version>1.10.19</mockito.version>
|
||||||
|
<testng.version>6.8</testng.version>
|
||||||
|
<assertj.version>3.5.1</assertj.version>
|
||||||
|
|
||||||
|
<!-- maven plugins -->
|
||||||
|
<maven-compiler-plugin.version>3.5.1</maven-compiler-plugin.version>
|
||||||
|
|
||||||
|
<!-- Cassandra -->
|
||||||
|
<cassandra-driver-core.version>3.1.0</cassandra-driver-core.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- Cassandra -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.datastax.cassandra</groupId>
|
||||||
|
<artifactId>cassandra-driver-core</artifactId>
|
||||||
|
<version>${cassandra-driver-core.version}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.cassandraunit/cassandra-unit -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.cassandraunit</groupId>
|
||||||
|
<artifactId>cassandra-unit</artifactId>
|
||||||
|
<version>3.0.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- This guava version is required for cassandra-unit 3.0.0.1 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>19.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- logging -->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
<version>${org.slf4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<version>${logback.version}</version>
|
||||||
|
<!-- <scope>runtime</scope> -->
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>jcl-over-slf4j</artifactId>
|
||||||
|
<version>${org.slf4j.version}</version>
|
||||||
|
<!-- <scope>runtime</scope> --> <!-- some spring dependencies need to compile against jcl -->
|
||||||
|
</dependency>
|
||||||
|
<dependency> <!-- needed to bridge to slf4j for projects that use the log4j APIs directly -->
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>log4j-over-slf4j</artifactId>
|
||||||
|
<version>${org.slf4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>java-cassandra</finalName>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.baeldung.cassandra.java.client;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.baeldung.cassandra.java.client.domain.Book;
|
||||||
|
import com.baeldung.cassandra.java.client.repository.BookRepository;
|
||||||
|
import com.baeldung.cassandra.java.client.repository.KeyspaceRepository;
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
import com.datastax.driver.core.utils.UUIDs;
|
||||||
|
|
||||||
|
public class CassandraClient {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CassandraClient.class);
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
CassandraConnector connector = new CassandraConnector();
|
||||||
|
connector.connect("127.0.0.1", null);
|
||||||
|
Session session = connector.getSession();
|
||||||
|
|
||||||
|
KeyspaceRepository sr = new KeyspaceRepository(session);
|
||||||
|
sr.createKeyspace("library", "SimpleStrategy", 1);
|
||||||
|
sr.useKeyspace("library");
|
||||||
|
|
||||||
|
BookRepository br = new BookRepository(session);
|
||||||
|
br.createTable();
|
||||||
|
br.alterTablebooks("publisher", "text");
|
||||||
|
|
||||||
|
br.createTableBooksByTitle();
|
||||||
|
|
||||||
|
Book book = new Book(UUIDs.timeBased(), "Effective Java", "Joshua Bloch", "Programming");
|
||||||
|
br.insertBookBatch(book);
|
||||||
|
|
||||||
|
br.selectAll().forEach(o -> LOG.info("Title in books: " + o.getTitle()));
|
||||||
|
br.selectAllBookByTitle().forEach(o -> LOG.info("Title in booksByTitle: " + o.getTitle()));
|
||||||
|
|
||||||
|
br.deletebookByTitle("Effective Java");
|
||||||
|
br.deleteTable("books");
|
||||||
|
br.deleteTable("booksByTitle");
|
||||||
|
|
||||||
|
sr.deleteKeyspace("library");
|
||||||
|
|
||||||
|
connector.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.baeldung.cassandra.java.client;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.datastax.driver.core.Cluster;
|
||||||
|
import com.datastax.driver.core.Cluster.Builder;
|
||||||
|
import com.datastax.driver.core.Host;
|
||||||
|
import com.datastax.driver.core.Metadata;
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* This is an implementation of a simple Java client.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CassandraConnector {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CassandraConnector.class);
|
||||||
|
|
||||||
|
private Cluster cluster;
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
public void connect(final String node, final Integer port) {
|
||||||
|
|
||||||
|
Builder b = Cluster.builder().addContactPoint(node);
|
||||||
|
|
||||||
|
if (port != null) {
|
||||||
|
b.withPort(port);
|
||||||
|
}
|
||||||
|
cluster = b.build();
|
||||||
|
|
||||||
|
Metadata metadata = cluster.getMetadata();
|
||||||
|
LOG.info("Cluster name: " + metadata.getClusterName());
|
||||||
|
|
||||||
|
for (Host host : metadata.getAllHosts()) {
|
||||||
|
LOG.info("Datacenter: " + host.getDatacenter() + " Host: " + host.getAddress() + " Rack: " + host.getRack());
|
||||||
|
}
|
||||||
|
|
||||||
|
session = cluster.connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Session getSession() {
|
||||||
|
return this.session;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
session.close();
|
||||||
|
cluster.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.baeldung.cassandra.java.client.domain;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class Book {
|
||||||
|
|
||||||
|
private UUID id;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private String author;
|
||||||
|
|
||||||
|
private String subject;
|
||||||
|
|
||||||
|
private String publisher;
|
||||||
|
|
||||||
|
Book() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Book(UUID id, String title, String author, String subject) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.author = author;
|
||||||
|
this.subject = subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(UUID id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthor(String author) {
|
||||||
|
this.author = author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSubject() {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubject(String subject) {
|
||||||
|
this.subject = subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPublisher() {
|
||||||
|
return publisher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPublisher(String publisher) {
|
||||||
|
this.publisher = publisher;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,177 @@
|
||||||
|
package com.baeldung.cassandra.java.client.repository;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baeldung.cassandra.java.client.domain.Book;
|
||||||
|
import com.datastax.driver.core.ResultSet;
|
||||||
|
import com.datastax.driver.core.Row;
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
|
||||||
|
public class BookRepository {
|
||||||
|
|
||||||
|
private static final String TABLE_NAME = "books";
|
||||||
|
|
||||||
|
private static final String TABLE_NAME_BY_TITLE = TABLE_NAME + "ByTitle";
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
public BookRepository(Session session) {
|
||||||
|
this.session = session;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the books table.
|
||||||
|
*/
|
||||||
|
public void createTable() {
|
||||||
|
StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME).append("(").append("id uuid PRIMARY KEY, ").append("title text,").append("author text,").append("subject text);");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the books table.
|
||||||
|
*/
|
||||||
|
public void createTableBooksByTitle() {
|
||||||
|
StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME_BY_TITLE).append("(").append("id uuid, ").append("title text,").append("PRIMARY KEY (title, id));");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alters the table books and adds an extra column.
|
||||||
|
*/
|
||||||
|
public void alterTablebooks(String columnName, String columnType) {
|
||||||
|
StringBuilder sb = new StringBuilder("ALTER TABLE ").append(TABLE_NAME).append(" ADD ").append(columnName).append(" ").append(columnType).append(";");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a row in the table books.
|
||||||
|
*
|
||||||
|
* @param book
|
||||||
|
*/
|
||||||
|
public void insertbook(Book book) {
|
||||||
|
StringBuilder sb = new StringBuilder("INSERT INTO ").append(TABLE_NAME).append("(id, title, author, subject) ").append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("', '").append(book.getAuthor()).append("', '")
|
||||||
|
.append(book.getSubject()).append("');");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a row in the table booksByTitle.
|
||||||
|
* @param book
|
||||||
|
*/
|
||||||
|
public void insertbookByTitle(Book book) {
|
||||||
|
StringBuilder sb = new StringBuilder("INSERT INTO ").append(TABLE_NAME_BY_TITLE).append("(id, title) ").append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("');");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a book into two identical tables using a batch query.
|
||||||
|
*
|
||||||
|
* @param book
|
||||||
|
*/
|
||||||
|
public void insertBookBatch(Book book) {
|
||||||
|
StringBuilder sb = new StringBuilder("BEGIN BATCH ")
|
||||||
|
.append("INSERT INTO ").append(TABLE_NAME).append("(id, title, author, subject) ")
|
||||||
|
.append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("', '").append(book.getAuthor()).append("', '")
|
||||||
|
.append(book.getSubject()).append("');")
|
||||||
|
.append("INSERT INTO ").append(TABLE_NAME_BY_TITLE).append("(id, title) ")
|
||||||
|
.append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("');")
|
||||||
|
.append("APPLY BATCH;");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select book by id.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Book selectByTitle(String title) {
|
||||||
|
StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME_BY_TITLE).append(" WHERE title = '").append(title).append("';");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
|
||||||
|
ResultSet rs = session.execute(query);
|
||||||
|
|
||||||
|
List<Book> books = new ArrayList<Book>();
|
||||||
|
|
||||||
|
for (Row r : rs) {
|
||||||
|
Book s = new Book(r.getUUID("id"), r.getString("title"), null, null);
|
||||||
|
books.add(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return books.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select all books from books
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Book> selectAll() {
|
||||||
|
StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME);
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
ResultSet rs = session.execute(query);
|
||||||
|
|
||||||
|
List<Book> books = new ArrayList<Book>();
|
||||||
|
|
||||||
|
for (Row r : rs) {
|
||||||
|
Book book = new Book(r.getUUID("id"), r.getString("title"), r.getString("author"), r.getString("subject"));
|
||||||
|
books.add(book);
|
||||||
|
}
|
||||||
|
return books;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select all books from booksByTitle
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Book> selectAllBookByTitle() {
|
||||||
|
StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME_BY_TITLE);
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
ResultSet rs = session.execute(query);
|
||||||
|
|
||||||
|
List<Book> books = new ArrayList<Book>();
|
||||||
|
|
||||||
|
for (Row r : rs) {
|
||||||
|
Book book = new Book(r.getUUID("id"), r.getString("title"), null, null);
|
||||||
|
books.add(book);
|
||||||
|
}
|
||||||
|
return books;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a book by title.
|
||||||
|
*/
|
||||||
|
public void deletebookByTitle(String title) {
|
||||||
|
StringBuilder sb = new StringBuilder("DELETE FROM ").append(TABLE_NAME_BY_TITLE).append(" WHERE title = '").append(title).append("';");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete table.
|
||||||
|
*
|
||||||
|
* @param tableName the name of the table to delete.
|
||||||
|
*/
|
||||||
|
public void deleteTable(String tableName) {
|
||||||
|
StringBuilder sb = new StringBuilder("DROP TABLE IF EXISTS ").append(tableName);
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.cassandra.java.client.repository;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repository to handle the Cassandra schema.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class KeyspaceRepository {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(KeyspaceRepository.class);
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
public KeyspaceRepository(Session session) {
|
||||||
|
this.session = session;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method used to create any keyspace - schema.
|
||||||
|
*
|
||||||
|
* @param schemaName the name of the schema.
|
||||||
|
* @param replicatioonStrategy the replication strategy.
|
||||||
|
* @param numberOfReplicas the number of replicas.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void createKeyspace(String keyspaceName, String replicatioonStrategy, int numberOfReplicas) {
|
||||||
|
StringBuilder sb = new StringBuilder("CREATE KEYSPACE IF NOT EXISTS ").append(keyspaceName).append(" WITH replication = {").append("'class':'").append(replicatioonStrategy).append("','replication_factor':").append(numberOfReplicas).append("};");
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void useKeyspace(String keyspace) {
|
||||||
|
session.execute("USE " + keyspace);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method used to delete the specified schema.
|
||||||
|
* It results in the immediate, irreversable removal of the keyspace, including all tables and data contained in the keyspace.
|
||||||
|
*
|
||||||
|
* @param schemaName the name of the keyspace to delete.
|
||||||
|
*/
|
||||||
|
public void deleteKeyspace(String keyspaceName) {
|
||||||
|
StringBuilder sb = new StringBuilder("DROP KEYSPACE ").append(keyspaceName);
|
||||||
|
|
||||||
|
final String query = sb.toString();
|
||||||
|
|
||||||
|
session.execute(query);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,174 @@
|
||||||
|
package com.baeldung.cassandra.java.client.repository;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.apache.cassandra.exceptions.ConfigurationException;
|
||||||
|
import org.apache.thrift.transport.TTransportException;
|
||||||
|
import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.baeldung.cassandra.java.client.CassandraConnector;
|
||||||
|
import com.baeldung.cassandra.java.client.domain.Book;
|
||||||
|
import com.datastax.driver.core.ResultSet;
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
import com.datastax.driver.core.exceptions.InvalidQueryException;
|
||||||
|
import com.datastax.driver.core.utils.UUIDs;
|
||||||
|
|
||||||
|
public class BookRepositoryIntegrationTest {
|
||||||
|
|
||||||
|
private KeyspaceRepository schemaRepository;
|
||||||
|
|
||||||
|
private BookRepository bookRepository;
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
final String KEYSPACE_NAME = "testLibrary";
|
||||||
|
final String BOOKS = "books";
|
||||||
|
final String BOOKS_BY_TITLE = "booksByTitle";
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void init() throws ConfigurationException, TTransportException, IOException, InterruptedException {
|
||||||
|
// Start an embedded Cassandra Server
|
||||||
|
EmbeddedCassandraServerHelper.startEmbeddedCassandra(20000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void connect() {
|
||||||
|
CassandraConnector client = new CassandraConnector();
|
||||||
|
client.connect("127.0.0.1", 9142);
|
||||||
|
this.session = client.getSession();
|
||||||
|
schemaRepository = new KeyspaceRepository(session);
|
||||||
|
schemaRepository.createKeyspace(KEYSPACE_NAME, "SimpleStrategy", 1);
|
||||||
|
schemaRepository.useKeyspace(KEYSPACE_NAME);
|
||||||
|
bookRepository = new BookRepository(session);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingATable_thenCreatedCorrectly() {
|
||||||
|
bookRepository.deleteTable(BOOKS);
|
||||||
|
bookRepository.createTable();
|
||||||
|
|
||||||
|
ResultSet result = session.execute("SELECT * FROM " + KEYSPACE_NAME + "." + BOOKS + ";");
|
||||||
|
|
||||||
|
// Collect all the column names in one list.
|
||||||
|
List<String> columnNames = result.getColumnDefinitions().asList().stream().map(cl -> cl.getName()).collect(Collectors.toList());
|
||||||
|
assertEquals(columnNames.size(), 4);
|
||||||
|
assertTrue(columnNames.contains("id"));
|
||||||
|
assertTrue(columnNames.contains("title"));
|
||||||
|
assertTrue(columnNames.contains("author"));
|
||||||
|
assertTrue(columnNames.contains("subject"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAlteringTable_thenAddedColumnExists() {
|
||||||
|
bookRepository.deleteTable(BOOKS);
|
||||||
|
bookRepository.createTable();
|
||||||
|
|
||||||
|
bookRepository.alterTablebooks("publisher", "text");
|
||||||
|
|
||||||
|
ResultSet result = session.execute("SELECT * FROM " + KEYSPACE_NAME + "." + BOOKS + ";");
|
||||||
|
|
||||||
|
boolean columnExists = result.getColumnDefinitions().asList().stream().anyMatch(cl -> cl.getName().equals("publisher"));
|
||||||
|
assertTrue(columnExists);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAddingANewBook_thenBookExists() {
|
||||||
|
bookRepository.deleteTable(BOOKS_BY_TITLE);
|
||||||
|
bookRepository.createTableBooksByTitle();
|
||||||
|
|
||||||
|
String title = "Effective Java";
|
||||||
|
String author = "Joshua Bloch";
|
||||||
|
Book book = new Book(UUIDs.timeBased(), title, author, "Programming");
|
||||||
|
bookRepository.insertbookByTitle(book);
|
||||||
|
|
||||||
|
Book savedBook = bookRepository.selectByTitle(title);
|
||||||
|
assertEquals(book.getTitle(), savedBook.getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAddingANewBookBatch_ThenBookAddedInAllTables() {
|
||||||
|
// Create table books
|
||||||
|
bookRepository.deleteTable(BOOKS);
|
||||||
|
bookRepository.createTable();
|
||||||
|
|
||||||
|
// Create table booksByTitle
|
||||||
|
bookRepository.deleteTable(BOOKS_BY_TITLE);
|
||||||
|
bookRepository.createTableBooksByTitle();
|
||||||
|
|
||||||
|
String title = "Effective Java";
|
||||||
|
String author = "Joshua Bloch";
|
||||||
|
Book book = new Book(UUIDs.timeBased(), title, author, "Programming");
|
||||||
|
bookRepository.insertBookBatch(book);
|
||||||
|
|
||||||
|
List<Book> books = bookRepository.selectAll();
|
||||||
|
|
||||||
|
assertEquals(1, books.size());
|
||||||
|
assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
|
||||||
|
|
||||||
|
List<Book> booksByTitle = bookRepository.selectAllBookByTitle();
|
||||||
|
|
||||||
|
assertEquals(1, booksByTitle.size());
|
||||||
|
assertTrue(booksByTitle.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenSelectingAll_thenReturnAllRecords() {
|
||||||
|
bookRepository.deleteTable(BOOKS);
|
||||||
|
bookRepository.createTable();
|
||||||
|
|
||||||
|
Book book = new Book(UUIDs.timeBased(), "Effective Java", "Joshua Bloch", "Programming");
|
||||||
|
bookRepository.insertbook(book);
|
||||||
|
|
||||||
|
book = new Book(UUIDs.timeBased(), "Clean Code", "Robert C. Martin", "Programming");
|
||||||
|
bookRepository.insertbook(book);
|
||||||
|
|
||||||
|
List<Book> books = bookRepository.selectAll();
|
||||||
|
|
||||||
|
assertEquals(2, books.size());
|
||||||
|
assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
|
||||||
|
assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Clean Code")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDeletingABookByTitle_thenBookIsDeleted() {
|
||||||
|
bookRepository.deleteTable(BOOKS_BY_TITLE);
|
||||||
|
bookRepository.createTableBooksByTitle();
|
||||||
|
|
||||||
|
Book book = new Book(UUIDs.timeBased(), "Effective Java", "Joshua Bloch", "Programming");
|
||||||
|
bookRepository.insertbookByTitle(book);
|
||||||
|
|
||||||
|
book = new Book(UUIDs.timeBased(), "Clean Code", "Robert C. Martin", "Programming");
|
||||||
|
bookRepository.insertbookByTitle(book);
|
||||||
|
|
||||||
|
bookRepository.deletebookByTitle("Clean Code");
|
||||||
|
|
||||||
|
List<Book> books = bookRepository.selectAllBookByTitle();
|
||||||
|
assertEquals(1, books.size());
|
||||||
|
assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
|
||||||
|
assertFalse(books.stream().anyMatch(b -> b.getTitle().equals("Clean Code")));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = InvalidQueryException.class)
|
||||||
|
public void whenDeletingATable_thenUnconfiguredTable() {
|
||||||
|
bookRepository.createTable();
|
||||||
|
bookRepository.deleteTable(BOOKS);
|
||||||
|
|
||||||
|
session.execute("SELECT * FROM " + KEYSPACE_NAME + "." + BOOKS + ";");
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void cleanup() {
|
||||||
|
EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package com.baeldung.cassandra.java.client.repository;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.apache.cassandra.exceptions.ConfigurationException;
|
||||||
|
import org.apache.thrift.transport.TTransportException;
|
||||||
|
import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.FixMethodOrder;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runners.MethodSorters;
|
||||||
|
|
||||||
|
import com.baeldung.cassandra.java.client.CassandraConnector;
|
||||||
|
import com.datastax.driver.core.ResultSet;
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
|
||||||
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
|
public class KeyspaceRepositoryIntegrationTest {
|
||||||
|
|
||||||
|
private KeyspaceRepository schemaRepository;
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void init() throws ConfigurationException, TTransportException, IOException, InterruptedException {
|
||||||
|
// Start an embedded Cassandra Server
|
||||||
|
EmbeddedCassandraServerHelper.startEmbeddedCassandra(20000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void connect() {
|
||||||
|
CassandraConnector client = new CassandraConnector();
|
||||||
|
client.connect("127.0.0.1", 9142);
|
||||||
|
this.session = client.getSession();
|
||||||
|
schemaRepository = new KeyspaceRepository(session);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingAKeyspace_thenCreated() {
|
||||||
|
String keyspaceName = "testBaeldungKeyspace";
|
||||||
|
schemaRepository.createKeyspace(keyspaceName, "SimpleStrategy", 1);
|
||||||
|
|
||||||
|
// ResultSet result = session.execute("SELECT * FROM system_schema.keyspaces WHERE keyspace_name = 'testBaeldungKeyspace';");
|
||||||
|
|
||||||
|
ResultSet result = session.execute("SELECT * FROM system_schema.keyspaces;");
|
||||||
|
|
||||||
|
// Check if the Keyspace exists in the returned keyspaces.
|
||||||
|
List<String> matchedKeyspaces = result.all().stream().filter(r -> r.getString(0).equals(keyspaceName.toLowerCase())).map(r -> r.getString(0)).collect(Collectors.toList());
|
||||||
|
assertEquals(matchedKeyspaces.size(), 1);
|
||||||
|
assertTrue(matchedKeyspaces.get(0).equals(keyspaceName.toLowerCase()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDeletingAKeyspace_thenDoesNotExist() {
|
||||||
|
String keyspaceName = "testBaeldungKeyspace";
|
||||||
|
|
||||||
|
// schemaRepository.createKeyspace(keyspaceName, "SimpleStrategy", 1);
|
||||||
|
schemaRepository.deleteKeyspace(keyspaceName);
|
||||||
|
|
||||||
|
ResultSet result = session.execute("SELECT * FROM system_schema.keyspaces;");
|
||||||
|
boolean isKeyspaceCreated = result.all().stream().anyMatch(r -> r.getString(0).equals(keyspaceName.toLowerCase()));
|
||||||
|
assertFalse(isKeyspaceCreated);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void cleanup() {
|
||||||
|
EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue