Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions bio/ensembl/ontology/loader/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,26 @@ class DataAccessLayer:
session = None

def db_init(self, conn_string, **options):
extra_params = {}
if 'mysql' in conn_string:
extra_params = dict(
pool_recycle = options.get('pool_recycle', 280),
pool_size = options.get('pool_size', 100)
)

self.engine = sqlalchemy.create_engine(conn_string,
pool_recycle=options.get('pool_recycle', 280),
pool_size=options.get('pool_size', 100),
echo=options.get('echo', False),
encoding='utf8',
**extra_params,
convert_unicode=True)
self.options = options or {}
self.metadata.create_all(self.engine)
self.connection = self.engine.connect()

def wipe_schema(self, conn_string):
engine = sqlalchemy.create_engine(conn_string, echo=False)
if not engine:
raise RuntimeError("Can't wipe schema prior to init db")
Base.metadata.drop_all(engine)

def get_session(self):
Expand Down
5 changes: 3 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
requests==2.20.0
SQLAlchemy==1.2.11
ebi-ols-client==1.0.6
ebi-ols-client==1.0.7
mysqlclient==1.3.13
dateutils==0.6.6
coreapi==2.3.3
coreapi==2.3.3
PyMySQL==0.9.2
2 changes: 1 addition & 1 deletion scripts/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
logger.debug('Script arguments %s', arguments)
args = vars(parser.parse_args())
db_name = 'ensembl_ontology_{}'.format(arguments.release)
options = {'drop': not arguments.keep, 'echo': arguments.verbose}
options = {'drop': not arguments.keep, 'echo': arguments.verbose, 'db_version': arguments.release}
if arguments.host_url is None:
db_url = 'sqlite:///' + expanduser("~") + '/' + db_name + '.sqlite'
options.update({'pool_size':None})
Expand Down
97 changes: 44 additions & 53 deletions tests/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,6 @@ def testLoadOntology(self):
self.assertEqual(5, session.query(Term).count())
ontologies = session.query(Ontology).filter_by(name=ontology_name)
self.assertEqual(ontologies.count(), 2)
if self.db_url.startswith('mysql'):
session = dal.get_session()
self.loader.wipe_ontology(ontology_name=ontology_name)
ontologies = session.query(Ontology).filter_by(name=ontology_name).count()
self.assertEqual(ontologies, 0)

def testLoadOntologyTerms(self):
session = dal.get_session()
Expand Down Expand Up @@ -117,55 +112,51 @@ def testLoadTimeMeta(self):
self.fail('Wrong date format')

def testCascadeDelete(self):
self.skipTest('mysql' in self.db_url)
with dal.session_scope() as session:
m_ontology = Ontology(name='GO', _namespace='namespace', version='1', title='Ontology test')
m_ontology_2 = Ontology(name='GO', _namespace='namespace 2', version='1', title='Ontology test 2')
m_ontology_3 = Ontology(name='FPO', _namespace='namespace 3', version='1', title='Ontology test 2')
session.add(m_ontology)
session.add(m_ontology_2)
session.add(m_ontology_3)
rel_type, created = get_one_or_create(RelationType,
session,
name='is_a')
for i in range(0, 5):
m_term = Term(accession='GO:0000%s' % i, name='Term %s' % i, ontology=m_ontology)
m_term_2 = Term(accession='GO:1000%s' % i, name='Term %s' % i, ontology=m_ontology_2)
m_term_3 = Term(accession='T3:0000%s' % i, name='Term %s' % i, ontology=m_ontology_3)
syn_1 = Synonym(name='TS:000%s' % i, type=SynonymTypeEnum.EXACT, db_xref='REF:000%s' % i)
m_term.synonyms.append(syn_1)
syn_2 = Synonym(name='TS2:000%s' % i, type=SynonymTypeEnum.EXACT, db_xref='REF:000%s' % i)
m_term_2.synonyms.append(syn_2)
session.add_all([syn_1, syn_2])
alt_id = AltId(accession='ATL:000%s' % i)
m_term.alt_ids.append(alt_id)
session.add(alt_id)
m_term.add_child_relation(session=session, rel_type=rel_type, child_term=m_term_3)
m_term.add_parent_relation(session=session, rel_type=rel_type, parent_term=m_term_2)
closure_1 = Closure(child_term=m_term, parent_term=m_term_2, distance=1, ontology=m_ontology)
closure_2 = Closure(parent_term=m_term, child_term=m_term_3, distance=3, ontology=m_ontology_2)
closure_3 = Closure(parent_term=m_term_2, child_term=m_term_3, subparent_term=m_term, distance=2,
ontology=m_ontology_3)
session.add_all([closure_1, closure_2, closure_3])

self.assertEqual(session.query(Synonym).count(), 10)
self.assertEqual(session.query(AltId).count(), 5)
self.assertEqual(session.query(Relation).count(), 10)
self.assertEqual(session.query(Closure).count(), 12)

if self.db_url.startswith('mysql'):

with dal.session_scope() as session:
m_ontology = Ontology(name='GO', _namespace='namespace', version='1', title='Ontology test')
m_ontology_2 = Ontology(name='GO', _namespace='namespace 2', version='1', title='Ontology test 2')
m_ontology_3 = Ontology(name='FPO', _namespace='namespace 3', version='1', title='Ontology test 2')
session.add(m_ontology)
session.add(m_ontology_2)
session.add(m_ontology_3)
rel_type, created = get_one_or_create(RelationType,
session,
name='is_a')
for i in range(0, 5):
m_term = Term(accession='GO:0000%s' % i, name='Term %s' % i, ontology=m_ontology)
m_term_2 = Term(accession='GO:1000%s' % i, name='Term %s' % i, ontology=m_ontology_2)
m_term_3 = Term(accession='T3:0000%s' % i, name='Term %s' % i, ontology=m_ontology_3)
syn_1 = Synonym(name='TS:000%s' % i, type=SynonymTypeEnum.EXACT, db_xref='REF:000%s' % i)
m_term.synonyms.append(syn_1)
syn_2 = Synonym(name='TS2:000%s' % i, type=SynonymTypeEnum.EXACT, db_xref='REF:000%s' % i)
m_term_2.synonyms.append(syn_2)
session.add_all([syn_1, syn_2])
alt_id = AltId(accession='ATL:000%s' % i)
m_term.alt_ids.append(alt_id)
session.add(alt_id)
m_term.add_child_relation(session=session, rel_type=rel_type, child_term=m_term_3)
m_term.add_parent_relation(session=session, rel_type=rel_type, parent_term=m_term_2)
closure_1 = Closure(child_term=m_term, parent_term=m_term_2, distance=1, ontology=m_ontology)
closure_2 = Closure(parent_term=m_term, child_term=m_term_3, distance=3, ontology=m_ontology_2)
closure_3 = Closure(parent_term=m_term_2, child_term=m_term_3, subparent_term=m_term, distance=2,
ontology=m_ontology_3)
session.add_all([closure_1, closure_2, closure_3])

self.assertEqual(session.query(Synonym).count(), 10)
self.assertEqual(session.query(AltId).count(), 5)
self.assertEqual(session.query(Relation).count(), 10)
self.assertEqual(session.query(Closure).count(), 12)

with dal.session_scope() as session:
self.loader.wipe_ontology('GO')
[self.assertTrue(term.accession.startswith('T3')) for term in session.query(Term).all()]
self.assertEqual(0, session.query(Term).filter(Term.ontology_id == 1).count())
self.assertEqual(session.query(Term).count(), 5)
self.assertEqual(session.query(Synonym).count(), 0)
self.assertEqual(session.query(AltId).count(), 0)
self.assertEqual(session.query(Relation).count(), 0)
self.assertEqual(session.query(Closure).count(), 0)
else:
self.skipTest('No suitable engine for testing')
with dal.session_scope() as session:
self.loader.wipe_ontology('GO')
[self.assertTrue(term.accession.startswith('T3')) for term in session.query(Term).all()]
self.assertEqual(0, session.query(Term).filter(Term.ontology_id == 1).count())
self.assertEqual(session.query(Term).count(), 5)
self.assertEqual(session.query(Synonym).count(), 0)
self.assertEqual(session.query(AltId).count(), 0)
self.assertEqual(session.query(Relation).count(), 0)
self.assertEqual(session.query(Closure).count(), 0)

def testMeta(self):
session = dal.get_session()
Expand Down