From 3d2872184afb2d46160b800f7457acc68ecd0747 Mon Sep 17 00:00:00 2001 From: Gerrit Meier Date: Thu, 5 Mar 2020 16:02:50 +0100 Subject: [PATCH] Ignore case for additional filters. This commits introduces support for starting and ending with in combination with ignore case. --- .../java/org/neo4j/ogm/cypher/Filter.java | 2 +- .../ogm/cypher/FilterIntegrationTest.java | 35 ++++++++++++++++++- .../java/org/neo4j/ogm/cypher/FilterTest.java | 22 ++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/neo4j/ogm/cypher/Filter.java b/core/src/main/java/org/neo4j/ogm/cypher/Filter.java index d727018828..a9736631c2 100644 --- a/core/src/main/java/org/neo4j/ogm/cypher/Filter.java +++ b/core/src/main/java/org/neo4j/ogm/cypher/Filter.java @@ -191,7 +191,7 @@ public Filter ignoreCase() { throw new IllegalStateException("ignoreCase is only supported for a filter based on property comparison"); } else { PropertyComparison propertyComparision = (PropertyComparison) this.function; - if (!EnumSet.of(EQUALS, CONTAINING).contains(propertyComparision.getOperator())) { + if (!EnumSet.of(EQUALS, CONTAINING, STARTING_WITH, ENDING_WITH).contains(propertyComparision.getOperator())) { throw new IllegalStateException( String.format("ignoreCase is only supported for %s or %s comparison", EQUALS.name(), CONTAINING.name()) diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterIntegrationTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterIntegrationTest.java index 8133937813..37c8ef5a28 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterIntegrationTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterIntegrationTest.java @@ -58,7 +58,7 @@ public void clear() { } @Test - public void ignoreCaseShouldNotBeApplicableToComparisonOtherThanEquals() { + public void ignoreCaseShouldBeApplicableToEquals() { final String emi = "EMI Studios, London"; session.save(new Studio(emi)); final Filter nameFilter = new Filter("name", ComparisonOperator.EQUALS, "eMi Studios, London").ignoreCase(); @@ -67,4 +67,37 @@ public void ignoreCaseShouldNotBeApplicableToComparisonOtherThanEquals() { .extracting(Studio::getName) .containsExactly(emi); } + + @Test + public void ignoreCaseShouldBeApplicableToContaining() { + final String emi = "EMI Studios, London"; + session.save(new Studio(emi)); + final Filter nameFilter = new Filter("name", ComparisonOperator.CONTAINING, "STUDIO").ignoreCase(); + assertThat(session.loadAll(Studio.class, nameFilter, 0)) + .hasSize(1) + .extracting(Studio::getName) + .containsExactly(emi); + } + + @Test + public void ignoreCaseShouldBeApplicableToStartingWith() { + final String emi = "EMI Studios, London"; + session.save(new Studio(emi)); + final Filter nameFilter = new Filter("name", ComparisonOperator.STARTING_WITH, "em").ignoreCase(); + assertThat(session.loadAll(Studio.class, nameFilter, 0)) + .hasSize(1) + .extracting(Studio::getName) + .containsExactly(emi); + } + + @Test + public void ignoreCaseShouldBeApplicableToEndingWith() { + final String emi = "EMI Studios, London"; + session.save(new Studio(emi)); + final Filter nameFilter = new Filter("name", ComparisonOperator.ENDING_WITH, "london").ignoreCase(); + assertThat(session.loadAll(Studio.class, nameFilter, 0)) + .hasSize(1) + .extracting(Studio::getName) + .containsExactly(emi); + } } diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterTest.java index dfc5fb496d..392b6a2688 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/cypher/FilterTest.java @@ -132,6 +132,28 @@ public void equalComparisionShouldWork() { assertThat(filter.toCypher("n", true)).isEqualTo("WHERE toLower(n.`thing`) = toLower($`thing_0`) "); } + @Test + public void startingWithComparisionShouldWork() { + final String value = "someOtherThing"; + Filter filter = new Filter("thing", ComparisonOperator.STARTING_WITH, value); + assertThat(filter.toCypher("n", true)).isEqualTo("WHERE n.`thing` STARTS WITH $`thing_0` "); + + filter = new Filter("thing", ComparisonOperator.STARTING_WITH, value); + filter.ignoreCase(); + assertThat(filter.toCypher("n", true)).isEqualTo("WHERE toLower(n.`thing`) STARTS WITH toLower($`thing_0`) "); + } + + @Test + public void endingWithComparisionShouldWork() { + final String value = "someOtherThing"; + Filter filter = new Filter("thing", ComparisonOperator.ENDING_WITH, value); + assertThat(filter.toCypher("n", true)).isEqualTo("WHERE n.`thing` ENDS WITH $`thing_0` "); + + filter = new Filter("thing", ComparisonOperator.ENDING_WITH, value); + filter.ignoreCase(); + assertThat(filter.toCypher("n", true)).isEqualTo("WHERE toLower(n.`thing`) ENDS WITH toLower($`thing_0`) "); + } + @Test public void containingComparisionShouldWork() { final String value = "someOtherThing";