disallow category tokens in the middle of a query string

This already worked for left-to-right readings and now is also
implemented for right-to-left reading. A qualifier must always be
before or after the name.
This commit is contained in:
Sarah Hoffmann 2024-01-28 11:35:30 +01:00
parent 2703442fd2
commit fed46240d5
2 changed files with 16 additions and 0 deletions

View File

@ -132,6 +132,11 @@ class _TokenSequence:
# Name tokens are always acceptable and don't change direction # Name tokens are always acceptable and don't change direction
if ttype == qmod.TokenType.PARTIAL: if ttype == qmod.TokenType.PARTIAL:
# qualifiers cannot appear in the middle of the qeury. They need
# to be near the next phrase.
if self.direction == -1 \
and any(t.ttype == qmod.TokenType.QUALIFIER for t in self.seq[:-1]):
return None
return self.direction return self.direction
# Other tokens may only appear once # Other tokens may only appear once

View File

@ -337,3 +337,14 @@ def test_qualifier_after_housenumber():
(BreakType.WORD, PhraseType.NONE, [(3, TokenType.PARTIAL)])) (BreakType.WORD, PhraseType.NONE, [(3, TokenType.PARTIAL)]))
check_assignments(yield_token_assignments(q)) check_assignments(yield_token_assignments(q))
def test_qualifier_in_middle_of_phrase():
q = make_query((BreakType.START, PhraseType.NONE, [(1, TokenType.PARTIAL)]),
(BreakType.PHRASE, PhraseType.NONE, [(2, TokenType.PARTIAL)]),
(BreakType.WORD, PhraseType.NONE, [(3, TokenType.QUALIFIER)]),
(BreakType.WORD, PhraseType.NONE, [(4, TokenType.PARTIAL)]),
(BreakType.PHRASE, PhraseType.NONE, [(5, TokenType.PARTIAL)]))
check_assignments(yield_token_assignments(q))