Skip to content
Open
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
19 changes: 19 additions & 0 deletions tests/test_fts_cli_user_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,25 @@ def test_cli_applies_bm25_overrides_after_routing_vector_config_to_fts():
}


def test_cli_preserves_milvus_force_merge_options_when_routing_vector_config_to_fts():
from vectordb_bench.backend.clients.milvus.config import MilvusIndexConfig

selected = select_cli_db_case_config(
DB.Milvus,
MilvusIndexConfig(
index=IndexType.HNSW,
force_merge_enabled=False,
force_merge_target_size_mb=512,
),
"FTSBm25Performance",
{},
)

assert isinstance(selected, MilvusFtsConfig)
assert selected.force_merge_enabled is False
assert selected.force_merge_target_size_mb == 512


def test_cli_leaves_fts_bm25_defaults_when_options_are_omitted():
selected = select_cli_db_case_config(
DB.Vespa,
Expand Down
44 changes: 43 additions & 1 deletion tests/test_milvus.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,19 +128,42 @@ def test_milvus_rejects_existing_collection_with_incompatible_properties(monkeyp
_create_milvus_with_collection_properties(monkeypatch, collection_exists=True)


def test_milvus_force_merge_config_defaults_and_validation():
from vectordb_bench.backend.clients.milvus.config import AutoIndexConfig, MilvusFtsConfig

assert AutoIndexConfig().force_merge_enabled is True
assert AutoIndexConfig().force_merge_target_size_mb is None
assert AutoIndexConfig(force_merge_target_size_mb=1024).force_merge_target_size_mb == 1024
assert MilvusFtsConfig().force_merge_enabled is True
assert MilvusFtsConfig().force_merge_target_size_mb is None

with pytest.raises(ValueError, match="positive integer"):
AutoIndexConfig(force_merge_target_size_mb=0)
with pytest.raises(ValueError, match="positive integer"):
AutoIndexConfig(force_merge_target_size_mb=-5)
with pytest.raises(ValueError, match="positive integer"):
MilvusFtsConfig(force_merge_target_size_mb=0)


class TestMilvusOptimize:
def _milvus(
self,
*,
compact_side_effect: Exception | None = None,
is_fts: bool = False,
is_gpu_index: bool = False,
force_merge_enabled: bool = True,
force_merge_target_size_mb: int | None = None,
):
milvus = Milvus.__new__(Milvus)
milvus.name = "Milvus"
milvus.collection_name = "test_collection"
milvus._is_fts = is_fts
milvus.case_config = SimpleNamespace(is_gpu_index=is_gpu_index)
milvus.case_config = SimpleNamespace(
is_gpu_index=is_gpu_index,
force_merge_enabled=force_merge_enabled,
force_merge_target_size_mb=force_merge_target_size_mb,
)
milvus.client = MagicMock()
milvus.client.compact.side_effect = compact_side_effect
milvus.client.compact.return_value = 42
Expand Down Expand Up @@ -180,6 +203,24 @@ def test_optimize_flushes_and_runs_normal_compaction_before_force_merge(self):
assert milvus._wait_for_compaction.call_args_list == [call(41), call(42)]
milvus.client.refresh_load.assert_called_once_with("test_collection")

def test_optimize_uses_configured_force_merge_target_size(self):
milvus = self._milvus(force_merge_target_size_mb=512)

milvus._optimize()

milvus.client.compact.assert_any_call("test_collection", target_size=512)
milvus.client.refresh_load.assert_called_once_with("test_collection")

def test_optimize_skips_force_merge_when_disabled_but_keeps_normal_compaction(self):
milvus = self._milvus(force_merge_enabled=False)

milvus._optimize()

milvus.client.flush.assert_called_once_with("test_collection")
assert milvus.client.compact.call_args_list == [call("test_collection")]
assert milvus._wait_for_compaction.call_args_list == [call(42)]
milvus.client.refresh_load.assert_called_once_with("test_collection")

def test_optimize_retries_when_compacting_segments_are_missing_from_force_merge_plan(
self, monkeypatch: pytest.MonkeyPatch
):
Expand Down Expand Up @@ -353,6 +394,7 @@ def get_compaction_plans(self, _compaction_id: int):
milvus.name = "Milvus"
milvus.collection_name = "test_collection"
milvus._main_index_name = "vector_idx"
milvus.case_config = SimpleNamespace()
milvus.client = FakeMilvusClient()
monkeypatch.setattr("vectordb_bench.backend.clients.milvus.milvus.time.sleep", lambda _seconds: None)

Expand Down
130 changes: 130 additions & 0 deletions tests/test_milvus_zilliz_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,73 @@ def fake_run(**kwargs):
assert captured["db_case_config"].use_partition_key is True


def test_milvus_autoindex_cli_defaults_force_merge_to_current_behavior(monkeypatch: MonkeyPatch) -> None:
captured = {}

def fake_run(**kwargs):
captured.update(kwargs)

monkeypatch.setattr(milvus_cli, "run", fake_run)

result = CliRunner().invoke(
milvus_cli.MilvusAutoIndex,
["--uri", "http://localhost:19530", "--dry-run"],
)

assert result.exit_code == 0, result.output
assert captured["db_case_config"].force_merge_enabled is True
assert captured["db_case_config"].force_merge_target_size_mb is None


def test_milvus_autoindex_cli_accepts_force_merge_flags(monkeypatch: MonkeyPatch) -> None:
captured = {}

def fake_run(**kwargs):
captured.update(kwargs)

monkeypatch.setattr(milvus_cli, "run", fake_run)

result = CliRunner().invoke(
milvus_cli.MilvusAutoIndex,
[
"--uri",
"http://localhost:19530",
"--force-merge-target-size-mb",
"512",
"--no-force-merge-enabled",
"--dry-run",
],
)

assert result.exit_code == 0, result.output
assert captured["db_case_config"].force_merge_enabled is False
assert captured["db_case_config"].force_merge_target_size_mb == 512


def test_milvus_fts_cli_accepts_force_merge_flags(monkeypatch: MonkeyPatch) -> None:
captured = {}

def fake_run(**kwargs):
captured.update(kwargs)

monkeypatch.setattr(milvus_cli, "run", fake_run)

result = CliRunner().invoke(
milvus_cli.MilvusFTS,
[
"--uri",
"http://localhost:19530",
"--force-merge-target-size-mb",
"256",
"--dry-run",
],
)

assert result.exit_code == 0, result.output
assert captured["db_case_config"].force_merge_enabled is True
assert captured["db_case_config"].force_merge_target_size_mb == 256


@pytest.mark.parametrize(
("level_args", "expected_level"),
[(["--level", "2"], 2), ([], None)],
Expand Down Expand Up @@ -134,6 +201,69 @@ def fake_run(**kwargs):
assert captured["db_case_config"].use_partition_key is True


def test_milvus_autoindex_cli_rejects_non_positive_force_merge_target_size() -> None:
result = CliRunner().invoke(
milvus_cli.MilvusAutoIndex,
["--uri", "http://localhost:19530", "--force-merge-target-size-mb", "0", "--dry-run"],
)

assert result.exit_code != 0
assert "positive integer" in result.output

result = CliRunner().invoke(
milvus_cli.MilvusAutoIndex,
["--uri", "http://localhost:19530", "--force-merge-target-size-mb", "-5", "--dry-run"],
)

assert result.exit_code != 0
assert "positive integer" in result.output


def test_zilliz_autoindex_cli_rejects_non_positive_force_merge_target_size() -> None:
result = CliRunner().invoke(
zilliz_cli.ZillizAutoIndex,
[
"--uri",
"https://example.api.gcp-us-west1.zillizcloud.com",
"--token",
"secret",
"--force-merge-target-size-mb",
"0",
"--dry-run",
],
)

assert result.exit_code != 0
assert "positive integer" in result.output


def test_zilliz_autoindex_cli_accepts_force_merge_flags(monkeypatch: MonkeyPatch) -> None:
captured = {}

def fake_run(**kwargs):
captured.update(kwargs)

monkeypatch.setattr(zilliz_cli, "run", fake_run)

result = CliRunner().invoke(
zilliz_cli.ZillizAutoIndex,
[
"--uri",
"https://example.api.gcp-us-west1.zillizcloud.com",
"--token",
"secret",
"--force-merge-target-size-mb",
"1024",
"--no-force-merge-enabled",
"--dry-run",
],
)

assert result.exit_code == 0, result.output
assert captured["db_case_config"].force_merge_enabled is False
assert captured["db_case_config"].force_merge_target_size_mb == 1024


def test_milvus_autoindex_cli_nq(monkeypatch: MonkeyPatch) -> None:
captured = {}

Expand Down
Loading
Loading