Skip to content

Commit f49e5e4

Browse files
authored
[CI-38165] Add preFilterExpressions, term support to recs (#143)
* add preFilterExpressions, term support to recs * remove unused * lint
1 parent 84d7cb3 commit f49e5e4

File tree

4 files changed

+82
-1
lines changed

4 files changed

+82
-1
lines changed

constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,6 +1747,10 @@ public String recommendationsAsJSON(RecommendationsRequest req, UserInfo userInf
17471747
}
17481748
}
17491749

1750+
if (StringUtils.isNotBlank(req.getTerm())) {
1751+
url = url.newBuilder().addQueryParameter("term", req.getTerm()).build();
1752+
}
1753+
17501754
if (req.getFacets() != null) {
17511755
for (String facetName : req.getFacets().keySet()) {
17521756
for (String facetValue : req.getFacets().get(facetName)) {
@@ -1766,6 +1770,14 @@ public String recommendationsAsJSON(RecommendationsRequest req, UserInfo userInf
17661770
.build();
17671771
}
17681772

1773+
if (req.getPreFilterExpression() != null) {
1774+
url =
1775+
url.newBuilder()
1776+
.addQueryParameter(
1777+
"pre_filter_expression", req.getPreFilterExpression())
1778+
.build();
1779+
}
1780+
17691781
Request request = this.makeUserRequestBuilder(userInfo).url(url).get().build();
17701782

17711783
Response response = clientWithRetry.newCall(request).execute();

constructorio-client/src/main/java/io/constructor/client/RecommendationsRequest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
public class RecommendationsRequest {
99

1010
private String podId;
11+
private String term;
1112
private int numResults;
1213
private List<String> itemIds;
1314
private Map<String, List<String>> facets;
1415
private String section;
16+
private String preFilterExpression;
1517
private VariationsMap variationsMap;
1618

1719
/**
@@ -27,8 +29,10 @@ public RecommendationsRequest(String podId) throws IllegalArgumentException {
2729
this.podId = podId;
2830
this.numResults = 10;
2931
this.itemIds = null;
32+
this.term = null;
3033
this.section = "Products";
3134
this.variationsMap = null;
35+
this.preFilterExpression = null;
3236
this.facets = new HashMap<String, List<String>>();
3337
}
3438

@@ -46,6 +50,20 @@ public String getPodId() {
4650
return podId;
4751
}
4852

53+
/**
54+
* @param term the term to set (required for query recommendations pods)
55+
*/
56+
public void setTerm(String term) {
57+
this.term = term;
58+
}
59+
60+
/**
61+
* @return the term
62+
*/
63+
public String getTerm() {
64+
return term;
65+
}
66+
4967
/**
5068
* @param numResults the num results to set
5169
*/
@@ -115,4 +133,20 @@ public void setFacets(Map<String, List<String>> facets) {
115133
public Map<String, List<String>> getFacets() {
116134
return facets;
117135
}
136+
137+
/**
138+
* @param preFilterExpression the faceting expression to scope recommendation results
139+
* (JSON-encoded query string). Please refer to
140+
* https://docs.constructor.io/rest_api/collections#add-items-dynamically
141+
*/
142+
public void setPreFilterExpression(String preFilterExpression) {
143+
this.preFilterExpression = preFilterExpression;
144+
}
145+
146+
/**
147+
* @return the prefilter expression
148+
*/
149+
public String getPreFilterExpression() {
150+
return preFilterExpression;
151+
}
118152
}

constructorio-client/src/test/java/io/constructor/client/ConstructorIORecommendationsTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,34 @@ public void getRecommendationsShouldReturnAResultWithFilters() throws Exception
109109
assertTrue("recommendation results exist", response.getResponse().getResults().size() > 0);
110110
assertTrue("recommendation result id exists", response.getResultId() != null);
111111
}
112+
113+
@Test
114+
public void getRecommendationsShouldReturnAResultWithPreFilterExpression() throws Exception {
115+
ConstructorIO constructor = new ConstructorIO("", apiKey, true, null);
116+
UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie");
117+
RecommendationsRequest request = new RecommendationsRequest("filtered_items");
118+
String preFilterExpression =
119+
"{\"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\"]}}]}]}";
120+
request.setPreFilterExpression(preFilterExpression);
121+
122+
RecommendationsResponse response = constructor.recommendations(request, userInfo);
123+
String preFilterExpressionFromRequestJsonString =
124+
new Gson().toJson(response.getRequest().get("pre_filter_expression"));
125+
126+
assertEquals(preFilterExpression, preFilterExpressionFromRequestJsonString);
127+
assertTrue("recommendation result id exists", response.getResultId() != null);
128+
}
129+
130+
@Test
131+
public void getRecommendationsShouldReturnAResultTerm() throws Exception {
132+
ConstructorIO constructor = new ConstructorIO("", apiKey, true, null);
133+
UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie");
134+
RecommendationsRequest request = new RecommendationsRequest("query_recommendations");
135+
request.setTerm("test");
136+
137+
RecommendationsResponse response = constructor.recommendations(request, userInfo);
138+
139+
assertEquals(response.getRequest().get("term"), "test");
140+
assertTrue("recommendation result id exists", response.getResultId() != null);
141+
}
112142
}

constructorio-client/src/test/java/io/constructor/client/RecommendationsRequestTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.constructor.client;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNull;
45

56
import java.util.Arrays;
67
import java.util.HashMap;
@@ -33,14 +34,16 @@ public void newShouldReturnDefaultProperties() throws Exception {
3334
RecommendationsRequest request = new RecommendationsRequest(podId);
3435
assertEquals(request.getPodId(), podId);
3536
assertEquals(request.getNumResults(), 10);
36-
assertEquals(request.getItemIds(), null);
37+
assertNull(request.getItemIds());
38+
assertNull(request.getTerm());
3739
assertEquals(request.getSection(), "Products");
3840
assertEquals(request.getFacets().size(), 0);
3941
}
4042

4143
@Test
4244
public void settersShouldSet() throws Exception {
4345
String podId = "home_page_1";
46+
String term = "test_term";
4447
RecommendationsRequest request = new RecommendationsRequest(podId);
4548
Map<String, List<String>> facets = new HashMap<String, List<String>>();
4649
facets.put("Flavors", Arrays.asList("Honey Roasted", "Dry Roasted", "Unsalted"));
@@ -50,10 +53,12 @@ public void settersShouldSet() throws Exception {
5053
request.setItemIds(Arrays.asList("1", "2", "3"));
5154
request.setSection("Search Suggestions");
5255
request.setFacets(facets);
56+
request.setTerm(term);
5357

5458
assertEquals(request.getPodId(), "zero_results_1");
5559
assertEquals(request.getNumResults(), 3);
5660
assertEquals(request.getSection(), "Search Suggestions");
5761
assertEquals(request.getFacets(), facets);
62+
assertEquals(request.getTerm(), term);
5863
}
5964
}

0 commit comments

Comments
 (0)