Skip to content

Commit a585e7e

Browse files
fix: remove dead IndexExpression config fields and unreachable JSON-key tokenizer error (#136)
1 parent a78233a commit a585e7e

2 files changed

Lines changed: 28 additions & 15 deletions

File tree

paradedb/indexes.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,16 @@ class IndexExpression:
123123
For text expressions, specify a tokenizer. For non-text expressions
124124
(integers, timestamps, etc.), omit the tokenizer to use ``pdb.alias``.
125125
126+
Tokenizer configuration (positional args, named args, token filters,
127+
stemmer, etc.) is supplied directly on the ``tokenizer`` object via
128+
:class:`~paradedb.search.Tokenizer` factory methods (e.g.
129+
``Tokenizer.simple(options={'stemmer': 'english'})``).
130+
126131
Args:
127132
expression: A Django expression to index (e.g., ``Lower('title')``).
128133
alias: Required. The name used to reference this expression in queries.
129134
tokenizer: Tokenizer for text expressions (e.g., 'simple', 'unicode_words').
130135
Omit for non-text expressions to use ``pdb.alias``.
131-
args: Positional arguments for the tokenizer.
132-
named_args: Named arguments for the tokenizer configuration.
133-
filters: Token filters (e.g., ['lowercase', 'stemmer']).
134-
stemmer: Stemmer language (e.g., 'english').
135136
136137
Example::
137138
@@ -162,10 +163,6 @@ class IndexExpression:
162163
expression: Expression | str
163164
alias: str
164165
tokenizer: Tokenizer | None = None
165-
args: list[Any] | None = None
166-
named_args: dict[str, Any] | None = None
167-
filters: list[str] | None = None
168-
stemmer: str | None = None
169166

170167

171168
class BM25Index(models.Index):
@@ -275,8 +272,7 @@ def _build_index_expressions(
275272
if tokenizer is not None or alias is not None:
276273
raise ValueError(
277274
f"Field {field_name!r} cannot mix 'tokenizers' with "
278-
f"'tokenizer', 'args', 'named_args', 'filters', "
279-
f"'stemmer', or 'alias'."
275+
f"'tokenizer' or 'alias'."
280276
)
281277
expressions.extend(
282278
self._build_multi_tokenizer_expressions(
@@ -373,13 +369,13 @@ def _build_json_key_expressions(
373369
expressions: list[str] = []
374370
for key, config in json_keys.items():
375371
tokenizer = config.get("tokenizer")
376-
if not isinstance(tokenizer, Tokenizer):
377-
raise TypeError("tokenizer must be a Tokenizer")
378372
if tokenizer is None:
379373
raise ValueError(
380374
f"JSON key {key!r} in field {field_name!r} requires an explicit "
381375
f"tokenizer (e.g. 'unicode_words', 'simple', 'literal')."
382376
)
377+
if not isinstance(tokenizer, Tokenizer):
378+
raise TypeError("tokenizer must be a Tokenizer")
383379
key_literal = _quote_term(key)
384380
expressions.append(f"(({column}->>{key_literal})::{tokenizer.render()})")
385381
return expressions

tests/test_indexing.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def test_tokenizers_mixed_with_top_level_tokenizer_config_raises_value_error() -
5252
index.create_sql(model=MockItem, schema_editor=DummySchemaEditor())
5353

5454

55-
def test_json_key_without_tokenizer_raises_type_error() -> None:
55+
def test_json_key_without_tokenizer_raises_value_error() -> None:
5656
index = BM25Index(
5757
fields={
5858
"id": {},
@@ -65,6 +65,23 @@ def test_json_key_without_tokenizer_raises_type_error() -> None:
6565
key_field="id",
6666
name="mock_items_search_idx",
6767
)
68+
with pytest.raises(ValueError, match="requires an explicit"):
69+
index.create_sql(model=MockItem, schema_editor=DummySchemaEditor())
70+
71+
72+
def test_json_key_with_invalid_tokenizer_type_raises_type_error() -> None:
73+
index = BM25Index(
74+
fields={
75+
"id": {},
76+
"metadata": {
77+
"json_keys": {
78+
"color": {"tokenizer": "simple"},
79+
}
80+
},
81+
},
82+
key_field="id",
83+
name="mock_items_search_idx",
84+
)
6885
with pytest.raises(TypeError, match="tokenizer must be a Tokenizer"):
6986
index.create_sql(model=MockItem, schema_editor=DummySchemaEditor())
7087

@@ -273,7 +290,7 @@ def test_json_field_native_json_fields(self) -> None:
273290
)
274291

275292
def test_json_key_without_tokenizer_raises(self) -> None:
276-
"""JSON keys without an explicit tokenizer raise TypeError."""
293+
"""JSON keys without an explicit tokenizer raise a descriptive ValueError."""
277294
index = BM25Index(
278295
fields={
279296
"id": {},
@@ -287,7 +304,7 @@ def test_json_key_without_tokenizer_raises(self) -> None:
287304
name="mock_items_search_idx",
288305
)
289306
schema_editor = _schema_editor()
290-
with pytest.raises(TypeError, match="tokenizer must be a Tokenizer"):
307+
with pytest.raises(ValueError, match="requires an explicit"):
291308
index.create_sql(model=MockItem, schema_editor=schema_editor)
292309

293310
def test_json_field_literal_alias(self) -> None:

0 commit comments

Comments
 (0)