Skip to content

Commit 561f061

Browse files
committed
feat: add support for IN/NOT_IN/NOT_EQUAL operator
1 parent 73786bd commit 561f061

File tree

2 files changed

+116
-2
lines changed

2 files changed

+116
-2
lines changed

google-cloud-datastore/src/main/java/com/google/cloud/datastore/StructuredQuery.java

+43
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,10 @@ public Operator apply(String constant) {
272272
static final Operator GREATER_THAN = type.createAndRegister("GREATER_THAN");
273273
static final Operator GREATER_THAN_OR_EQUAL = type.createAndRegister("GREATER_THAN_OR_EQUAL");
274274
static final Operator EQUAL = type.createAndRegister("EQUAL");
275+
static final Operator IN = type.createAndRegister("IN");
276+
static final Operator NOT_EQUAL = type.createAndRegister("NOT_EQUAL");
275277
static final Operator HAS_ANCESTOR = type.createAndRegister("HAS_ANCESTOR");
278+
static final Operator NOT_IN = type.createAndRegister("NOT_IN");
276279

277280
com.google.datastore.v1.PropertyFilter.Operator toPb() {
278281
return com.google.datastore.v1.PropertyFilter.Operator.valueOf(name());
@@ -502,6 +505,46 @@ public static PropertyFilter eq(String property, Blob value) {
502505
return new PropertyFilter(property, Operator.EQUAL, of(value));
503506
}
504507

508+
public static PropertyFilter neq(String property, Value<?> value) {
509+
return new PropertyFilter(property, Operator.NOT_EQUAL, value);
510+
}
511+
512+
public static PropertyFilter neq(String property, String value) {
513+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
514+
}
515+
516+
public static PropertyFilter neq(String property, long value) {
517+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
518+
}
519+
520+
public static PropertyFilter neq(String property, double value) {
521+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
522+
}
523+
524+
public static PropertyFilter neq(String property, boolean value) {
525+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
526+
}
527+
528+
public static PropertyFilter neq(String property, Timestamp value) {
529+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
530+
}
531+
532+
public static PropertyFilter neq(String property, Key value) {
533+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
534+
}
535+
536+
public static PropertyFilter neq(String property, Blob value) {
537+
return new PropertyFilter(property, Operator.NOT_EQUAL, of(value));
538+
}
539+
540+
public static PropertyFilter in(String property, ListValue value) {
541+
return new PropertyFilter(property, Operator.IN, value);
542+
}
543+
544+
public static PropertyFilter not_in(String property, ListValue value) {
545+
return new PropertyFilter(property, Operator.NOT_IN, value);
546+
}
547+
505548
public static PropertyFilter hasAncestor(Key key) {
506549
return new PropertyFilter(KEY_PROPERTY_NAME, Operator.HAS_ANCESTOR, of(key));
507550
}

google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java

+73-2
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,11 @@ public class ITDatastoreTest {
153153
.set("partial2", ENTITY2)
154154
.build();
155155

156-
@Rule public Timeout globalTimeout = Timeout.seconds(100);
156+
@Rule
157+
public Timeout globalTimeout = Timeout.seconds(100);
157158

158-
@Rule public MultipleAttemptsRule multipleAttemptsRule = new MultipleAttemptsRule(3);
159+
@Rule
160+
public MultipleAttemptsRule multipleAttemptsRule = new MultipleAttemptsRule(3);
159161

160162
@AfterClass
161163
public static void afterClass() {
@@ -582,6 +584,75 @@ public void testRunStructuredQuery() throws InterruptedException {
582584
assertFalse(results4.hasNext());
583585
}
584586

587+
@Test
588+
public void testInNotInNeqFilters() throws InterruptedException {
589+
Entity e1 = Entity.newBuilder(ENTITY1)
590+
.setKey(Key.newBuilder(INCOMPLETE_KEY1, "e1").build())
591+
.set("v_int", 10)
592+
.build();
593+
Entity e2 = Entity.newBuilder(ENTITY1)
594+
.setKey(Key.newBuilder(INCOMPLETE_KEY1, "e2").build())
595+
.set("v_int", 20)
596+
.build();
597+
DATASTORE.put(e1, e2);
598+
599+
Query<Entity> queryIn =
600+
Query.newEntityQueryBuilder().setKind(KIND1)
601+
.setFilter(PropertyFilter.in("v_int", ListValue.of(10, 20))).build();
602+
603+
Query<Entity> scQueryIn =
604+
Query.newEntityQueryBuilder()
605+
.setKind(KIND1)
606+
.setFilter(PropertyFilter.hasAncestor(ROOT_KEY))
607+
.setFilter(PropertyFilter.in("v_int", ListValue.of(10, 20)))
608+
.build();
609+
610+
Iterator<Entity> resultIn = getStronglyConsistentResults(scQueryIn, queryIn);
611+
612+
assertTrue(resultIn.hasNext());
613+
assertEquals(e1, resultIn.next());
614+
assertTrue(resultIn.hasNext());
615+
assertEquals(e2, resultIn.next());
616+
assertFalse(resultIn.hasNext());
617+
618+
Query<Entity> queryNotIn =
619+
Query.newEntityQueryBuilder().setKind(KIND1)
620+
.setFilter(PropertyFilter.not_in("v_int", ListValue.of(20, 30))).build();
621+
622+
Query<Entity> scQueryNotIn =
623+
Query.newEntityQueryBuilder()
624+
.setKind(KIND1)
625+
.setFilter(PropertyFilter.hasAncestor(ROOT_KEY))
626+
.setFilter(PropertyFilter.not_in("v_int", ListValue.of(20, 30)))
627+
.build();
628+
629+
Iterator<Entity> resultNotIn = getStronglyConsistentResults(scQueryNotIn, queryNotIn);
630+
631+
assertTrue(resultNotIn.hasNext());
632+
assertEquals(e1, resultNotIn.next());
633+
assertFalse(resultNotIn.hasNext());
634+
635+
Query<Entity> queryNeq =
636+
Query.newEntityQueryBuilder().setKind(KIND1)
637+
.setFilter(PropertyFilter.neq("v_int", 10)).build();
638+
639+
Query<Entity> scQueryNeq =
640+
Query.newEntityQueryBuilder()
641+
.setKind(KIND1)
642+
.setFilter(PropertyFilter.hasAncestor(ROOT_KEY))
643+
.setFilter(PropertyFilter.neq("v_int", 10))
644+
.build();
645+
646+
Iterator<Entity> resultNeq = getStronglyConsistentResults(scQueryNeq, queryNeq);
647+
648+
assertTrue(resultNeq.hasNext());
649+
assertEquals(e2, resultNeq.next());
650+
assertFalse(resultNeq.hasNext());
651+
652+
DATASTORE.delete(e1.getKey());
653+
DATASTORE.delete(e2.getKey());
654+
}
655+
585656
@Test
586657
public void testAllocateId() {
587658
KeyFactory keyFactory = DATASTORE.newKeyFactory().setKind(KIND1);

0 commit comments

Comments
 (0)