diff --git a/persistence-modules/scylladb/pom.xml b/persistence-modules/scylladb/pom.xml new file mode 100644 index 0000000000..e457c75d91 --- /dev/null +++ b/persistence-modules/scylladb/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + com.baeldung.examples.scylladb + scylladb + 0.0.1-SNAPSHOT + scylladb + Sample ScyllaDB Project + + 1.17.6 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + org.springframework.boot + spring-boot-starter + + + com.scylladb + java-driver-core + 4.14.1.0 + + + com.scylladb + java-driver-query-builder + 4.14.1.0 + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.testcontainers + testcontainers + test + + + org.testcontainers + junit-jupiter + test + + + + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java new file mode 100644 index 0000000000..3e6cea7ed2 --- /dev/null +++ b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java @@ -0,0 +1,89 @@ +package com.baeldung.scylladb; + +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.insertInto; +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.literal; +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom; +import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.createKeyspace; +import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.createTable; + +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.scylladb.model.User; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.type.DataTypes; +import com.datastax.oss.driver.api.querybuilder.insert.InsertInto; +import com.datastax.oss.driver.api.querybuilder.schema.CreateKeyspaceStart; +import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; +import com.datastax.oss.driver.api.querybuilder.select.Select; + +public class ScylladbApplication { + + private String keySpaceName; + private String tableName; + + public ScylladbApplication(String keySpaceName, String tableName) { + this.keySpaceName = keySpaceName; + this.tableName = tableName; + CreateKeyspaceStart createKeyspace = createKeyspace(keySpaceName); + SimpleStatement keypaceStatement = createKeyspace.ifNotExists() + .withSimpleStrategy(3) + .build(); + + CreateTableStart createTable = createTable(keySpaceName, tableName); + SimpleStatement tableStatement = createTable.ifNotExists() + .withPartitionKey("id", DataTypes.BIGINT) + .withColumn("name", DataTypes.TEXT) + .build(); + + try (CqlSession session = CqlSession.builder().build()) { + ResultSet rs = session.execute(keypaceStatement); + if (null == rs.getExecutionInfo().getErrors() || rs.getExecutionInfo().getErrors().isEmpty()) { + rs = session.execute(tableStatement); + } + } + } + + public List getAllUserNames() { + List userNames = new ArrayList<>(); + try (CqlSession session = CqlSession.builder().build()) { + String query = String.format("select * from %s.%s",keySpaceName,tableName); + ResultSet rs = session.execute(query); + for (Row r : rs.all()) + userNames.add(r.getString("name")); + } + return userNames; + } + + public List getUsersByUserName(String userName) { + List userList = new ArrayList<>(); + try (CqlSession session = CqlSession.builder().build()) { + Select query = selectFrom(keySpaceName, tableName).all() + .whereColumn("name") + .isEqualTo(literal(userName)) + .allowFiltering(); + SimpleStatement statement = query.build(); + ResultSet rs = session.execute(statement); + for (Row r : rs) + userList.add(new User(r.getLong("id"), r.getString("name"))); + } + return userList; + } + + public boolean addNewUser(User user) { + boolean response = false; + try (CqlSession session = CqlSession.builder().build()) { + InsertInto insert = insertInto(keySpaceName, tableName); + SimpleStatement statement = insert.value("id", literal(user.getId())) + .value("name", literal(user.getName())) + .build(); + ResultSet rs = session.execute(statement); + response = null == rs.getExecutionInfo().getErrors() || rs.getExecutionInfo().getErrors().isEmpty(); + } + return response; + } + +} diff --git a/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java new file mode 100644 index 0000000000..28d60112b9 --- /dev/null +++ b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java @@ -0,0 +1,17 @@ +package com.baeldung.scylladb.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class User { + + private long id; + + private String name; +} diff --git a/persistence-modules/scylladb/src/main/resources/application.yml b/persistence-modules/scylladb/src/main/resources/application.yml new file mode 100644 index 0000000000..3a4abad3dd --- /dev/null +++ b/persistence-modules/scylladb/src/main/resources/application.yml @@ -0,0 +1,3 @@ +datastax-java-driver: + basic: + contact-points: 127.0.0.1:9042 \ No newline at end of file diff --git a/persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java b/persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java new file mode 100644 index 0000000000..4e3cb00a41 --- /dev/null +++ b/persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java @@ -0,0 +1,68 @@ +package com.baeldung.scylladb; + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.function.Consumer; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import com.baeldung.scylladb.model.User; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; + +@Testcontainers +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ScyllaDBApplicationLiveTest { + + private static final String IMAGE_NAME = "scylladb/scylla"; + private static final int hostPort = 9042; + private static final int containerExposedPort = 9042; + private static Consumer cmd = e -> e.withPortBindings(new PortBinding(Ports.Binding.bindPort(hostPort), + new ExposedPort(containerExposedPort))); + + @Container + private static final GenericContainer scyllaDbContainer = new GenericContainer(DockerImageName.parse(IMAGE_NAME)) + .withExposedPorts(containerExposedPort) + .withCreateContainerCmdModifier(cmd); + + private ScylladbApplication scylladbApplication; + + @BeforeAll + void setUp() { + scylladbApplication = new ScylladbApplication("baeldung", "User"); + } + + @Test + public void givenKeySpaceAndTable_whenInsertData_thenShouldBeAbleToFindData() { + User user = new User(10, "John"); + scylladbApplication.addNewUser(user); + + List userList = scylladbApplication.getUsersByUserName("John"); + assertEquals(1, userList.size()); + assertEquals("John", userList.get(0).getName()); + assertEquals(10, userList.get(0).getId()); + + } + + @Test + public void givenKeySpaceAndTable_whenInsertData_thenRowCountIncreases() { + int initialCount = scylladbApplication.getAllUserNames().size(); + User user = new User(11, "Doe"); + scylladbApplication.addNewUser(user); + + int expectedCount = initialCount+1; + int updatedCount = scylladbApplication.getAllUserNames().size(); + assertEquals(expectedCount, updatedCount); + + } + +} diff --git a/persistence-modules/scylladb/src/test/resources/application.yml b/persistence-modules/scylladb/src/test/resources/application.yml new file mode 100644 index 0000000000..3a4abad3dd --- /dev/null +++ b/persistence-modules/scylladb/src/test/resources/application.yml @@ -0,0 +1,3 @@ +datastax-java-driver: + basic: + contact-points: 127.0.0.1:9042 \ No newline at end of file