diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0eeb11eb2..74eff90d3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [2.8.0](https://github.com/googleapis/java-datastore/compare/v2.7.0...v2.8.0) (2022-06-09)
+
+
+### Features
+
+* support IN/NOT_IN/NOT_EQUAL operators ([#688](https://github.com/googleapis/java-datastore/issues/688)) ([f8a84ff](https://github.com/googleapis/java-datastore/commit/f8a84ffa6d743501f5cfb71ac271d8a9b764705c))
+
## [2.7.0](https://github.com/googleapis/java-datastore/compare/v2.6.0...v2.7.0) (2022-06-02)
diff --git a/README.md b/README.md
index cc6f5854f..3b3853f06 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file
com.google.cloud
libraries-bom
- 25.3.0
+ 25.4.0
pom
import
@@ -41,7 +41,7 @@ If you are using Maven without BOM, add this to your dependencies:
com.google.cloud
google-cloud-datastore
- 2.6.0
+ 2.7.0
```
@@ -49,20 +49,20 @@ If you are using Maven without BOM, add this to your dependencies:
If you are using Gradle 5.x or later, add this to your dependencies
```Groovy
-implementation platform('com.google.cloud:libraries-bom:25.3.0')
+implementation platform('com.google.cloud:libraries-bom:25.4.0')
implementation 'com.google.cloud:google-cloud-datastore'
```
If you are using Gradle without BOM, add this to your dependencies
```Groovy
-implementation 'com.google.cloud:google-cloud-datastore:2.6.0'
+implementation 'com.google.cloud:google-cloud-datastore:2.7.0'
```
If you are using SBT, add this to your dependencies
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-datastore" % "2.6.0"
+libraryDependencies += "com.google.cloud" % "google-cloud-datastore" % "2.7.0"
```
## Authentication
diff --git a/datastore-v1-proto-client/pom.xml b/datastore-v1-proto-client/pom.xml
index d6dce089b..8dd942d71 100644
--- a/datastore-v1-proto-client/pom.xml
+++ b/datastore-v1-proto-client/pom.xml
@@ -19,12 +19,12 @@
4.0.0
com.google.cloud.datastore
datastore-v1-proto-client
- 2.7.0
+ 2.8.0
com.google.cloud
google-cloud-datastore-parent
- 2.7.0
+ 2.8.0
jar
diff --git a/google-cloud-datastore-bom/pom.xml b/google-cloud-datastore-bom/pom.xml
index a1ec96109..f452f3022 100644
--- a/google-cloud-datastore-bom/pom.xml
+++ b/google-cloud-datastore-bom/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-datastore-bom
- 2.7.0
+ 2.8.0
pom
com.google.cloud
@@ -52,22 +52,22 @@
com.google.cloud
google-cloud-datastore
- 2.7.0
+ 2.8.0
com.google.api.grpc
grpc-google-cloud-datastore-admin-v1
- 2.7.0
+ 2.8.0
com.google.api.grpc
proto-google-cloud-datastore-v1
- 0.98.0
+ 0.99.0
com.google.api.grpc
proto-google-cloud-datastore-admin-v1
- 2.7.0
+ 2.8.0
diff --git a/google-cloud-datastore/pom.xml b/google-cloud-datastore/pom.xml
index 47481a1a6..49778e706 100644
--- a/google-cloud-datastore/pom.xml
+++ b/google-cloud-datastore/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-datastore
- 2.7.0
+ 2.8.0
jar
Google Cloud Datastore
https://github.com/googleapis/java-datastore
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-datastore-parent
- 2.7.0
+ 2.8.0
google-cloud-datastore
diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/StructuredQuery.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/StructuredQuery.java
index 63318a090..8e50d0867 100644
--- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/StructuredQuery.java
+++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/StructuredQuery.java
@@ -272,7 +272,10 @@ public Operator apply(String constant) {
static final Operator GREATER_THAN = type.createAndRegister("GREATER_THAN");
static final Operator GREATER_THAN_OR_EQUAL = type.createAndRegister("GREATER_THAN_OR_EQUAL");
static final Operator EQUAL = type.createAndRegister("EQUAL");
+ static final Operator IN = type.createAndRegister("IN");
+ static final Operator NOT_EQUAL = type.createAndRegister("NOT_EQUAL");
static final Operator HAS_ANCESTOR = type.createAndRegister("HAS_ANCESTOR");
+ static final Operator NOT_IN = type.createAndRegister("NOT_IN");
com.google.datastore.v1.PropertyFilter.Operator toPb() {
return com.google.datastore.v1.PropertyFilter.Operator.valueOf(name());
@@ -502,6 +505,46 @@ public static PropertyFilter eq(String property, Blob value) {
return new PropertyFilter(property, Operator.EQUAL, of(value));
}
+ public static PropertyFilter neq(String property, Value> value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, value);
+ }
+
+ public static PropertyFilter neq(String property, String value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter neq(String property, long value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter neq(String property, double value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter neq(String property, boolean value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter neq(String property, Timestamp value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter neq(String property, Key value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter neq(String property, Blob value) {
+ return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
+ }
+
+ public static PropertyFilter in(String property, ListValue value) {
+ return new PropertyFilter(property, Operator.IN, value);
+ }
+
+ public static PropertyFilter not_in(String property, ListValue value) {
+ return new PropertyFilter(property, Operator.NOT_IN, value);
+ }
+
public static PropertyFilter hasAncestor(Key key) {
return new PropertyFilter(KEY_PROPERTY_NAME, Operator.HAS_ANCESTOR, of(key));
}
diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java
index 21acf598c..869984932 100644
--- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java
+++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java
@@ -583,6 +583,83 @@ public void testRunStructuredQuery() throws InterruptedException {
assertFalse(results4.hasNext());
}
+ @Test
+ public void testInNotInNeqFilters() throws InterruptedException {
+ Entity e1 =
+ Entity.newBuilder(ENTITY1)
+ .setKey(Key.newBuilder(INCOMPLETE_KEY1, "e1").build())
+ .set("v_int", 10)
+ .build();
+ Entity e2 =
+ Entity.newBuilder(ENTITY1)
+ .setKey(Key.newBuilder(INCOMPLETE_KEY1, "e2").build())
+ .set("v_int", 20)
+ .build();
+ DATASTORE.put(e1, e2);
+
+ Query queryIn =
+ Query.newEntityQueryBuilder()
+ .setKind(KIND1)
+ .setFilter(PropertyFilter.in("v_int", ListValue.of(10, 20)))
+ .build();
+
+ Query scQueryIn =
+ Query.newEntityQueryBuilder()
+ .setKind(KIND1)
+ .setFilter(PropertyFilter.hasAncestor(ROOT_KEY))
+ .setFilter(PropertyFilter.in("v_int", ListValue.of(10, 20)))
+ .build();
+
+ Iterator resultIn = getStronglyConsistentResults(scQueryIn, queryIn);
+
+ assertTrue(resultIn.hasNext());
+ assertEquals(e1, resultIn.next());
+ assertTrue(resultIn.hasNext());
+ assertEquals(e2, resultIn.next());
+ assertFalse(resultIn.hasNext());
+
+ Query queryNotIn =
+ Query.newEntityQueryBuilder()
+ .setKind(KIND1)
+ .setFilter(PropertyFilter.not_in("v_int", ListValue.of(20, 30)))
+ .build();
+
+ Query scQueryNotIn =
+ Query.newEntityQueryBuilder()
+ .setKind(KIND1)
+ .setFilter(PropertyFilter.hasAncestor(ROOT_KEY))
+ .setFilter(PropertyFilter.not_in("v_int", ListValue.of(20, 30)))
+ .build();
+
+ Iterator resultNotIn = getStronglyConsistentResults(scQueryNotIn, queryNotIn);
+
+ assertTrue(resultNotIn.hasNext());
+ assertEquals(e1, resultNotIn.next());
+ assertFalse(resultNotIn.hasNext());
+
+ Query queryNeq =
+ Query.newEntityQueryBuilder()
+ .setKind(KIND1)
+ .setFilter(PropertyFilter.neq("v_int", 10))
+ .build();
+
+ Query scQueryNeq =
+ Query.newEntityQueryBuilder()
+ .setKind(KIND1)
+ .setFilter(PropertyFilter.hasAncestor(ROOT_KEY))
+ .setFilter(PropertyFilter.neq("v_int", 10))
+ .build();
+
+ Iterator resultNeq = getStronglyConsistentResults(scQueryNeq, queryNeq);
+
+ assertTrue(resultNeq.hasNext());
+ assertEquals(e2, resultNeq.next());
+ assertFalse(resultNeq.hasNext());
+
+ DATASTORE.delete(e1.getKey());
+ DATASTORE.delete(e2.getKey());
+ }
+
@Test
public void testAllocateId() {
KeyFactory keyFactory = DATASTORE.newKeyFactory().setKind(KIND1);
diff --git a/grpc-google-cloud-datastore-admin-v1/pom.xml b/grpc-google-cloud-datastore-admin-v1/pom.xml
index e5b1ba8c1..6e2eb88fd 100644
--- a/grpc-google-cloud-datastore-admin-v1/pom.xml
+++ b/grpc-google-cloud-datastore-admin-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-datastore-admin-v1
- 2.7.0
+ 2.8.0
grpc-google-cloud-datastore-admin-v1
GRPC library for google-cloud-datastore
com.google.cloud
google-cloud-datastore-parent
- 2.7.0
+ 2.8.0
diff --git a/pom.xml b/pom.xml
index 7cd990fd3..b10de9616 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-datastore-parent
pom
- 2.7.0
+ 2.8.0
Google Cloud Datastore Parent
https://github.com/googleapis/java-datastore
@@ -159,27 +159,27 @@
com.google.api.grpc
proto-google-cloud-datastore-admin-v1
- 2.7.0
+ 2.8.0
com.google.api.grpc
grpc-google-cloud-datastore-admin-v1
- 2.7.0
+ 2.8.0
com.google.cloud
google-cloud-datastore
- 2.7.0
+ 2.8.0
com.google.api.grpc
proto-google-cloud-datastore-v1
- 0.98.0
+ 0.99.0
com.google.cloud.datastore
datastore-v1-proto-client
- 2.7.0
+ 2.8.0
com.google.api.grpc
diff --git a/proto-google-cloud-datastore-admin-v1/pom.xml b/proto-google-cloud-datastore-admin-v1/pom.xml
index bc010fd3b..81fe70639 100644
--- a/proto-google-cloud-datastore-admin-v1/pom.xml
+++ b/proto-google-cloud-datastore-admin-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-datastore-admin-v1
- 2.7.0
+ 2.8.0
proto-google-cloud-datastore-admin-v1
Proto library for google-cloud-datastore
com.google.cloud
google-cloud-datastore-parent
- 2.7.0
+ 2.8.0
diff --git a/proto-google-cloud-datastore-v1/pom.xml b/proto-google-cloud-datastore-v1/pom.xml
index e88bf74b0..2cd67b83c 100644
--- a/proto-google-cloud-datastore-v1/pom.xml
+++ b/proto-google-cloud-datastore-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-datastore-v1
- 0.98.0
+ 0.99.0
proto-google-cloud-datastore-v1
PROTO library for proto-google-cloud-datastore-v1
com.google.cloud
google-cloud-datastore-parent
- 2.7.0
+ 2.8.0
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index bd84bbd28..e410952e4 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -29,7 +29,7 @@
com.google.cloud
google-cloud-datastore
- 2.6.0
+ 2.7.0
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index 93eb45f2b..7e9801d03 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
libraries-bom
- 25.3.0
+ 25.4.0
pom
import
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index fa891d634..0643927f1 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
google-cloud-datastore
- 2.6.0
+ 2.7.0
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 0df17e88b..720a81c88 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -30,7 +30,7 @@
com.google.cloud
libraries-bom
- 25.3.0
+ 25.4.0
pom
import
diff --git a/versions.txt b/versions.txt
index 9db4188a8..9e1dc1b27 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,9 +1,9 @@
# Format:
# module:released-version:current-version
-google-cloud-datastore:2.7.0:2.7.0
-google-cloud-datastore-bom:2.7.0:2.7.0
-proto-google-cloud-datastore-v1:0.98.0:0.98.0
-datastore-v1-proto-client:2.7.0:2.7.0
-proto-google-cloud-datastore-admin-v1:2.7.0:2.7.0
-grpc-google-cloud-datastore-admin-v1:2.7.0:2.7.0
+google-cloud-datastore:2.8.0:2.8.0
+google-cloud-datastore-bom:2.8.0:2.8.0
+proto-google-cloud-datastore-v1:0.99.0:0.99.0
+datastore-v1-proto-client:2.8.0:2.8.0
+proto-google-cloud-datastore-admin-v1:2.8.0:2.8.0
+grpc-google-cloud-datastore-admin-v1:2.8.0:2.8.0