Skip to content

Commit

Permalink
Sqlalchemy 2.0 changes.
Browse files Browse the repository at this point in the history
Issue #90
  • Loading branch information
Wim-De-Clercq committed Jan 9, 2023
1 parent 7025893 commit 0df62ff
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 41 deletions.
18 changes: 11 additions & 7 deletions skosprovider_sqlalchemy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
from sqlalchemy import Text
from sqlalchemy import UniqueConstraint
from sqlalchemy import event
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import orm
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import backref
from sqlalchemy.orm import relationship

log = logging.getLogger(__name__)
Base = declarative_base()
Base = orm.declarative_base()

concept_label = Table(
'concept_label',
Expand Down Expand Up @@ -199,7 +199,9 @@ class Thing(Base):
single_parent=True
)

conceptscheme = relationship('ConceptScheme', backref='concepts')
conceptscheme = relationship(
'ConceptScheme', backref=orm.backref('concepts', cascade_backrefs=False)
)
conceptscheme_id = Column(
Integer,
ForeignKey('conceptscheme.id'),
Expand Down Expand Up @@ -253,19 +255,21 @@ class Concept(Thing):
narrower_concepts = relationship(
'Concept',
secondary=concept_hierarchy_concept,
backref=backref('broader_concepts', collection_class=set),
backref=backref('broader_concepts', collection_class=set, cascade_backrefs=False),
primaryjoin='Concept.id==concept_hierarchy_concept.c.concept_id_broader',
secondaryjoin='Concept.id==concept_hierarchy_concept.c.concept_id_narrower',
collection_class=set
collection_class=set,
cascade_backrefs=False,
)

narrower_collections = relationship(
'Collection',
secondary=concept_hierarchy_collection,
backref=backref('broader_concepts', collection_class=set),
backref=backref('broader_concepts', collection_class=set, cascade_backrefs=False),
primaryjoin='Concept.id==concept_hierarchy_collection.c.concept_id_broader',
secondaryjoin='Concept.id==concept_hierarchy_collection.c.collection_id_narrower',
collection_class=set
collection_class=set,
cascade_backrefs=False,
)

__mapper_args__ = {
Expand Down
44 changes: 25 additions & 19 deletions skosprovider_sqlalchemy/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,19 @@ def _get_concept_scheme(self):
:param id: Id of a conceptscheme.
:rtype: :class:`skosprovider.skos.ConceptScheme`
'''
csm = self.session\
.query(ConceptSchemeModel)\
.options(joinedload('labels'))\
.options(joinedload('notes'))\
.options(joinedload('languages'))\
.options(joinedload('sources'))\
.get(self.conceptscheme_id)
csm = (
self.session
.get(
ConceptSchemeModel,
self.conceptscheme_id,
options=[
joinedload(ConceptSchemeModel.labels),
joinedload(ConceptSchemeModel.notes),
joinedload(ConceptSchemeModel.languages),
joinedload(ConceptSchemeModel.sources),
]
)
)
return ConceptScheme(
uri=csm.uri,
labels=[
Expand Down Expand Up @@ -184,9 +190,9 @@ def get_by_id(self, concept_id):
try:
thing = self.session\
.query(Thing)\
.options(joinedload('labels'))\
.options(joinedload('notes'))\
.options(joinedload('sources'))\
.options(joinedload(Thing.labels))\
.options(joinedload(Thing.notes))\
.options(joinedload(Thing.sources))\
.filter(
Thing.concept_id == str(concept_id),
Thing.conceptscheme_id == self.conceptscheme_id
Expand All @@ -211,9 +217,9 @@ def get_by_uri(self, uri):
try:
thing = self.session\
.query(Thing)\
.options(joinedload('labels'))\
.options(joinedload('notes'))\
.options(joinedload('sources'))\
.options(joinedload(Thing.labels))\
.options(joinedload(Thing.notes))\
.options(joinedload(Thing.sources))\
.filter(
Thing.uri == uri,
Thing.conceptscheme_id == self.conceptscheme_id
Expand Down Expand Up @@ -247,7 +253,7 @@ def find(self, query, **kwargs):
model = ConceptModel
q = self.session\
.query(model)\
.options(joinedload('labels'))\
.options(joinedload(model.labels))\
.join(MatchModel)\
.filter(model.conceptscheme_id == self.conceptscheme_id)
mtype = query['matches'].get('type')
Expand All @@ -265,7 +271,7 @@ def find(self, query, **kwargs):
else:
q = self.session\
.query(model)\
.options(joinedload('labels'))\
.options(joinedload(model.labels))\
.filter(model.conceptscheme_id == self.conceptscheme_id)
if 'type' in query and query['type'] in ['concept', 'collection']:
q = q.filter(model.type == query['type'])
Expand Down Expand Up @@ -294,7 +300,7 @@ def find(self, query, **kwargs):
def get_all(self, **kwargs):
all = self.session\
.query(Thing)\
.options(joinedload('labels'))\
.options(joinedload(Thing.labels))\
.filter(Thing.conceptscheme_id == self.conceptscheme_id)\
.all()
lan = self._get_language(**kwargs)
Expand All @@ -306,7 +312,7 @@ def get_top_concepts(self, **kwargs):
# get the concepts that have no direct broader concept
top = self.session\
.query(ConceptModel)\
.options(joinedload('labels'))\
.options(joinedload(ConceptModel.labels))\
.filter(
ConceptModel.conceptscheme_id == self.conceptscheme_id,
ConceptModel.broader_concepts == None
Expand Down Expand Up @@ -392,15 +398,15 @@ def get_top_display(self, **kwargs):
'''
tco = self.session\
.query(ConceptModel)\
.options(joinedload('labels'))\
.options(joinedload(ConceptModel.labels))\
.filter(
ConceptModel.conceptscheme_id == self.conceptscheme_id,
ConceptModel.broader_concepts == None,
ConceptModel.member_of == None
).all()
tcl = self.session\
.query(CollectionModel)\
.options(joinedload('labels'))\
.options(joinedload(CollectionModel.labels))\
.filter(
CollectionModel.conceptscheme_id == self.conceptscheme_id,
CollectionModel.broader_concepts == None,
Expand Down
6 changes: 3 additions & 3 deletions skosprovider_sqlalchemy/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ def import_provider(provider, conceptscheme, session):
uri=c.uri,
conceptscheme=conceptscheme
)
session.add(cm)
_add_labels(cm, c.labels, session)
_add_notes(cm, c.notes, session)
_add_sources(cm, c.sources, session)
Expand All @@ -65,7 +66,6 @@ def import_provider(provider, conceptscheme, session):
for m in c.matches[mt]:
match = MatchModel(matchtype_id=matchtype, uri=m)
cm.matches.append(match)
session.add(cm)

session.flush()

Expand Down Expand Up @@ -139,9 +139,9 @@ def _check_language(language_tag, session):
:param session: Database session to use
:rtype: :class:`skosprovider_sqlalchemy.models.Language`
'''
if not language_tag: # pragma: no cover
if not language_tag: # pragma: no cover
language_tag = 'und'
l = session.query(LanguageModel).get(language_tag)
l = session.get(LanguageModel, language_tag)
if not l:
if not tags.check(language_tag):
raise ValueError('Unable to import provider. Invalid language tag: %s' % language_tag)
Expand Down
6 changes: 3 additions & 3 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def pytest_addoption(parser):
def engine(request):
engine = create_engine(
request.config.getoption('--sqlalchemy_url'),
echo=True
echo=True,
)

return engine
Expand All @@ -41,8 +41,8 @@ def create_data(session):
Match,
Language
)
en = session.query(Language).get('en')
nl = session.query(Language).get('nl')
en = session.get(Language, 'en')
nl = session.get(Language, 'nl')
cs = ConceptScheme(
id=1,
uri='urn:x-skosprovider:test',
Expand Down
16 changes: 7 additions & 9 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,8 @@ def _get_materials():
def _get_heritage_types():
import json

typology_data = json.load(
open(os.path.join(os.path.dirname(__file__), 'data', 'typologie.js')),
)['typologie']
with open(os.path.join(os.path.dirname(__file__), 'data', 'typologie.js')) as f:
typology_data = json.load(f)['typologie']
from skosprovider.providers import DictionaryProvider
from skosprovider.uri import UriPatternGenerator
from skosprovider.skos import ConceptScheme
Expand Down Expand Up @@ -268,9 +267,8 @@ def _get_heritage_types():
def _get_event_types():
import json

event_data = json.load(
open(os.path.join(os.path.dirname(__file__), 'data', 'gebeurtenis.js')),
)['gebeurtenis']
with open(os.path.join(os.path.dirname(__file__), 'data', 'gebeurtenis.js')) as f:
event_data = json.load(f)['gebeurtenis']
from skosprovider.providers import DictionaryProvider
from skosprovider.uri import UriPatternGenerator

Expand Down Expand Up @@ -314,7 +312,7 @@ def test_empty_provider(self):
cs = self._get_cs()
self.session.add(cs)
import_provider(p, cs, self.session)
scheme = self.session.query(ConceptSchemeModel).get(68)
scheme = self.session.get(ConceptSchemeModel, 68)
assert scheme == cs

def test_menu(self):
Expand Down Expand Up @@ -538,7 +536,7 @@ def test_geo(self):
visit = vc.visit(cs)
assert 10 == len(visit)
world = visit[0]
assert self.session.query(ConceptModel).get(world['id']).concept_id == 1
assert self.session.get(ConceptModel, world['id']).concept_id == 1
assert 1 == world['lft']
assert 20 == world['rght']
assert 1 == world['depth']
Expand All @@ -563,7 +561,7 @@ def test_buildings(self):
visit = vc.visit(cs)
assert len(visit) == 5
# Check that castle is present twice
ids = [self.session.query(ConceptModel).get(v['id']).concept_id for v in visit]
ids = [self.session.get(ConceptModel, v['id']).concept_id for v in visit]
assert ids.count(2) == 2
for v in visit:
# Check that fortification has one child
Expand Down

0 comments on commit 0df62ff

Please sign in to comment.