From d66ff0ffa1446ab374a654f171e060051eb7392a Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Mon, 16 Jun 2025 16:23:10 +0300 Subject: [PATCH 1/3] feat: add preFilterExpression support to autocomplete requests --- .../client/AutocompleteRequest.java | 18 ++++++++++++++++++ .../io/constructor/client/ConstructorIO.java | 9 ++++++++- .../client/ConstructorIOAutocompleteTest.java | 19 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java b/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java index a17e8aec..3110a804 100644 --- a/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java +++ b/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java @@ -14,6 +14,7 @@ public class AutocompleteRequest { private Map> filters; private VariationsMap variationsMap; private Map>> filtersPerSection; + private String preFilterExpression; /** * Creates an autocomplete request @@ -31,6 +32,7 @@ public AutocompleteRequest(String query) throws IllegalArgumentException { this.filters = new HashMap>(); this.filtersPerSection = new HashMap>>(); this.variationsMap = null; + this.preFilterExpression = null; } /** @@ -116,4 +118,20 @@ public void setVariationsMap(VariationsMap variationsMap) { public VariationsMap getVariationsMap() { return variationsMap; } + + /** + * @param preFilterExpression the faceting expression to scope autocomplete results (JSON-encoded + * query string). Please refer to + * https://docs.constructor.com/reference/shared-filter-expressions + */ + public void setPreFilterExpression(String preFilterExpression) { + this.preFilterExpression = preFilterExpression; + } + + /** + * @return the prefilter expression + */ + public String getPreFilterExpression() { + return preFilterExpression; + } } diff --git a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java index c8e280d8..f9b18679 100644 --- a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java +++ b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java @@ -905,6 +905,14 @@ public String autocompleteAsJSON(AutocompleteRequest req, UserInfo userInfo) .build(); } + if (req.getPreFilterExpression() != null) { + url = + url.newBuilder() + .addQueryParameter( + "pre_filter_expression", req.getPreFilterExpression()) + .build(); + } + Request request = this.makeUserRequestBuilder(userInfo).url(url).get().build(); Response response = clientWithRetry.newCall(request).execute(); @@ -2725,7 +2733,6 @@ protected Request createQuizRequest(QuizRequestBase req, String type, UserInfo u List paths = Arrays.asList("v1", "quizzes", req.getQuizId(), type); HttpUrl url = this.makeUrl(paths); - if (req.getSection() != null) { url = url.newBuilder().addQueryParameter("section", req.getSection()).build(); } diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java index d8cbaea8..b6a3f0a5 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java @@ -289,4 +289,23 @@ public void AutocompleteShouldReturnAResultProvidedVariationsMapAsObject() throw variationsMap.getGroupBy().get(0).field, variationsMapFromResponse.getGroupBy().get(0).field); } + + @Test + public void autocompleteShouldReturnAResultWithPreFilterExpression() throws Exception { + ConstructorIO constructor = new ConstructorIO("", apiKey, true, null); + UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie"); + AutocompleteRequest request = new AutocompleteRequest("jacket"); + String preFilterExpression = + "{\"or\":[{\"and\":[{\"name\":\"group_id\",\"value\":\"electronics-group-id\"},{\"name\":\"Price\",\"range\":[\"-inf\",200.0]}]},{\"and\":[{\"name\":\"Type\",\"value\":\"Laptop\"},{\"not\":{\"name\":\"Price\",\"range\":[800.0,\"inf\"]}}]}]}"; + request.setPreFilterExpression(preFilterExpression); + + AutocompleteResponse response = constructor.autocomplete(request, userInfo); + String preFilterExpressionFromRequestJsonString = + new Gson().toJson(response.getRequest().get("pre_filter_expression")); + + assertTrue("autocomplete results exist", response.getSections().size() >= 0); + assertNotNull( + "pre_filter_expression exists", response.getRequest().get("pre_filter_expression")); + assertEquals(preFilterExpression, preFilterExpressionFromRequestJsonString); + } } From 57b6923a19ace3a766357bff4b00c89875c1214d Mon Sep 17 00:00:00 2001 From: Enes Kutay SEZEN Date: Mon, 16 Jun 2025 16:31:35 +0300 Subject: [PATCH 2/3] Lint --- .../main/java/io/constructor/client/AutocompleteRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java b/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java index 3110a804..7095de33 100644 --- a/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java +++ b/constructorio-client/src/main/java/io/constructor/client/AutocompleteRequest.java @@ -120,8 +120,8 @@ public VariationsMap getVariationsMap() { } /** - * @param preFilterExpression the faceting expression to scope autocomplete results (JSON-encoded - * query string). Please refer to + * @param preFilterExpression the faceting expression to scope autocomplete results + * (JSON-encoded query string). Please refer to * https://docs.constructor.com/reference/shared-filter-expressions */ public void setPreFilterExpression(String preFilterExpression) { From 5f2695081d9a562c36f6844bc1e52658f9cd10ca Mon Sep 17 00:00:00 2001 From: Islam Moustafa <58053149+mocca102@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:34:02 +0300 Subject: [PATCH 3/3] Update constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java --- .../io/constructor/client/ConstructorIOAutocompleteTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java index b6a3f0a5..1f41612b 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOAutocompleteTest.java @@ -291,7 +291,7 @@ public void AutocompleteShouldReturnAResultProvidedVariationsMapAsObject() throw } @Test - public void autocompleteShouldReturnAResultWithPreFilterExpression() throws Exception { + public void AutocompleteShouldReturnAResultWithPreFilterExpression() throws Exception { ConstructorIO constructor = new ConstructorIO("", apiKey, true, null); UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie"); AutocompleteRequest request = new AutocompleteRequest("jacket");