Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix RelationshipFilter ignoring swap field from a nested RelationshipFilter. #664

Merged
merged 1 commit into from
Jan 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,11 @@ private String foreignKeyOnFilterEntity(SqlParams sqlParams, String tableAlias)
.getUnderlay()
.getIndexSchema()
.getEntityMain(relationshipFilter.getSelectEntity().getName());
Attribute selectIdAttribute = relationshipFilter.getSelectEntity().getIdAttribute();
SqlField selectIdField =
selectEntityTable.getAttributeValueField(
relationshipFilter.getSelectEntity().getIdAttribute().getName());
attributeSwapFields.containsKey(selectIdAttribute)
? attributeSwapFields.get(selectIdAttribute)
: selectEntityTable.getAttributeValueField(selectIdAttribute.getName());

if (!relationshipFilter.hasSubFilter()
&& !relationshipFilter.hasGroupByFilter()
Expand Down Expand Up @@ -183,9 +185,11 @@ private String intermediateTable(SqlParams sqlParams, String tableAlias) {
.getUnderlay()
.getIndexSchema()
.getEntityMain(relationshipFilter.getSelectEntity().getName());
Attribute selectIdAttribute = relationshipFilter.getSelectEntity().getIdAttribute();
SqlField selectIdField =
selectEntityTable.getAttributeValueField(
relationshipFilter.getSelectEntity().getIdAttribute().getName());
attributeSwapFields.containsKey(selectIdAttribute)
? attributeSwapFields.get(selectIdAttribute)
: selectEntityTable.getAttributeValueField(selectIdAttribute.getName());
ITRelationshipIdPairs idPairsTable =
relationshipFilter
.getUnderlay()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -977,6 +977,128 @@ void relationshipFilterIntermediateTableWithGroupBy() throws IOException {
idPairsTable);
}

@Test
void relationshipFilterFKFilterWithSwapFields() throws IOException {
// e.g. SELECT occurrence FILTER ON (person FILTER ON occurrence).
CriteriaOccurrence criteriaOccurrence =
(CriteriaOccurrence) underlay.getEntityGroup("conditionPerson");
Entity occurrenceEntity = underlay.getEntity("conditionOccurrence");

AttributeFilter innerOccurrenceFilter =
new AttributeFilter(
underlay,
occurrenceEntity,
occurrenceEntity.getAttribute("condition"),
BinaryOperator.EQUALS,
Literal.forInt64(223_276L));
RelationshipFilter personFilter =
new RelationshipFilter(
underlay,
criteriaOccurrence,
underlay.getPrimaryEntity(),
criteriaOccurrence.getOccurrencePrimaryRelationship(occurrenceEntity.getName()),
innerOccurrenceFilter,
null,
null,
null);
RelationshipFilter occurrenceFilter =
new RelationshipFilter(
underlay,
criteriaOccurrence,
occurrenceEntity,
criteriaOccurrence.getOccurrencePrimaryRelationship(occurrenceEntity.getName()),
personFilter,
null,
null,
null);
AttributeField simpleAttribute =
new AttributeField(
underlay, occurrenceEntity, occurrenceEntity.getAttribute("start_date"), false, false);
ListQueryResult listQueryResult =
bqQueryRunner.run(
new ListQueryRequest(
underlay,
occurrenceEntity,
List.of(simpleAttribute),
occurrenceFilter,
null,
null,
null,
null,
true));
BQTable occurrenceTable =
underlay.getIndexSchema().getEntityMain(occurrenceEntity.getName()).getTablePointer();
assertSqlMatchesWithTableNameOnly(
"relationshipFilterFKFilterWithSwapFields", listQueryResult.getSql(), occurrenceTable);
}

@Test
void relationshipFilterIntermediateTableWithSwapFields() throws IOException {
// e.g. SELECT occurrence FILTER ON (ingredient FILTER ON brand).
CriteriaOccurrence criteriaOccurrence =
(CriteriaOccurrence) underlay.getEntityGroup("ingredientPerson");
Entity occurrenceEntity = underlay.getEntity("ingredientOccurrence");
GroupItems groupItems = (GroupItems) underlay.getEntityGroup("brandIngredient");

AttributeFilter brandFilter =
new AttributeFilter(
underlay,
groupItems.getGroupEntity(),
groupItems.getGroupEntity().getIdAttribute(),
BinaryOperator.EQUALS,
Literal.forInt64(19_042_336L));
RelationshipFilter ingredientFilter =
new RelationshipFilter(
underlay,
groupItems,
groupItems.getItemsEntity(),
groupItems.getGroupItemsRelationship(),
brandFilter,
null,
null,
null);
RelationshipFilter occurrenceFilter =
new RelationshipFilter(
underlay,
criteriaOccurrence,
occurrenceEntity,
criteriaOccurrence.getOccurrenceCriteriaRelationship(occurrenceEntity.getName()),
ingredientFilter,
null,
null,
null);
AttributeField simpleAttribute =
new AttributeField(
underlay, occurrenceEntity, occurrenceEntity.getAttribute("start_date"), false, false);
ListQueryResult listQueryResult =
bqQueryRunner.run(
new ListQueryRequest(
underlay,
occurrenceEntity,
List.of(simpleAttribute),
occurrenceFilter,
null,
null,
null,
null,
true));
BQTable occurrenceTable =
underlay.getIndexSchema().getEntityMain(occurrenceEntity.getName()).getTablePointer();
BQTable intermediateTable =
underlay
.getIndexSchema()
.getRelationshipIdPairs(
groupItems.getName(),
groupItems.getGroupEntity().getName(),
groupItems.getItemsEntity().getName())
.getTablePointer();
assertSqlMatchesWithTableNameOnly(
"relationshipFilterIntTableWithSwapFields",
listQueryResult.getSql(),
occurrenceTable,
intermediateTable);
}

@Test
void textSearchFilter() throws IOException {
Entity entity = underlay.getEntity("condition");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

SELECT
start_date
FROM
${ENT_conditionOccurrence}
WHERE
person_id IN (
SELECT
person_id
FROM
${ENT_conditionOccurrence}
WHERE
condition = @val
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

SELECT
start_date
FROM
${ENT_ingredientOccurrence}
WHERE
ingredient IN (
SELECT
entity_B_id
FROM
${RIDS_brandIngredient_brand_ingredient}
WHERE
entity_A_id = @val
)