Skip to content

Commit 156c1c0

Browse files
committed
fix: Missing price list argument. You can use priceList or priceLists parameter for specifying custom price list
Corrected filter / order by unwrapping logic and correctly initializing price related context. Refs: #953
1 parent 356ef51 commit 156c1c0

File tree

4 files changed

+36
-15
lines changed

4 files changed

+36
-15
lines changed

evita_api/src/main/java/io/evitadb/api/requestResponse/EvitaRequest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ public EvitaRequest(
333333
"Query can not contain more than one price in price lists filter constraints!"
334334
);
335335
if (priceInPriceLists.isEmpty()) {
336+
this.priceLists = evitaRequest.priceLists;
336337
this.requiresPriceLists = evitaRequest.requiresPriceLists;
337338
} else {
338339
final Optional<PriceInPriceLists> pricesInPriceList = Optional.of(priceInPriceLists.get(0));

evita_engine/src/main/java/io/evitadb/core/query/ReferencedEntityFetcher.java

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,16 @@
3333
import com.carrotsearch.hppc.cursors.IntObjectCursor;
3434
import io.evitadb.api.EntityCollectionContract;
3535
import io.evitadb.api.EvitaSessionContract;
36-
import io.evitadb.api.query.Constraint;
3736
import io.evitadb.api.query.FilterConstraint;
37+
import io.evitadb.api.query.OrderConstraint;
3838
import io.evitadb.api.query.filter.EntityHaving;
39+
import io.evitadb.api.query.filter.EntityLocaleEquals;
3940
import io.evitadb.api.query.filter.EntityPrimaryKeyInSet;
4041
import io.evitadb.api.query.filter.FilterBy;
4142
import io.evitadb.api.query.filter.ReferenceHaving;
43+
import io.evitadb.api.query.order.EntityPrimaryKeyExact;
44+
import io.evitadb.api.query.order.EntityPrimaryKeyInFilter;
45+
import io.evitadb.api.query.order.EntityPrimaryKeyNatural;
4246
import io.evitadb.api.query.order.EntityProperty;
4347
import io.evitadb.api.query.order.OrderBy;
4448
import io.evitadb.api.query.require.DefaultPrefetchRequirementCollector;
@@ -141,6 +145,8 @@
141145

142146
import static io.evitadb.api.query.QueryConstraints.and;
143147
import static io.evitadb.api.query.QueryConstraints.entityPrimaryKeyInSet;
148+
import static io.evitadb.api.query.QueryConstraints.filterBy;
149+
import static io.evitadb.api.query.QueryConstraints.orderBy;
144150
import static io.evitadb.core.query.extraResult.translator.hierarchyStatistics.AbstractHierarchyTranslator.stopAtConstraintToPredicate;
145151
import static java.util.Optional.ofNullable;
146152

@@ -264,12 +270,17 @@ private static Map<Integer, ServerEntityDecorator> fetchReferencedEntities(
264270
private static FilterBy unwrapFilterBy(@Nullable FilterBy entityFilterBy) {
265271
final FilterBy unwrappedEntityFilterBy;
266272
if (entityFilterBy != null) {
267-
final Constraint<?> entityHavingConstraint = FinderVisitor.findConstraint(entityFilterBy, EntityHaving.class::isInstance, EntityHaving.class::isInstance);
268-
if (entityHavingConstraint instanceof EntityHaving eh) {
269-
unwrappedEntityFilterBy = new FilterBy(eh.getChildren());
270-
} else {
271-
unwrappedEntityFilterBy = null;
272-
}
273+
final List<FilterConstraint> entityConstraints = FinderVisitor.findConstraints(
274+
entityFilterBy,
275+
it -> it instanceof EntityHaving || it instanceof EntityPrimaryKeyInSet || it instanceof EntityLocaleEquals,
276+
EntityHaving.class::isInstance
277+
);
278+
unwrappedEntityFilterBy = filterBy(
279+
entityConstraints
280+
.stream()
281+
.flatMap(it -> it instanceof EntityHaving eh ? Arrays.stream(eh.getChildren()) : Stream.of(it))
282+
.toArray(FilterConstraint[]::new)
283+
);
273284
} else {
274285
unwrappedEntityFilterBy = null;
275286
}
@@ -288,12 +299,20 @@ private static FilterBy unwrapFilterBy(@Nullable FilterBy entityFilterBy) {
288299
private static OrderBy unwrapOrderBy(@Nullable OrderBy entityOrderBy) {
289300
final OrderBy unwrappedEntityFilterBy;
290301
if (entityOrderBy != null) {
291-
final Constraint<?> entityProperty = FinderVisitor.findConstraint(entityOrderBy, EntityProperty.class::isInstance, EntityProperty.class::isInstance);
292-
if (entityProperty instanceof EntityProperty ep) {
293-
unwrappedEntityFilterBy = new OrderBy(ep.getChildren());
294-
} else {
295-
unwrappedEntityFilterBy = null;
296-
}
302+
final List<OrderConstraint> entityConstraints = FinderVisitor.findConstraints(
303+
entityOrderBy,
304+
it -> it instanceof EntityProperty ||
305+
it instanceof EntityPrimaryKeyExact ||
306+
it instanceof EntityPrimaryKeyNatural ||
307+
it instanceof EntityPrimaryKeyInFilter,
308+
EntityProperty.class::isInstance
309+
);
310+
unwrappedEntityFilterBy = orderBy(
311+
entityConstraints
312+
.stream()
313+
.flatMap(it -> it instanceof EntityProperty eh ? Arrays.stream(eh.getChildren()) : Stream.of(it))
314+
.toArray(OrderConstraint[]::new)
315+
);
297316
} else {
298317
unwrappedEntityFilterBy = null;
299318
}

evita_engine/src/main/java/module-info.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@
9999

100100
requires jdk.jfr;
101101
requires net.bytebuddy;
102-
requires java.sql;
103-
requires jdk.jdi;
104102
requires proxycian.bytebuddy;
105103

106104
opens io.evitadb.core.metric.event to evita.common;

evita_functional_tests/src/test/java/io/evitadb/api/functional/fetch/EntityFetchingFunctionalTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3299,8 +3299,11 @@ void shouldEagerlyDeepFetchReferenceEntityBodiesFilteredAndOrderedViaGetEntity(E
32993299
final String[] receivedOrderedNames = references.stream()
33003300
.map(it -> it.getReferencedEntity().orElseThrow())
33013301
.map(it -> it.getAttribute(ATTRIBUTE_NAME, String.class))
3302+
.filter(Objects::nonNull)
33023303
.toArray(String[]::new);
33033304

3305+
assertEquals(references.size(), receivedOrderedNames.length);
3306+
33043307
final Collator collator = Collator.getInstance(CZECH_LOCALE);
33053308
assertArrayEquals(
33063309
Arrays.stream(receivedOrderedNames)

0 commit comments

Comments
 (0)