diff --git a/lapis/src/main/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapper.kt b/lapis/src/main/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapper.kt index 5a6a70bbb..0a09400bb 100644 --- a/lapis/src/main/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapper.kt +++ b/lapis/src/main/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapper.kt @@ -86,10 +86,10 @@ class SiloFilterExpressionMapper( return And( filterExpressions + - nucleotideMutationExpressions + - aminoAcidMutationExpressions + - nucleotideInsertionExpressions + - aminoAcidInsertionExpressions, + nucleotideMutationExpressions + + aminoAcidMutationExpressions + + nucleotideInsertionExpressions + + aminoAcidInsertionExpressions, ) } @@ -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) @@ -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(", "), ) } @@ -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}'.", ) } } @@ -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}'.", ) } } @@ -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}'.", ) } @@ -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 { diff --git a/lapis/src/main/kotlin/org/genspectrum/lapis/model/VariantQueryCustomListener.kt b/lapis/src/main/kotlin/org/genspectrum/lapis/model/VariantQueryCustomListener.kt index 547dd18e5..b644cf0d2 100644 --- a/lapis/src/main/kotlin/org/genspectrum/lapis/model/VariantQueryCustomListener.kt +++ b/lapis/src/main/kotlin/org/genspectrum/lapis/model/VariantQueryCustomListener.kt @@ -131,6 +131,7 @@ class VariantQueryCustomListener(val referenceGenomeSchema: ReferenceGenomeSchem NucleotideInsertionContains( ctx.position().text.toInt(), value.uppercase(), + null, ), ) } diff --git a/lapis/src/main/kotlin/org/genspectrum/lapis/silo/SiloQuery.kt b/lapis/src/main/kotlin/org/genspectrum/lapis/silo/SiloQuery.kt index 76d4edf9a..9f8d60e0e 100644 --- a/lapis/src/main/kotlin/org/genspectrum/lapis/silo/SiloQuery.kt +++ b/lapis/src/main/kotlin/org/genspectrum/lapis/silo/SiloQuery.kt @@ -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( diff --git a/lapis/src/test/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapperTest.kt b/lapis/src/test/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapperTest.kt index a4407719c..91fa50328 100644 --- a/lapis/src/test/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapperTest.kt +++ b/lapis/src/test/kotlin/org/genspectrum/lapis/model/SiloFilterExpressionMapperTest.kt @@ -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)) } diff --git a/lapis/src/test/kotlin/org/genspectrum/lapis/model/VariantQueryFacadeTest.kt b/lapis/src/test/kotlin/org/genspectrum/lapis/model/VariantQueryFacadeTest.kt index 98b88af1d..c4ae5b08c 100644 --- a/lapis/src/test/kotlin/org/genspectrum/lapis/model/VariantQueryFacadeTest.kt +++ b/lapis/src/test/kotlin/org/genspectrum/lapis/model/VariantQueryFacadeTest.kt @@ -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 { underTest.map(variantQuery) } } @Test @@ -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 @@ -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 @@ -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