Skip to content

Commit c93bbe8

Browse files
authored
Merge pull request #190 from SCAI-BIO/refactor/remove-sqlite
refactor: remove sqlite
2 parents 763b319 + 08320e5 commit c93bbe8

12 files changed

Lines changed: 57 additions & 621 deletions

datastew/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
Concept,
88
Mapping,
99
Terminology,
10-
base,
1110
model,
1211
pagination,
1312
postgresql,
14-
sqllite,
1513
)
1614
from .visualisation import (
1715
bar_chart_average_acc_two_distributions,
@@ -26,11 +24,9 @@
2624
"mapping",
2725
"ols",
2826
"parsing",
29-
"base",
3027
"model",
3128
"pagination",
3229
"postgresql",
33-
"sqllite",
3430
"EmbeddingModel",
3531
"GPT4Adapter",
3632
"HuggingFaceAdapter",

datastew/process/jsonl_adapter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from tqdm import tqdm
88

99
from datastew.embedding import Vectorizer
10-
from datastew.repository import PostgreSQLRepository, SQLLiteRepository
10+
from datastew.repository import PostgreSQLRepository
1111
from datastew.repository.model import Concept, Mapping, Terminology
1212

1313

@@ -69,7 +69,7 @@ def _flush_to_file(self, file_path: str):
6969

7070
self._buffer.clear()
7171

72-
def from_repository(self, repository: Union[PostgreSQLRepository, SQLLiteRepository]):
72+
def from_repository(self, repository: PostgreSQLRepository):
7373
"""Export all records from a PostgreSQLRepository to JSONL files
7474
7575
:param repository: Active database repository instace.

datastew/process/ols.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import requests
66

77
from datastew.embedding import Vectorizer
8-
from datastew.repository.base import BaseRepository
98
from datastew.repository.model import Concept, Mapping, Terminology
9+
from datastew.repository.postgresql import PostgreSQLRepository
1010

1111

1212
class OLSTerminologyImportTask:
@@ -83,7 +83,7 @@ def __process_page(self, page: int) -> Tuple[List[Concept], List[Mapping]]:
8383
logging.error(f"Failed to fetch concepts and descriptions from OLS for page {page}: {str(e)}")
8484
return [], []
8585

86-
def process_to_repository(self, repository: BaseRepository):
86+
def process_to_repository(self, repository: PostgreSQLRepository):
8787
"""
8888
Fetches concepts and descriptions from the OLS API and stores them in a repository.
8989

datastew/repository/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from .model import Concept, Mapping, Terminology
22
from .postgresql import PostgreSQLRepository
3-
from .sqllite import SQLLiteRepository
43

5-
__all__ = ["Terminology", "Concept", "Mapping", "SQLLiteRepository", "PostgreSQLRepository"]
4+
__all__ = ["Terminology", "Concept", "Mapping", "PostgreSQLRepository"]

datastew/repository/base.py

Lines changed: 0 additions & 124 deletions
This file was deleted.

datastew/repository/postgresql.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77

88
from datastew.embedding import Vectorizer
99
from datastew.exceptions import ObjectStorageError
10-
from datastew.repository.base import BaseRepository
10+
from datastew.process.parsing import DataDictionarySource
1111
from datastew.repository.model import Base, Concept, Mapping, MappingResult, Terminology
1212
from datastew.repository.pagination import Page
1313

1414
logger = logging.getLogger(__name__)
1515

1616

17-
class PostgreSQLRepository(BaseRepository):
17+
class PostgreSQLRepository:
1818
def __init__(
1919
self,
2020
connection_string: str,
@@ -33,7 +33,7 @@ def __init__(
3333
:param pool_timeout: The maximum time (in seconds) to wait for a connection from
3434
the pool before raising an exception.
3535
"""
36-
super().__init__(vectorizer)
36+
self.vectorizer = vectorizer
3737
self.engine = create_engine(
3838
connection_string, pool_size=pool_size, max_overflow=max_overflow, pool_timeout=pool_timeout
3939
)
@@ -197,6 +197,20 @@ def clear_all(self):
197197
self.session.query(Terminology).delete()
198198
self.session.commit()
199199

200+
def import_data_dictionary(self, data_dictionary: DataDictionarySource, terminology_name: str):
201+
"""Imports a data dictionary, generating concepts and embeddings, and stores them in the database.
202+
203+
:param data_dictionary: Source of variable descriptions and metadata.
204+
:param terminology_name: Name of the terminology being imported.
205+
:raises RuntimeError: If the import or transformation fails.
206+
"""
207+
try:
208+
objects = self._parse_data_dictionary(data_dictionary, terminology_name)
209+
self.store_all(objects)
210+
except Exception as e:
211+
logger.exception("Failed to import data dictionary.")
212+
raise RuntimeError(f"Failed to import data dictionary source: {e}")
213+
200214
def import_from_jsonl(
201215
self, jsonl_path: str, object_type: Literal["terminology", "concept", "mapping"], chunk_size: int = 100
202216
):
@@ -305,3 +319,27 @@ def _validate_required_fields(
305319
def _initialize_pgvector(self):
306320
with self.engine.begin() as conn:
307321
conn.execute(text("CREATE EXTENSION IF NOT EXISTS vector"))
322+
323+
def _parse_data_dictionary(
324+
self, data_dictionary: DataDictionarySource, terminology_name: str
325+
) -> List[Union[Concept, Mapping, Terminology]]:
326+
df = data_dictionary.to_dataframe()
327+
descriptions = df["description"].tolist()
328+
vectorizer_name = self.vectorizer.model_name
329+
variable_to_embedding = data_dictionary.get_embeddings(self.vectorizer)
330+
331+
terminology = Terminology(name=terminology_name, id=terminology_name)
332+
objects: List[Union[Concept, Mapping, Terminology]] = [terminology]
333+
334+
for variable, description in zip(variable_to_embedding.keys(), descriptions):
335+
concept_id = f"{terminology_name}:{variable}"
336+
concept = Concept(terminology=terminology, pref_label=variable, concept_identifier=concept_id)
337+
mapping = Mapping(
338+
concept=concept,
339+
text=description,
340+
embedding=variable_to_embedding[variable],
341+
sentence_embedder=vectorizer_name,
342+
)
343+
objects.extend([concept, mapping])
344+
345+
return objects

0 commit comments

Comments
 (0)