Skip to content

Commit

Permalink
fix(lapis): nucleotideInsertionContains correctly handles segment
Browse files Browse the repository at this point in the history
  • Loading branch information
JonasKellerer committed Jun 3, 2024
1 parent 46a0efa commit d840a48
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,10 @@ class SiloFilterExpressionMapper(

return And(
filterExpressions +
nucleotideMutationExpressions +
aminoAcidMutationExpressions +
nucleotideInsertionExpressions +
aminoAcidInsertionExpressions,
nucleotideMutationExpressions +
aminoAcidMutationExpressions +
nucleotideInsertionExpressions +
aminoAcidInsertionExpressions,
)
}

Expand All @@ -115,7 +115,7 @@ class SiloFilterExpressionMapper(

null -> throw BadRequestException(
"'$key' is not a valid sequence filter key. Valid keys are: " +
allowedSequenceFilterFields.fields.values.joinToString { it.name },
allowedSequenceFilterFields.fields.values.joinToString { it.name },
)
}
return Pair(filterExpressionId, type)
Expand All @@ -128,13 +128,13 @@ class SiloFilterExpressionMapper(
) {
val containsAdvancedVariantQuery = allowedSequenceFiltersWithType.keys.any { it.second == Filter.VariantQuery }
val containsSimpleVariantQuery = allowedSequenceFiltersWithType.keys.any { it.second in variantQueryTypes } ||
nucleotideMutations.isNotEmpty() ||
aaMutations.isNotEmpty()
nucleotideMutations.isNotEmpty() ||
aaMutations.isNotEmpty()

if (containsAdvancedVariantQuery && containsSimpleVariantQuery) {
throw BadRequestException(
"variantQuery filter cannot be used with other variant filters such as: " +
variantQueryTypes.joinToString(", "),
variantQueryTypes.joinToString(", "),
)
}

Expand All @@ -147,7 +147,7 @@ class SiloFilterExpressionMapper(
if (intBetweenFilterForSameColumn != null) {
throw BadRequestException(
"Cannot filter by exact int field '$intEqualsColumnName' " +
"and by int range field '${intBetweenFilterForSameColumn[0].originalKey}'.",
"and by int range field '${intBetweenFilterForSameColumn[0].originalKey}'.",
)
}
}
Expand All @@ -161,7 +161,7 @@ class SiloFilterExpressionMapper(
if (floatBetweenFilterForSameColumn != null) {
throw BadRequestException(
"Cannot filter by exact float field '$floatEqualsColumnName' " +
"and by float range field '${floatBetweenFilterForSameColumn[0].originalKey}'.",
"and by float range field '${floatBetweenFilterForSameColumn[0].originalKey}'.",
)
}
}
Expand Down Expand Up @@ -216,7 +216,7 @@ class SiloFilterExpressionMapper(
if (exactDateFilters.isNotEmpty() && dateRangeFilters.isNotEmpty()) {
throw BadRequestException(
"Cannot filter by exact date field '${exactDateFilters[0].originalKey}' " +
"and by date range field '${dateRangeFilters[0].originalKey}'.",
"and by date range field '${dateRangeFilters[0].originalKey}'.",
)
}

Expand Down Expand Up @@ -409,7 +409,11 @@ class SiloFilterExpressionMapper(
}

private fun toNucleotideInsertionFilter(nucleotideInsertion: NucleotideInsertion): NucleotideInsertionContains {
return NucleotideInsertionContains(nucleotideInsertion.position, nucleotideInsertion.insertions)
return NucleotideInsertionContains(
nucleotideInsertion.position,
nucleotideInsertion.insertions,
nucleotideInsertion.segment,
)
}

private fun toAminoAcidInsertionFilter(aminoAcidInsertion: AminoAcidInsertion): AminoAcidInsertionContains {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class VariantQueryCustomListener(val referenceGenomeSchema: ReferenceGenomeSchem
NucleotideInsertionContains(
ctx.position().text.toInt(),
value.uppercase(),
null,
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,8 @@ data class HasAminoAcidMutation(val sequenceName: String, val position: Int) :
data class DateBetween(val column: String, val from: LocalDate?, val to: LocalDate?) :
SiloFilterExpression("DateBetween")

data class NucleotideInsertionContains(val position: Int, val value: String) : SiloFilterExpression("InsertionContains")
data class NucleotideInsertionContains(val position: Int, val value: String, val sequenceName: String?) :
SiloFilterExpression("InsertionContains")

data class AminoAcidInsertionContains(val position: Int, val value: String, val sequenceName: String) :
SiloFilterExpression(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ class SiloFilterExpressionMapperTest {
val result = underTest.map(filterParameter)

val expected =
And(NucleotideInsertionContains(123, "ABCD"), NucleotideInsertionContains(999, "DEF"))
And(NucleotideInsertionContains(123, "ABCD", "segment"), NucleotideInsertionContains(999, "DEF", null))
assertThat(result, equalTo(expected))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,15 @@ class VariantQueryFacadeTest {

val result = underTest.map(variantQuery)

assertThat(result, equalTo(NucleotideInsertionContains(1234, "GAG")))
assertThat(result, equalTo(NucleotideInsertionContains(1234, "GAG", null)))
}

@Test
fun `given a variantQuery with a 'Insertion' expression with sequenceName throws`() {
// COVID variant queries do not support segment name in insertion queries
val variantQuery = "ins_sequence:1234:GAG"

assertThrows<BadRequestException> { underTest.map(variantQuery) }
}

@Test
Expand All @@ -312,7 +320,7 @@ class VariantQueryFacadeTest {

val result = underTest.map(variantQuery)

assertThat(result, equalTo(NucleotideInsertionContains(1234, "GAG")))
assertThat(result, equalTo(NucleotideInsertionContains(1234, "GAG", null)))
}

@Test
Expand All @@ -321,7 +329,7 @@ class VariantQueryFacadeTest {

val result = underTest.map(variantQuery)

assertThat(result, equalTo(NucleotideInsertionContains(1234, "GAG")))
assertThat(result, equalTo(NucleotideInsertionContains(1234, "GAG", null)))
}

@Test
Expand All @@ -330,7 +338,7 @@ class VariantQueryFacadeTest {

val result = underTest.map(variantQuery)

assertThat(result, equalTo(NucleotideInsertionContains(1234, "G.*A.*G")))
assertThat(result, equalTo(NucleotideInsertionContains(1234, "G.*A.*G", null)))
}

@Test
Expand Down

0 comments on commit d840a48

Please sign in to comment.