Skip to content

Commit

Permalink
Merge pull request #705 from FgForrest/repeated-fix-701
Browse files Browse the repository at this point in the history
fix(#701): When fetched references are ordered, implicit request reso…
  • Loading branch information
novoj authored Oct 22, 2024
2 parents 2495774 + 6b2a802 commit 5ae34f3
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,7 @@ private static RequirementContext getRequirementContext(
) {
return new RequirementContext(
referenceContent.getManagedReferencesBehaviour(),
new AttributeRequest(
attributeContent == null ? Collections.emptySet() : attributeContent.getAttributeNamesAsSet(),
attributeContent != null
),
attributeContent,
referenceContent.getEntityRequirement().orElse(null),
referenceContent.getGroupEntityRequirement().orElse(null),
referenceContent.getFilterBy().orElse(null),
Expand Down Expand Up @@ -957,21 +954,36 @@ private enum ResultForm {
* and group entity for fast access in this evita request instance.
*
* @param managedReferencesBehaviour controls behaviour of excluding missing managed references
* @param attributeRequest requested attributes for the entity reference
* @param attributeContent requested attributes for the entity reference
* @param entityFetch requirements related to fetching related entity
* @param entityGroupFetch requirements related to fetching related entity group
* @param filterBy filtering constraints for entities
* @param orderBy ordering constraints for entities
*/
public record RequirementContext(
@Nonnull ManagedReferencesBehaviour managedReferencesBehaviour,
@Nonnull AttributeRequest attributeRequest,
@Nullable AttributeContent attributeContent,
@Nullable EntityFetch entityFetch,
@Nullable EntityGroupFetch entityGroupFetch,
@Nullable FilterBy filterBy,
@Nullable OrderBy orderBy
) {

/**
* Generates an AttributeRequest based on the current attributeContent.
* If attributeContent is null, an empty set of attributes is created.
* Otherwise, the attribute names from attributeContent are used.
*
* @return an AttributeRequest instance containing the set of attribute names and whether any attributes are required
*/
@Nonnull
public AttributeRequest attributeRequest() {
return new AttributeRequest(
attributeContent == null ? Collections.emptySet() : attributeContent.getAttributeNamesAsSet(),
attributeContent != null
);
}

/**
* Returns true if the settings require initialization of referenced entities.
* @return true if the settings require initialization of referenced entities
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1043,7 +1043,7 @@ private EvitaRequest prefetchEntities(
)
);

final DefaultPrefetchRequirementCollector globalPrefetchCollector = new DefaultPrefetchRequirementCollector(null);
final DefaultPrefetchRequirementCollector globalPrefetchCollector = new DefaultPrefetchRequirementCollector();
this.fetchedEntities = collectedRequirements
.filter(it -> it.getValue().requiresInit())
.collect(
Expand All @@ -1053,12 +1053,15 @@ private EvitaRequest prefetchEntities(
final String referenceName = it.getKey();
final RequirementContext requirements = it.getValue();
final ReferenceSchemaContract referenceSchema = entitySchema.getReferenceOrThrowException(referenceName);
final DefaultPrefetchRequirementCollector localPrefetchCollector = new DefaultPrefetchRequirementCollector(requirements.entityFetch());
// initialize requirements with requested attributes
if (requirements.attributeContent() != null) {
globalPrefetchCollector.addRequirementToPrefetch(requirements.attributeContent());
}

final Optional<OrderingDescriptor> orderingDescriptor = ofNullable(requirements.orderBy())
.map(ob -> ReferenceOrderByVisitor.getComparator(
executionContext.getQueryContext(),
localPrefetchCollector,
globalPrefetchCollector,
ob,
entitySchema,
referenceSchema
Expand Down Expand Up @@ -1126,17 +1129,14 @@ private EvitaRequest prefetchEntities(
)
);

final EntityFetch entityFetch = localPrefetchCollector.getEntityFetch();
if (entityFetch != null && !ArrayUtils.isEmpty(filteredReferencedEntityIds)) {
// collect global requirements
globalPrefetchCollector.addRequirementToPrefetch(entityFetch.getRequirements());
if (requirements.entityFetch() != null && !ArrayUtils.isEmpty(filteredReferencedEntityIds)) {
// if so, fetch them
entityIndex = fetchReferencedEntities(
executionContext,
referenceSchema,
referenceSchema.getReferencedEntityType(),
pk -> existingEntityRetriever.getExistingEntity(referenceName, pk),
entityFetch,
requirements.entityFetch(),
filteredReferencedEntityIds
);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public class PrefetchFormulaVisitor implements FormulaVisitor, FormulaPostProces
/**
* Contains set of requirements collected from all {@link SelectionFormula} in the tree.
*/
protected final DefaultPrefetchRequirementCollector requirements = new DefaultPrefetchRequirementCollector(null);
protected final DefaultPrefetchRequirementCollector requirements = new DefaultPrefetchRequirementCollector();
/**
* Indexes that were used when visitor was created.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@
public class DefaultPrefetchRequirementCollector implements FetchRequirementCollector {
private Map<Class<? extends EntityContentRequire>, EntityContentRequire[]> requirements;

public DefaultPrefetchRequirementCollector() {
this(null);
}

public DefaultPrefetchRequirementCollector(@Nullable EntityFetch entityFetch) {
if (entityFetch != null) {
this.requirements = CollectionUtils.createHashMap(8);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

package io.evitadb.api.requestResponse.data.structure.predicate;

import io.evitadb.api.query.require.AttributeContent;
import io.evitadb.api.query.require.ManagedReferencesBehaviour;
import io.evitadb.api.requestResponse.EvitaRequest;
import io.evitadb.api.requestResponse.EvitaRequest.AttributeRequest;
Expand Down Expand Up @@ -65,7 +66,7 @@ private static Map<String, RequirementContext> getDefaultRequirementContext(List
.stream()
.collect(Collectors.toMap(
Function.identity(),
it -> new RequirementContext(ManagedReferencesBehaviour.ANY, AttributeRequest.EMPTY, null, null, null, null)
it -> new RequirementContext(ManagedReferencesBehaviour.ANY, null, null, null, null, null)
)
);
}
Expand All @@ -85,7 +86,7 @@ private static Map<String, AttributeRequest> toAttributeRequestIndex(Map<String,
@Nonnull
private static RequirementContext createRequirementContext(String... attributes) {
return new RequirementContext(
ManagedReferencesBehaviour.ANY, new AttributeRequest(Set.of(attributes), true),
ManagedReferencesBehaviour.ANY, new AttributeContent(attributes),
null, null, null, null
);
}
Expand Down

0 comments on commit 5ae34f3

Please sign in to comment.