baiduvectordb.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import os
  2. import pytest
  3. from _pytest.monkeypatch import MonkeyPatch
  4. from pymochow import MochowClient
  5. from pymochow.model.database import Database
  6. from pymochow.model.enum import IndexState, IndexType, MetricType, ReadConsistency, TableState
  7. from pymochow.model.schema import HNSWParams, VectorIndex
  8. from pymochow.model.table import Table
  9. from requests.adapters import HTTPAdapter
  10. class MockBaiduVectorDBClass:
  11. def mock_vector_db_client(
  12. self,
  13. config=None,
  14. adapter: HTTPAdapter = None,
  15. ):
  16. self._conn = None
  17. self._config = None
  18. def list_databases(self, config=None) -> list[Database]:
  19. return [
  20. Database(
  21. conn=self._conn,
  22. database_name="dify",
  23. config=self._config,
  24. )
  25. ]
  26. def create_database(self, database_name: str, config=None) -> Database:
  27. return Database(conn=self._conn, database_name=database_name, config=config)
  28. def list_table(self, config=None) -> list[Table]:
  29. return []
  30. def drop_table(self, table_name: str, config=None):
  31. return {"code": 0, "msg": "Success"}
  32. def create_table(
  33. self,
  34. table_name: str,
  35. replication: int,
  36. partition: int,
  37. schema,
  38. enable_dynamic_field=False,
  39. description: str = "",
  40. config=None,
  41. ) -> Table:
  42. return Table(self, table_name, replication, partition, schema, enable_dynamic_field, description, config)
  43. def describe_table(self, table_name: str, config=None) -> Table:
  44. return Table(
  45. self,
  46. table_name,
  47. 3,
  48. 1,
  49. None,
  50. enable_dynamic_field=False,
  51. description="table for dify",
  52. config=config,
  53. state=TableState.NORMAL,
  54. )
  55. def upsert(self, rows, config=None):
  56. return {"code": 0, "msg": "operation success", "affectedCount": 1}
  57. def rebuild_index(self, index_name: str, config=None):
  58. return {"code": 0, "msg": "Success"}
  59. def describe_index(self, index_name: str, config=None):
  60. return VectorIndex(
  61. index_name=index_name,
  62. index_type=IndexType.HNSW,
  63. field="vector",
  64. metric_type=MetricType.L2,
  65. params=HNSWParams(m=16, efconstruction=200),
  66. auto_build=False,
  67. state=IndexState.NORMAL,
  68. )
  69. def query(
  70. self,
  71. primary_key,
  72. partition_key=None,
  73. projections=None,
  74. retrieve_vector=False,
  75. read_consistency=ReadConsistency.EVENTUAL,
  76. config=None,
  77. ):
  78. return {
  79. "row": {
  80. "id": "doc_id_001",
  81. "vector": [0.23432432, 0.8923744, 0.89238432],
  82. "text": "text",
  83. "metadata": {"doc_id": "doc_id_001"},
  84. },
  85. "code": 0,
  86. "msg": "Success",
  87. }
  88. def delete(self, primary_key=None, partition_key=None, filter=None, config=None):
  89. return {"code": 0, "msg": "Success"}
  90. def search(
  91. self,
  92. anns,
  93. partition_key=None,
  94. projections=None,
  95. retrieve_vector=False,
  96. read_consistency=ReadConsistency.EVENTUAL,
  97. config=None,
  98. ):
  99. return {
  100. "rows": [
  101. {
  102. "row": {
  103. "id": "doc_id_001",
  104. "vector": [0.23432432, 0.8923744, 0.89238432],
  105. "text": "text",
  106. "metadata": {"doc_id": "doc_id_001"},
  107. },
  108. "distance": 0.1,
  109. "score": 0.5,
  110. }
  111. ],
  112. "code": 0,
  113. "msg": "Success",
  114. }
  115. MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true"
  116. @pytest.fixture
  117. def setup_baiduvectordb_mock(request, monkeypatch: MonkeyPatch):
  118. if MOCK:
  119. monkeypatch.setattr(MochowClient, "__init__", MockBaiduVectorDBClass.mock_vector_db_client)
  120. monkeypatch.setattr(MochowClient, "list_databases", MockBaiduVectorDBClass.list_databases)
  121. monkeypatch.setattr(MochowClient, "create_database", MockBaiduVectorDBClass.create_database)
  122. monkeypatch.setattr(Database, "table", MockBaiduVectorDBClass.describe_table)
  123. monkeypatch.setattr(Database, "list_table", MockBaiduVectorDBClass.list_table)
  124. monkeypatch.setattr(Database, "create_table", MockBaiduVectorDBClass.create_table)
  125. monkeypatch.setattr(Database, "drop_table", MockBaiduVectorDBClass.drop_table)
  126. monkeypatch.setattr(Database, "describe_table", MockBaiduVectorDBClass.describe_table)
  127. monkeypatch.setattr(Table, "rebuild_index", MockBaiduVectorDBClass.rebuild_index)
  128. monkeypatch.setattr(Table, "describe_index", MockBaiduVectorDBClass.describe_index)
  129. monkeypatch.setattr(Table, "delete", MockBaiduVectorDBClass.delete)
  130. monkeypatch.setattr(Table, "search", MockBaiduVectorDBClass.search)
  131. yield
  132. if MOCK:
  133. monkeypatch.undo()