You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

baiduvectordb.py 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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()