diff --git a/couchbase-sdk/pom.xml b/couchbase-sdk/pom.xml index a864b611dc..d78ceb8933 100644 --- a/couchbase-sdk/pom.xml +++ b/couchbase-sdk/pom.xml @@ -24,9 +24,9 @@ - com.fasterxml.jackson.core - jackson-databind - ${jackson-version} + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} io.vavr @@ -79,7 +79,7 @@ 1.8 UTF-8 - 2.4.7 + 2.5.0 4.3.5.RELEASE 3.5 0.9.0 diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java new file mode 100644 index 0000000000..98fbe17e60 --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java @@ -0,0 +1,26 @@ +package com.baeldung.couchbase.n1ql; + +import com.couchbase.client.java.Bucket; +import com.couchbase.client.java.Cluster; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class BucketFactory { + + @Autowired + private Cluster cluster; + + private Bucket travelSampleBucket; + private Bucket testBucket; + + public Bucket getTravelSampleBucket() { + return (travelSampleBucket != null) ? + travelSampleBucket : cluster.openBucket("travel-sample"); + } + + public Bucket getTestBucket() { + return (testBucket != null) ? + testBucket : cluster.openBucket("test"); + } +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java index 19342e16ed..999dcd897f 100644 --- a/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java @@ -1,239 +1,16 @@ package com.baeldung.couchbase.n1ql; -import com.couchbase.client.java.Bucket; -import com.couchbase.client.java.Cluster; -import com.couchbase.client.java.CouchbaseCluster; -import com.couchbase.client.java.document.JsonDocument; -import com.couchbase.client.java.document.json.JsonArray; -import com.couchbase.client.java.document.json.JsonObject; -import com.couchbase.client.java.query.N1qlQuery; import com.couchbase.client.java.query.N1qlQueryResult; -import com.couchbase.client.java.query.N1qlQueryRow; -import com.couchbase.client.java.query.Statement; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.vavr.control.Try; -import rx.Observable; -import java.util.ArrayList; import java.util.List; -import java.util.UUID; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static com.couchbase.client.java.query.Select.select; -import static com.couchbase.client.java.query.dsl.Expression.i; -import static com.couchbase.client.java.query.dsl.Expression.s; -import static com.couchbase.client.java.query.dsl.Expression.x; - public class CodeSnippets { - public static void main(String[] args) { - - Cluster cluster = CouchbaseCluster.create("127.0.0.1"); - Bucket bucket = cluster.openBucket("test", 1, TimeUnit.MINUTES); - Bucket bucket1 = cluster.openBucket("travel-sample", 2, TimeUnit.MINUTES); - - bucket.bucketManager().createN1qlPrimaryIndex(true, false); - bucket1.bucketManager().createN1qlPrimaryIndex(true, false); - - insertDocument(bucket1); - basicSelect(bucket1); - selectStatement1(bucket1); - selectStatement2(bucket1); - selectStatement3DSL(bucket1); - selectStatement4(bucket1); - selectStatement4DSL(bucket1); - insertStatement1(bucket1); - insertStatement2(bucket1); - insertStatement3Bulk(bucket1); - updateStatement1(bucket1); - updateStatement2Upsert(bucket1); - updateStatement3(bucket1); - deleteStatement1(bucket1); - deleteStatement2(bucket1); - - bucket.close(); - bucket1.close(); - cluster.disconnect(); - System.exit(0); - - } - - private static void insertDocument(Bucket bucket) { - - JsonObject personObj = JsonObject.create() - .put("name", "John") - .put("email", "john@doe.com") - .put("interests", JsonArray.from("Java", "Nigerian Jollof")); - - String id = UUID.randomUUID().toString(); - JsonDocument doc = JsonDocument.create(id, personObj); - bucket.insert(doc); - - System.out.println(bucket.get(id)); - } - - private static void basicSelect(Bucket bucket) { - - N1qlQueryResult result - = bucket.query(N1qlQuery.simple("SELECT * FROM test")); - - result.forEach(System.out::println); - - System.out.println("result count: " + result.info().resultCount()); - System.out.println("error count: " + result.info().errorCount()); - } - - private static void selectStatement1(Bucket bucket) { - - String query = "SELECT name FROM `travel-sample` " + - "WHERE type = 'airport' LIMIT 100"; - N1qlQueryResult result1 = bucket.query(N1qlQuery.simple(query)); - - System.out.println("Result Count " + result1.info().resultCount()); - - N1qlQueryRow row = result1.allRows().get(0); - JsonObject rowJson = row.value(); - System.out.println("Name in First Row " + rowJson.get("name")); - - } - - private static void selectStatement2(Bucket bucket) { - - JsonObject pVal = JsonObject.create().put("type", "airport"); - String query = "SELECT * FROM `travel-sample` " + - "WHERE type = $type LIMIT 100"; - N1qlQueryResult r2 = bucket.query(N1qlQuery.parameterized(query, pVal)); - - System.out.println(r2.allRows()); - - List list = extractJsonResult(r2); - System.out.println( - list.get(0).get("travel-sample").get("airportname").asText()); - } - - private static void selectStatement3DSL(Bucket bucket) { - - Statement statement = select("*") - .from(i("travel-sample")) - .where(x("type").eq(s("airport"))) - .limit(100); - N1qlQueryResult r3 = bucket.query(N1qlQuery.simple(statement)); - - List list2 = extractJsonResult(r3); - System.out.println("First Airport Name: " + list2.get(0).get("travel-sample").get("airportname").asText()); - - } - - private static void selectStatement4(Bucket bucket) { - - String query2 = "SELECT t.city, " + - "t.airportname || \" (\" || t.faa || \")\" AS portname_faa " + - "FROM `travel-sample` t " + - "WHERE t.type=\"airport\"" + - "AND t.country LIKE '%States'" + - "AND t.geo.lat >= 70 " + - "LIMIT 2"; - N1qlQueryResult r4 = bucket.query(N1qlQuery.simple(query2)); - List list3 = extractJsonResult(r4); - System.out.println("First Doc : " + list3.get(0)); - } - - private static void selectStatement4DSL(Bucket bucket) { - - Statement st2 = select( - x("t.city, t.airportname") - .concat(s(" (")).concat(x("t.faa")).concat(s(")")).as("portname_faa")) - .from(i("travel-sample").as("t")) - .where( x("t.type").eq(s("airport")) - .and(x("t.country").like(s("%States"))) - .and(x("t.geo.lat").gte(70))) - .limit(2); - N1qlQueryResult r5 = bucket.query(N1qlQuery.simple(st2)); - List list5 = extractJsonResult(r5); - System.out.println("First Doc : " + list5.get(0)); - System.out.println("Query from Statement2: " + st2.toString()); - - } - - private static void insertStatement1(Bucket bucket) { - - String query = "INSERT INTO `travel-sample` (KEY, VALUE) " + - " VALUES(" + - "\"cust1293\", " + - "{\"id\":\"1293\",\"name\":\"Sample Airline\", \"type\":\"airline\"})" + - " RETURNING META().id as docid, *"; - N1qlQueryResult r1 = bucket.query(N1qlQuery.simple(query)); - r1.forEach(System.out::println); - } - - private static void insertStatement2(Bucket bucket) { - - JsonObject ob = JsonObject.create() - .put("id", "1293") - .put("name", "Sample Airline") - .put("type", "airline"); - bucket.insert(JsonDocument.create("cust1295", ob)); - } - - private static void insertStatement3Bulk(Bucket bucket) { - - int docsToCreate = 10; - List documents = new ArrayList<>(); - for (int i = 5; i < docsToCreate; i++) { - JsonObject content = JsonObject.create() - .put("id", i) - .put("type", "airline") - .put("name", "Sample Airline " + i); - documents.add(JsonDocument.create("cust_" + i, content)); - } - - List r5 = Observable - .from(documents) - .flatMap(doc -> bucket.async().insert(doc)) - .toList() - .last() - .toBlocking() - .single(); - - r5.forEach(System.out::println); - } - - private static void updateStatement1(Bucket bucket) { - - String query2 = "UPDATE `travel-sample` USE KEYS \"cust_1\" " + - "SET name=\"Sample Airline Updated\" RETURNING name"; - N1qlQueryResult result = bucket.query(N1qlQuery.simple(query2)); - result.forEach(System.out::println); - } - - private static void updateStatement2Upsert(Bucket bucket) { - - JsonObject o2 = JsonObject.create() - .put("name", "Sample Airline Updated"); - bucket.upsert(JsonDocument.create("cust_1", o2)); - } - - private static void updateStatement3(Bucket bucket) { - - String query3 = "UPDATE `travel-sample` USE KEYS \"cust_2\" " + - "UNSET name RETURNING *"; - N1qlQueryResult result1 = bucket.query(N1qlQuery.simple(query3)); - result1.forEach(System.out::println); - } - - private static void deleteStatement1(Bucket bucket) { - String query4 = "DELETE FROM `travel-sample` USE KEYS \"cust_50\""; - N1qlQueryResult result4 = bucket.query(N1qlQuery.simple(query4)); - } - - private static void deleteStatement2(Bucket bucket) { - String query5 = "DELETE FROM `travel-sample` WHERE id = 0 RETURNING *"; - N1qlQueryResult result5 = bucket.query(N1qlQuery.simple(query5)); - } - - private static List extractJsonResult(N1qlQueryResult result) { + public static List extractJsonResult(N1qlQueryResult result) { ObjectMapper objectMapper = new ObjectMapper(); return result.allRows().stream() .map(row -> Try.of(() -> objectMapper.readTree(row.value().toString())) diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java b/couchbase-sdk/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java new file mode 100644 index 0000000000..ef7e31b224 --- /dev/null +++ b/couchbase-sdk/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java @@ -0,0 +1,26 @@ +package com.baeldung.couchbase.n1ql; + +import com.couchbase.client.java.Cluster; +import com.couchbase.client.java.CouchbaseCluster; +import com.couchbase.client.java.env.CouchbaseEnvironment; +import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +@Configuration +@ComponentScan(basePackages = { "com.baeldung.couchbase.n1ql" }) +public class IntegrationTestConfig { + + @Bean + public Cluster cluster() { + CouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder() + .connectTimeout(60000) + .build(); + return CouchbaseCluster.create(env, "127.0.0.1"); + } + + +} diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/n1ql/N1QLIntegrationTest.java b/couchbase-sdk/src/test/java/com/baeldung/couchbase/n1ql/N1QLIntegrationTest.java new file mode 100644 index 0000000000..d05b107098 --- /dev/null +++ b/couchbase-sdk/src/test/java/com/baeldung/couchbase/n1ql/N1QLIntegrationTest.java @@ -0,0 +1,255 @@ +package com.baeldung.couchbase.n1ql; + +import com.baeldung.couchbase.n1ql.IntegrationTestConfig; +import com.couchbase.client.java.Bucket; +import com.couchbase.client.java.Cluster; +import com.couchbase.client.java.CouchbaseCluster; +import com.couchbase.client.java.document.JsonDocument; +import com.couchbase.client.java.document.json.JsonArray; +import com.couchbase.client.java.document.json.JsonObject; +import com.couchbase.client.java.query.N1qlQuery; +import com.couchbase.client.java.query.N1qlQueryResult; +import com.couchbase.client.java.query.N1qlQueryRow; +import com.couchbase.client.java.query.Statement; +import com.fasterxml.jackson.databind.JsonNode; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import rx.Observable; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static com.baeldung.couchbase.n1ql.CodeSnippets.extractJsonResult; +import static com.couchbase.client.java.query.Select.select; +import static com.couchbase.client.java.query.dsl.Expression.i; +import static com.couchbase.client.java.query.dsl.Expression.s; +import static com.couchbase.client.java.query.dsl.Expression.x; +import static org.junit.Assert.*; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { IntegrationTestConfig.class }) +public class N1QLIntegrationTest { + + + @Autowired + private Cluster cluster; + + @Autowired + private BucketFactory bucketFactory; + + @Test + public void givenAutowiredCluster_whenNotNull_thenNotNull() { + assertNotNull(cluster); + } + + @Test + public void givenBucketFactory_whenGetTestBucket_thenNotNull() { + assertNotNull(bucketFactory.getTestBucket()); + } + + @Test + public void givenBucketFactory_whenGetTravelSampleBucket_thenNotNull() { + assertNotNull(bucketFactory.getTravelSampleBucket()); + } + + @Test + public void givenDocument_whenInsert_thenResult() { + Bucket bucket = bucketFactory.getTestBucket(); + JsonObject personObj = JsonObject.create() + .put("name", "John") + .put("email", "john@doe.com") + .put("interests", JsonArray.from("Java", "Nigerian Jollof")); + + String id = UUID.randomUUID().toString(); + JsonDocument doc = JsonDocument.create(id, personObj); + bucket.insert(doc); + assertNotNull(bucket.get(id)); + } + + @Test + public void whenBasicSelectQuery_thenGetQueryResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + N1qlQueryResult result + = bucket.query(N1qlQuery.simple("SELECT * FROM test")); + + result.forEach(System.out::println); + + System.out.println("result count: " + result.info().resultCount()); + System.out.println("error count: " + result.info().errorCount()); + } + + @Test + public void givenSelectStatement_whenQuery_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query = "SELECT name FROM `travel-sample` " + + "WHERE type = 'airport' LIMIT 100"; + N1qlQueryResult result1 = bucket.query(N1qlQuery.simple(query)); + + System.out.println("Result Count " + result1.info().resultCount()); + + N1qlQueryRow row = result1.allRows().get(0); + JsonObject rowJson = row.value(); + System.out.println("Name in First Row " + rowJson.get("name")); + + } + + @Test + public void givenSelectStatement2_whenQuery_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + JsonObject pVal = JsonObject.create().put("type", "airport"); + String query = "SELECT * FROM `travel-sample` " + + "WHERE type = $type LIMIT 100"; + N1qlQueryResult r2 = bucket.query(N1qlQuery.parameterized(query, pVal)); + + System.out.println(r2.allRows()); + + List list = extractJsonResult(r2); + System.out.println( + list.get(0).get("travel-sample").get("airportname").asText()); + } + + @Test + public void givenSelectDSL_whenQuery_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + Statement statement = select("*") + .from(i("travel-sample")) + .where(x("type").eq(s("airport"))) + .limit(100); + N1qlQueryResult r3 = bucket.query(N1qlQuery.simple(statement)); + + List list2 = extractJsonResult(r3); + System.out.println("First Airport Name: " + list2.get(0).get("travel-sample").get("airportname").asText()); + + } + + @Test + public void givenSelectStatementWithOperators_whenQuery_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query2 = "SELECT t.city, " + + "t.airportname || \" (\" || t.faa || \")\" AS portname_faa " + + "FROM `travel-sample` t " + + "WHERE t.type=\"airport\"" + + "AND t.country LIKE '%States'" + + "AND t.geo.lat >= 70 " + + "LIMIT 2"; + N1qlQueryResult r4 = bucket.query(N1qlQuery.simple(query2)); + List list3 = extractJsonResult(r4); + System.out.println("First Doc : " + list3.get(0)); + } + + @Test + public void givenSelectStatementWithDSL2_whenQuery_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + Statement st2 = select( + x("t.city, t.airportname") + .concat(s(" (")).concat(x("t.faa")).concat(s(")")).as("portname_faa")) + .from(i("travel-sample").as("t")) + .where( x("t.type").eq(s("airport")) + .and(x("t.country").like(s("%States"))) + .and(x("t.geo.lat").gte(70))) + .limit(2); + N1qlQueryResult r5 = bucket.query(N1qlQuery.simple(st2)); + List list5 = extractJsonResult(r5); + System.out.println("First Doc : " + list5.get(0)); + System.out.println("Query from Statement2: " + st2.toString()); + } + + @Test + public void givenInsertStatement_whenQuery_thenUpdate() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query = "INSERT INTO `travel-sample` (KEY, VALUE) " + + " VALUES(" + + "\"cust1293\", " + + "{\"id\":\"1293\",\"name\":\"Sample Airline\", \"type\":\"airline\"})" + + " RETURNING META().id as docid, *"; + N1qlQueryResult r1 = bucket.query(N1qlQuery.simple(query)); + r1.forEach(System.out::println); + } + + @Test + public void givenDocument_whenInsert_thenResults() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + JsonObject ob = JsonObject.create() + .put("id", "1293") + .put("name", "Sample Airline") + .put("type", "airline"); + bucket.insert(JsonDocument.create("cust1295", ob)); + } + + @Test + public void givenDocuments_whenBatchInsert_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + int docsToCreate = 10; + List documents = new ArrayList<>(); + for (int i = 5; i < docsToCreate; i++) { + JsonObject content = JsonObject.create() + .put("id", i) + .put("type", "airline") + .put("name", "Sample Airline " + i); + documents.add(JsonDocument.create("cust_" + i, content)); + } + + List r5 = Observable + .from(documents) + .flatMap(doc -> bucket.async().insert(doc)) + .toList() + .last() + .toBlocking() + .single(); + + r5.forEach(System.out::println); + } + + @Test + public void givenUpdateStatement_whenQuery_thenUpdate() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query2 = "UPDATE `travel-sample` USE KEYS \"cust_1\" " + + "SET name=\"Sample Airline Updated\" RETURNING name"; + N1qlQueryResult result = bucket.query(N1qlQuery.simple(query2)); + result.forEach(System.out::println); + } + + @Test + public void givenDocument_whenUpsert_thenUpdate() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + JsonObject o2 = JsonObject.create() + .put("name", "Sample Airline Updated"); + bucket.upsert(JsonDocument.create("cust_1", o2)); + } + + @Test + public void givenUnestUpdateStatement_whenQuery_thenResult() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query3 = "UPDATE `travel-sample` USE KEYS \"cust_2\" " + + "UNSET name RETURNING *"; + N1qlQueryResult result1 = bucket.query(N1qlQuery.simple(query3)); + result1.forEach(System.out::println); + } + + @Test + public void givenDeleteStatement_whenQuery_thenDelete() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query4 = "DELETE FROM `travel-sample` USE KEYS \"cust_50\""; + N1qlQueryResult result4 = bucket.query(N1qlQuery.simple(query4)); + } + + @Test + public void givenDeleteStatement2_whenQuery_thenDelete() { + Bucket bucket = bucketFactory.getTravelSampleBucket(); + String query5 = "DELETE FROM `travel-sample` WHERE id = 0 RETURNING *"; + N1qlQueryResult result5 = bucket.query(N1qlQuery.simple(query5)); + } + + +}