adapta 3.2.3a475.dev3__tar.gz → 3.2.4a477.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/PKG-INFO +1 -1
  2. adapta-3.2.4a477.dev5/adapta/_version.py +1 -0
  3. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/blob/local_storage_client.py +10 -2
  4. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v3/datastax_astra/README.md +65 -27
  5. adapta-3.2.4a477.dev5/adapta/storage/distributed_object_store/v3/datastax_astra/_models.py +134 -0
  6. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v3/datastax_astra/astra_client.py +6 -5
  7. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/pyproject.toml +1 -1
  8. adapta-3.2.3a475.dev3/adapta/_version.py +0 -1
  9. adapta-3.2.3a475.dev3/adapta/storage/distributed_object_store/v3/datastax_astra/_models.py +0 -75
  10. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/LICENSE +0 -0
  11. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/README.md +0 -0
  12. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/__init__.py +0 -0
  13. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/connectors/__init__.py +0 -0
  14. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/connectors/service_bus/__init__.py +0 -0
  15. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/connectors/service_bus/_connector.py +0 -0
  16. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/README.md +0 -0
  17. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/__init__.py +0 -0
  18. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/_async_logger.py +0 -0
  19. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/_base.py +0 -0
  20. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/_internal.py +0 -0
  21. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/_internal_logger.py +0 -0
  22. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/_logger_interface.py +0 -0
  23. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/handlers/__init__.py +0 -0
  24. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/handlers/datadog_api_handler.py +0 -0
  25. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/handlers/safe_stream_handler.py +0 -0
  26. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/models/__init__.py +0 -0
  27. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/models/_log_level.py +0 -0
  28. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/logs/models/_logs_metadata.py +0 -0
  29. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/metrics/__init__.py +0 -0
  30. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/metrics/_base.py +0 -0
  31. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/metrics/providers/README.md +0 -0
  32. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/metrics/providers/__init__.py +0 -0
  33. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/metrics/providers/datadog_provider.py +0 -0
  34. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/ml/__init__.py +0 -0
  35. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/ml/_model.py +0 -0
  36. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/ml/mlflow/__init__.py +0 -0
  37. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/ml/mlflow/_client.py +0 -0
  38. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/ml/mlflow/_functions.py +0 -0
  39. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/process_communication/__init__.py +0 -0
  40. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/process_communication/_models.py +0 -0
  41. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/schema_management/README.md +0 -0
  42. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/schema_management/__init__.py +0 -0
  43. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/schema_management/schema_entity.py +0 -0
  44. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/__init__.py +0 -0
  45. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/README.md +0 -0
  46. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/__init__.py +0 -0
  47. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/_azure_client.py +0 -0
  48. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/_base.py +0 -0
  49. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/_local_client.py +0 -0
  50. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/aws/__init__.py +0 -0
  51. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/aws/_aws_client.py +0 -0
  52. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/aws/_aws_credentials.py +0 -0
  53. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/hashicorp_vault/__init__.py +0 -0
  54. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/hashicorp_vault/hashicorp_vault_client.py +0 -0
  55. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/hashicorp_vault/kubernetes_client.py +0 -0
  56. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/hashicorp_vault/oidc_client.py +0 -0
  57. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/security/clients/hashicorp_vault/token_client.py +0 -0
  58. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/__init__.py +0 -0
  59. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/blob/README.md +0 -0
  60. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/blob/__init__.py +0 -0
  61. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/blob/azure_storage_client.py +0 -0
  62. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/blob/base.py +0 -0
  63. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/blob/s3_storage_client.py +0 -0
  64. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/cache/__init__.py +0 -0
  65. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/cache/_base.py +0 -0
  66. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/cache/redis_cache.py +0 -0
  67. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/__init__.py +0 -0
  68. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/README.md +0 -0
  69. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/__init__.py +0 -0
  70. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/azure_sql.py +0 -0
  71. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/models/__init__.py +0 -0
  72. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/models/_models.py +0 -0
  73. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/odbc.py +0 -0
  74. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/snowflake_sql.py +0 -0
  75. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v2/trino_sql.py +0 -0
  76. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/README.md +0 -0
  77. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/__init__.py +0 -0
  78. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/azure_sql.py +0 -0
  79. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/models/__init__.py +0 -0
  80. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/models/_models.py +0 -0
  81. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/odbc.py +0 -0
  82. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/snowflake_sql.py +0 -0
  83. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/database/v3/trino_sql.py +0 -0
  84. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/__init__.py +0 -0
  85. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v2/README.md +0 -0
  86. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v2/__init__.py +0 -0
  87. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v2/_functions.py +0 -0
  88. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v2/_models.py +0 -0
  89. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v3/README.md +0 -0
  90. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v3/__init__.py +0 -0
  91. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v3/_functions.py +0 -0
  92. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/delta_lake/v3/_models.py +0 -0
  93. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/__init__.py +0 -0
  94. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v2/__init__.py +0 -0
  95. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v2/datastax_astra/README.md +0 -0
  96. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v2/datastax_astra/__init__.py +0 -0
  97. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v2/datastax_astra/_models.py +0 -0
  98. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v2/datastax_astra/astra_client.py +0 -0
  99. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v3/__init__.py +0 -0
  100. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v3/datastax_astra/__init__.py +0 -0
  101. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/distributed_object_store/v3/datastax_astra/_model_mappers.py +0 -0
  102. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/exceptions.py +0 -0
  103. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/__init__.py +0 -0
  104. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/_functions.py +0 -0
  105. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/astra.py +0 -0
  106. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/aws.py +0 -0
  107. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/azure.py +0 -0
  108. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/base.py +0 -0
  109. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/filter_expression.py +0 -0
  110. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/format.py +0 -0
  111. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/hive.py +0 -0
  112. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/models/local.py +0 -0
  113. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/query_enabled_store/README.md +0 -0
  114. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/query_enabled_store/__init__.py +0 -0
  115. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/query_enabled_store/_models.py +0 -0
  116. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/query_enabled_store/_qes_astra.py +0 -0
  117. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/query_enabled_store/_qes_delta.py +0 -0
  118. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/secrets/README.md +0 -0
  119. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/secrets/__init__.py +0 -0
  120. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/secrets/_base.py +0 -0
  121. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/secrets/azure_secret_client.py +0 -0
  122. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/storage/secrets/hashicorp_vault_secret_storage_client.py +0 -0
  123. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/README.md +0 -0
  124. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/__init__.py +0 -0
  125. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/_common.py +0 -0
  126. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/concurrent_task_runner.py +0 -0
  127. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/data_structures/__init__.py +0 -0
  128. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/data_structures/_functions.py +0 -0
  129. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/decorators/__init__.py +0 -0
  130. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/decorators/_logging.py +0 -0
  131. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/decorators/_rate_limit.py +0 -0
  132. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/metaframe.py +0 -0
  133. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/python_typing/__init__.py +0 -0
  134. {adapta-3.2.3a475.dev3 → adapta-3.2.4a477.dev5}/adapta/utils/python_typing/_functions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: adapta
3
- Version: 3.2.3a475.dev3
3
+ Version: 3.2.4a477.dev5
4
4
  Summary: Logging, data connectors, monitoring, secret handling and general lifehacks to make data people lives easier.
5
5
  Home-page: https://github.com/SneaksAndData/adapta
6
6
  License: Apache 2.0
@@ -0,0 +1 @@
1
+ __version__ = 'v3.2.4a477.dev5'
@@ -70,6 +70,8 @@ class LocalStorageClient(StorageClient):
70
70
  self, blob_path: DataPath, filter_predicate: Optional[Callable[[...], bool]] = None
71
71
  ) -> Iterator[DataPath]:
72
72
  for blob in os.listdir(cast_path(blob_path).path):
73
+ if filter_predicate is not None and not filter_predicate(blob):
74
+ continue
73
75
  yield LocalPath(path=blob)
74
76
 
75
77
  def read_blobs(
@@ -79,8 +81,14 @@ class LocalStorageClient(StorageClient):
79
81
  filter_predicate: Optional[Callable[[...], bool]] = None,
80
82
  ) -> Iterator[T]:
81
83
  dir_path = cast_path(blob_path).path
82
- for blob in os.listdir(dir_path):
83
- with open(os.path.join(dir_path, blob), "rb") as blob_file:
84
+ if os.path.isdir(dir_path):
85
+ for blob in os.listdir(dir_path):
86
+ if filter_predicate is not None and not filter_predicate(blob):
87
+ continue
88
+ with open(os.path.join(dir_path, blob), "rb") as blob_file:
89
+ yield serialization_format().deserialize(blob_file.read())
90
+ else:
91
+ with open(dir_path, "rb") as blob_file:
84
92
  yield serialization_format().deserialize(blob_file.read())
85
93
 
86
94
  def download_blobs(
@@ -129,28 +129,33 @@ with AstraClient(
129
129
  ```
130
130
 
131
131
  ## Using the Vector Search
132
- Create a table in Astra and insert some rows:
132
+ 1. Create a table in Astra and insert some rows:
133
133
  ```cassandraql
134
134
  CREATE TABLE IF NOT EXISTS tmp.test_entity_with_embeddings (
135
135
  col_a TEXT PRIMARY KEY,
136
136
  col_b TEXT,
137
- col_c VECTOR<FLOAT, 3>
137
+ col_c VECTOR<FLOAT, 3>,
138
+ col_d TEXT,
138
139
  );
139
140
 
140
141
  CREATE INDEX IF NOT EXISTS ann_index
141
142
  ON tmp.test_entity_with_embeddings(col_c)
142
143
  WITH OPTIONS = {'source_model': 'other'};
143
144
 
144
- INSERT INTO tmp.test_entity_with_embeddings (col_a, col_b, col_c)
145
- VALUES ('something1', 'different', [0.3, 0.4, 0.5]);
145
+ CREATE INDEX IF NOT EXISTS col_b_index
146
+ ON tmp.test_entity_with_embeddings(col_b);
146
147
 
147
- INSERT INTO tmp.test_entity_with_embeddings (col_a, col_b, col_c)
148
- VALUES ('something2', 'different1', [0.1, 0.24, 0.25]);
149
- ```
148
+ INSERT INTO tmp.test_entity_with_embeddings (col_a, col_b, col_c, col_d)
149
+ VALUES ('something1', 'different', [0.3, 0.4, 0.5], 'extra1');
150
150
 
151
+ INSERT INTO tmp.test_entity_with_embeddings (col_a, col_b, col_c, col_d)
152
+ VALUES ('something2', 'different1', [0.1, 0.24, 0.25], 'extra2');
153
+ ```
154
+ 2. Test out functionality in Python
151
155
  ```python
152
156
  from adapta.storage.distributed_object_store.v3.datastax_astra import AstraClient
153
157
  from adapta.storage.distributed_object_store.v3.datastax_astra import SimilarityFunction
158
+ from adapta.storage.models.filter_expression import FilterField
154
159
 
155
160
  from dataclasses import dataclass, field
156
161
 
@@ -161,28 +166,61 @@ class TestEntityWithEmbeddings:
161
166
  "is_primary_key": True,
162
167
  "is_partition_key": True
163
168
  })
164
- col_b: str = field(metadata={
165
- "is_primary_key": True,
166
- "is_partition_key": False
167
- })
169
+ col_b: str
168
170
  col_c: list[float] = field(metadata={
169
171
  "is_vector_enabled": True
170
172
  })
173
+ col_d: str
174
+
175
+
176
+ astra_client = AstraClient(
177
+ client_name='test',
178
+ keyspace='tmp',
179
+ secure_connect_bundle_bytes='base64string',
180
+ client_id='Astra Token client_id',
181
+ client_secret='Astra Token client_secret'
182
+ )
183
+
184
+ # Search in Astra
185
+ with astra_client:
186
+ print(astra_client.ann_search(
187
+ entity_type=TestEntityWithEmbeddings,
188
+ vector_to_match=[0.1, 0.2, 0.3],
189
+ similarity_function=SimilarityFunction.DOT_PRODUCT
190
+ , num_results=2
191
+ ).to_pandas())
192
+
193
+ # col_a col_b col_d sim_value
194
+ # 0 something2 different1 extra2 0.5665
195
+ # 1 something1 different extra1 0.6300
171
196
 
172
-
173
- # Apply the filters for Astra
174
- with AstraClient(
175
- client_name='test',
176
- keyspace='tmp',
177
- secure_connect_bundle_bytes="base64 bundle string",
178
- client_id='client id',
179
- client_secret='client secret'
180
- ) as ac:
181
- # Filter expressions are compiled into specific target, in this case Astra filters, in filter_entities method
182
- print(ac.ann_search(entity_type=TestEntityWithEmbeddings, vector_to_match=[0.1, 0.2, 0.3],
183
- similarity_function=SimilarityFunction.DOT_PRODUCT, num_results=2).to_pandas())
184
-
185
- # col_a col_b sim_value
186
- # 0 something2 different1 0.5665
187
- # 1 something1 different 0.6300
197
+
198
+ # Search with primary key filter in Astra (with dictionary)
199
+ filter_expression = [{'col_a': 'something2', 'col_b': 'different1'}]
200
+ with astra_client:
201
+ print(astra_client.ann_search(
202
+ entity_type=TestEntityWithEmbeddings,
203
+ vector_to_match=[0.1, 0.2, 0.3],
204
+ similarity_function=SimilarityFunction.DOT_PRODUCT,
205
+ num_results=2,
206
+ key_column_filter_values=filter_expression
207
+ ).to_pandas())
208
+
209
+ # col_a col_b col_d sim_value
210
+ # 0 something2 different1 extra2 0.5665
211
+
212
+
213
+ # Search with primary key filter in Astra (with Expression)
214
+ filter_expression = (FilterField('col_a') == 'something2') & (FilterField('col_b').isin(['different1', 'doesnt_exist']))
215
+ with astra_client:
216
+ print(astra_client.ann_search(
217
+ entity_type=TestEntityWithEmbeddings,
218
+ vector_to_match=[0.1, 0.2, 0.3],
219
+ similarity_function=SimilarityFunction.DOT_PRODUCT,
220
+ num_results=2,
221
+ key_column_filter_values=filter_expression,
222
+ ).to_pandas())
223
+
224
+ # col_a col_b col_d sim_value
225
+ # 0 something2 different1 extra2 0.5665
188
226
  ```
@@ -0,0 +1,134 @@
1
+ """
2
+ Models for Astra DB.
3
+ """
4
+ # Copyright (c) 2023-2024. ECCO Sneaks & Data
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ import re
19
+
20
+ from enum import Enum
21
+ from typing import Optional, Union, List, Dict, Any
22
+
23
+ from adapta.storage.models.filter_expression import (
24
+ Expression,
25
+ compile_expression,
26
+ AstraFilterExpression,
27
+ FilterExpressionOperation,
28
+ )
29
+
30
+
31
+ class SimilarityFunction(Enum):
32
+ """
33
+ Supported similarity functions.
34
+ """
35
+
36
+ COSINE = "similarity_cosine"
37
+ DOT_PRODUCT = "similarity_dot_product"
38
+ EUCLIDEAN = "similarity_euclidean"
39
+
40
+
41
+ class VectorSearchQuery:
42
+ """
43
+ Builder for a vector search query. Result would resemble the following:
44
+
45
+ select description, similarity_cosine(item_vector, [0.1, 0.15, 0.3, 0.12, 0.05])
46
+ from vsearch.products
47
+
48
+ order by item_vector ann of [0.1, 0.15, 0.3, 0.12, 0.05]
49
+ limit 1;
50
+
51
+ """
52
+
53
+ def __init__(
54
+ self,
55
+ table_fqn: str,
56
+ data_fields: list[str],
57
+ sim_func: SimilarityFunction,
58
+ vector: list[float],
59
+ field_name: str,
60
+ num_results=1,
61
+ key_column_filter_values: Optional[Union[Expression, List[Dict[str, Any]]]] = None,
62
+ ):
63
+ self._sim_func = sim_func
64
+ self._vector = vector
65
+ self._field_name = field_name
66
+ self._num_results = num_results
67
+ self._table_fqn = table_fqn
68
+ self._data_fields = data_fields
69
+ self._key_column_filter_values = key_column_filter_values
70
+
71
+ def _get_similarity_colum(self) -> str:
72
+ return f"{self._sim_func.value}({self._field_name}, {self._vector})"
73
+
74
+ def _get_order_by(self) -> str:
75
+ return f"order by {self._field_name} ann of {self._vector} limit {self._num_results};"
76
+
77
+ def _get_filter(self) -> str:
78
+ if self._key_column_filter_values is None:
79
+ return ""
80
+
81
+ def format_value_for_cql(val: Any) -> str:
82
+ if isinstance(val, (tuple, list, set)):
83
+ return f"({', '.join(format_value_for_cql(v) for v in val)})"
84
+ if isinstance(val, str):
85
+ return f"'{val}'"
86
+ return str(val)
87
+
88
+ def get_astra_operator(column_expression: str) -> str:
89
+ operator_map = {
90
+ FilterExpressionOperation.GT.value["astra"]: ">",
91
+ FilterExpressionOperation.GE.value["astra"]: ">=",
92
+ FilterExpressionOperation.LT.value["astra"]: "<",
93
+ FilterExpressionOperation.LE.value["astra"]: "<=",
94
+ FilterExpressionOperation.IN.value["astra"]: "IN",
95
+ }
96
+
97
+ for suffix, operator in operator_map.items():
98
+ if column_expression.endswith(suffix):
99
+ return operator
100
+
101
+ return "="
102
+
103
+ def remove_operator_suffix(col: str) -> str:
104
+ """
105
+ Removes the double underscore and the subsequent operator suffix from a column expression.
106
+ Returns only the column name.
107
+ """
108
+ return re.sub(r"__\w+$", "", col)
109
+
110
+ compiled_filter_values = (
111
+ compile_expression(self._key_column_filter_values, AstraFilterExpression)
112
+ if isinstance(self._key_column_filter_values, Expression)
113
+ else self._key_column_filter_values
114
+ )
115
+ if len(compiled_filter_values) > 1:
116
+ raise ValueError("Restriction on key columns must not be nested under OR operator")
117
+
118
+ cql_filter_expressions = [
119
+ f"{remove_operator_suffix(col)} {get_astra_operator(col)} {format_value_for_cql(val)}"
120
+ for col, val in compiled_filter_values[0].items()
121
+ ]
122
+ return f"where {' and '.join(cql_filter_expressions)}"
123
+
124
+ def __str__(self):
125
+ return " ".join(
126
+ [
127
+ "select",
128
+ ", ".join(self._data_fields),
129
+ ", " f"{self._get_similarity_colum()} as sim_value",
130
+ f"from {self._table_fqn}",
131
+ self._get_filter(),
132
+ self._get_order_by(),
133
+ ]
134
+ )
@@ -300,17 +300,16 @@ class AstraClient:
300
300
  self._session is not None
301
301
  ), "Please instantiate an AstraClient using with AstraClient(...) before calling this method"
302
302
 
303
- mapper = get_mapper(
303
+ select_columns = list(map(normalize_column_name, select_columns)) if select_columns else None
304
+
305
+ cassandra_model = get_mapper(
304
306
  data_model=model_class,
305
307
  keyspace=keyspace,
306
308
  table_name=table_name,
307
309
  primary_keys=primary_keys,
308
310
  partition_keys=partition_keys,
309
311
  custom_indexes=custom_indexes,
310
- )
311
- cassandra_model = mapper.map()
312
-
313
- select_columns = list(map(normalize_column_name, select_columns)) if select_columns else mapper.column_names
312
+ ).map()
314
313
 
315
314
  compiled_filter_values = (
316
315
  compile_expression(key_column_filter_values, AstraFilterExpression)
@@ -490,6 +489,7 @@ class AstraClient:
490
489
  entity_type: Type[TModel],
491
490
  vector_to_match: list[float],
492
491
  similarity_function: SimilarityFunction = SimilarityFunction.COSINE,
492
+ key_column_filter_values: Optional[Union[Expression, List[Dict[str, Any]]]] = None,
493
493
  table_name: Optional[str] = None,
494
494
  return_vector: bool = False,
495
495
  num_results=1,
@@ -509,6 +509,7 @@ class AstraClient:
509
509
  query = VectorSearchQuery(
510
510
  table_fqn=f"{self._keyspace}.{model_mapper.table_name}",
511
511
  data_fields=[f for f in model_mapper.column_names if f != model_mapper.vector_column or return_vector],
512
+ key_column_filter_values=key_column_filter_values,
512
513
  sim_func=similarity_function,
513
514
  vector=vector_to_match,
514
515
  field_name=model_mapper.vector_column,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "adapta"
3
- version = "v3.2.3a475.dev3"
3
+ version = "v3.2.4a477.dev5"
4
4
  description = "Logging, data connectors, monitoring, secret handling and general lifehacks to make data people lives easier."
5
5
  authors = ["ECCO Sneaks & Data <esdsupport@ecco.com>"]
6
6
  maintainers = ['GZU <gzu@ecco.com>', 'JRB <ext-jrb@ecco.com>']
@@ -1 +0,0 @@
1
- __version__ = 'v3.2.3a475.dev3'
@@ -1,75 +0,0 @@
1
- """
2
- Models for Astra DB.
3
- """
4
- # Copyright (c) 2023-2024. ECCO Sneaks & Data
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- from enum import Enum
20
-
21
-
22
- class SimilarityFunction(Enum):
23
- """
24
- Supported similarity functions.
25
- """
26
-
27
- COSINE = "similarity_cosine"
28
- DOT_PRODUCT = "similarity_dot_product"
29
- EUCLIDEAN = "similarity_euclidean"
30
-
31
-
32
- class VectorSearchQuery:
33
- """
34
- Builder for a vector search query. Result would resemble the following:
35
-
36
- select description, similarity_cosine(item_vector, [0.1, 0.15, 0.3, 0.12, 0.05])
37
- from vsearch.products
38
-
39
- order by item_vector ann of [0.1, 0.15, 0.3, 0.12, 0.05]
40
- limit 1;
41
-
42
- """
43
-
44
- def __init__(
45
- self,
46
- table_fqn: str,
47
- data_fields: list[str],
48
- sim_func: SimilarityFunction,
49
- vector: list[float],
50
- field_name: str,
51
- num_results=1,
52
- ):
53
- self._sim_func = sim_func
54
- self._vector = vector
55
- self._field_name = field_name
56
- self._num_results = num_results
57
- self._table_fqn = table_fqn
58
- self._data_fields = data_fields
59
-
60
- def _get_similarity_colum(self) -> str:
61
- return f"{self._sim_func.value}({self._field_name}, {self._vector})"
62
-
63
- def _get_order_by(self) -> str:
64
- return f"order by {self._field_name} ann of {self._vector} limit {self._num_results};"
65
-
66
- def __str__(self):
67
- return " ".join(
68
- [
69
- "select",
70
- ", ".join(self._data_fields),
71
- ", " f"{self._get_similarity_colum()} as sim_value",
72
- f"from {self._table_fqn}",
73
- self._get_order_by(),
74
- ]
75
- )
File without changes