Skip to content

Commit f8a84ff

Browse files
feat: support IN/NOT_IN/NOT_EQUAL operators (#688)
* feat: add support for IN/NOT_IN/NOT_EQUAL operator * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 1fd764f commit f8a84ff

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
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

+77
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,83 @@ public void testRunStructuredQuery() throws InterruptedException {
583583
assertFalse(results4.hasNext());
584584
}
585585

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

0 commit comments

Comments
 (0)