From 0783a0790a1faa9d7467b0a4e4811cd55d4ed1a7 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 14:03:46 -0700 Subject: [PATCH 1/9] initial commit for sampling feature dataset query --- Examples/Sample.py | 8 +++- odm2api/ODM2/models.py | 1 + odm2api/ODM2/services/readService.py | 63 +++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/Examples/Sample.py b/Examples/Sample.py index dcd8896..fc09cf6 100644 --- a/Examples/Sample.py +++ b/Examples/Sample.py @@ -17,15 +17,18 @@ #connect to database # createconnection (dbtype, servername, dbname, username, password) # session_factory = dbconnection.createConnection('connection type: sqlite|mysql|mssql|postgresql', '/your/path/to/db/goes/here', 2.0)#sqlite -session_factory = dbconnection.createConnection('postgresql', 'localhost', 'odm2', 'ODM', 'odm') +# session_factory = dbconnection.createConnection('postgresql', 'localhost', 'odm2', 'ODM', 'odm') # session_factory = dbconnection.createConnection('mysql', 'localhost', 'odm2', 'ODM', 'odm')#mysql # session_factory= dbconnection.createConnection('mssql', "(local)", "ODM2", "ODM", "odm")#win MSSQL + # session_factory= dbconnection.createConnection('mssql', "arroyoodm2", "", "ODM", "odm")#mac/linux MSSQL # session_factory = dbconnection.createConnection('sqlite', '/Users/stephanie/DEV/YODA-Tools/tests/test_files/XL_specimen.sqlite', 2.0) +session_factory = dbconnection.createConnection('postgresql', 'odm2wofpy1.uwrl.usu.edu', 'odm2', 'dbadmin', 'pinkbananastastegross') + @@ -39,6 +42,9 @@ create = CreateODM2(session_factory) +ds= read.getSamplingFeatureDatasets(ids = [1]) + + # Run some basic sample queries. # ------------------------------ # Get all of the variables from the database and print their names to the console diff --git a/odm2api/ODM2/models.py b/odm2api/ODM2/models.py index 7b6d5b2..805d755 100644 --- a/odm2api/ODM2/models.py +++ b/odm2api/ODM2/models.py @@ -316,6 +316,7 @@ class DataSets(Base): DataSetTitle = Column('datasettitle', String(255), nullable=False) DataSetAbstract = Column('datasetabstract', String(500), nullable=False) + # DatasetsResultsObj = relationship(DataSetsResults, primaryjoin='DatasetsResults.DatasetID == DataSets.ActionID') class ProcessingLevels(Base): """ diff --git a/odm2api/ODM2/services/readService.py b/odm2api/ODM2/services/readService.py index 5816127..d111547 100644 --- a/odm2api/ODM2/services/readService.py +++ b/odm2api/ODM2/services/readService.py @@ -12,7 +12,7 @@ CalibrationActions, CalibrationReferenceEquipment, CalibrationStandards, CategoricalResultValueAnnotations, CategoricalResultValues, CitationExtensionPropertyValues, CitationExternalIdentifiers, DataLoggerFileColumns, DataLoggerFiles, DataLoggerProgramFiles, - DataQuality, DataSetCitations, DataSets, DerivationEquations, Directives, Equipment, + DataQuality, DataSetCitations, DataSets, DataSetsResults, DerivationEquations, Directives, Equipment, EquipmentActions, EquipmentAnnotations, EquipmentModels, EquipmentUsed, ExtensionProperties, ExternalIdentifierSystems, FeatureActions, InstrumentOutputVariables, MaintenanceActions, MeasurementResultValueAnnotations, MeasurementResultValues, MethodAnnotations, @@ -462,6 +462,8 @@ def getRelatedSamplingFeatures(self, sfid=None, rfid=None, relationshiptype=None print('Error running Query: {}'.format(e)) return None + + # Action def getActions(self, ids=None, type=None, sfid=None): """ @@ -694,13 +696,70 @@ def getDataSets(self, codes=None, uuids=None): if codes: q = q.filter(DataSets.DataSetCode.in_(codes)) if uuids: - q.q.filter(DataSets.DataSetUUID.in_(uuids)) + q.filter(DataSets.DataSetUUID.in_(uuids)) try: return q.all() except Exception as e: print('Error running Query {}'.format(e)) return None + def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None): + """Retrieve a list of Sampling Feature objects. + Retrieve a list of Datasets associated with the given sampling feature data. + + Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode) + + Args: + ids (list, optional): List of SamplingFeatureIDs. + codes (list, optional): List of SamplingFeature Codes. + uuids (list, optional): List of UUIDs string. + type (str, optional): Type of Dataset from + `controlled vocabulary name `_. + + + Returns: + list: List of sampling feature objects along with their associated datasets + + Examples: + >>> READ = ReadODM2(SESSION_FACTORY) + >>> READ.getSamplingFeatureDatasets(ids=[39, 40]) + >>> READ.getSamplingFeatureDatasets(codes=['HOME', 'FIELD']) + >>> READ.getSamplingFeatureDatasets(uuids=['a6f114f1-5416-4606-ae10-23be32dbc202', + ... '5396fdf3-ceb3-46b6-aaf9-454a37278bb4']) + >>> READ.getSamplingFeatureDatasets(type='singleTimeSeries') + + """ + + + # make sure one of the three arguments has been sent in + if all(v is None for v in [ids, codes, uuids]): + raise ValueError('Expected samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode argument') + + sf_query = self._session.query(SamplingFeatures.SamplingFeatureID) + + if ids: + sf_query = sf_query.filter(SamplingFeatures.SamplingFeatureID.in_(ids)) + if codes: + sf_query = sf_query.filter(SamplingFeatures.SamplingFeatureCode.in_(codes)) + if uuids: + sf_query = sf_query.filter(SamplingFeatures.SamplingFeatureUUID.in_(uuids)) + sf_list = sf_query.all() + + # , DataSetsResults)\ + q = self._session.query(DataSetsResults)\ + .join(Results)\ + .join(FeatureActions)\ + .filter(FeatureActions.SamplingFeatureID.in_(sf_list)) + + if type: + q = q.filter_by(DatasetTypeCV=type) + + try: + return q.all() + except Exception as e: + print('Error running Query: {}'.format(e)) + return None + # Data Quality def getDataQuality(self): """ From 959ba641b3ba6d871e408e572bbe54e24b375d97 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 14:42:39 -0700 Subject: [PATCH 2/9] remove extra info --- Examples/Sample.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Examples/Sample.py b/Examples/Sample.py index fc09cf6..81ad52c 100644 --- a/Examples/Sample.py +++ b/Examples/Sample.py @@ -27,7 +27,7 @@ # session_factory = dbconnection.createConnection('sqlite', '/Users/stephanie/DEV/YODA-Tools/tests/test_files/XL_specimen.sqlite', 2.0) -session_factory = dbconnection.createConnection('postgresql', 'odm2wofpy1.uwrl.usu.edu', 'odm2', 'dbadmin', 'pinkbananastastegross') + @@ -42,7 +42,7 @@ create = CreateODM2(session_factory) -ds= read.getSamplingFeatureDatasets(ids = [1]) +ds= read.getSamplingFeatureDatasets(ids = [1001]) # Run some basic sample queries. From d91ddc702526e7867e45821a2b166e3bb202bd14 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 14:43:41 -0700 Subject: [PATCH 3/9] cleanup models comments --- odm2api/ODM2/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/odm2api/ODM2/models.py b/odm2api/ODM2/models.py index 805d755..7b6d5b2 100644 --- a/odm2api/ODM2/models.py +++ b/odm2api/ODM2/models.py @@ -316,7 +316,6 @@ class DataSets(Base): DataSetTitle = Column('datasettitle', String(255), nullable=False) DataSetAbstract = Column('datasetabstract', String(500), nullable=False) - # DatasetsResultsObj = relationship(DataSetsResults, primaryjoin='DatasetsResults.DatasetID == DataSets.ActionID') class ProcessingLevels(Base): """ From 9419af87de11197c2cfdbcc3057c8bdd5fb7da36 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 14:46:05 -0700 Subject: [PATCH 4/9] update inline documentation --- odm2api/ODM2/services/readService.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/odm2api/ODM2/services/readService.py b/odm2api/ODM2/services/readService.py index d111547..9c71d49 100644 --- a/odm2api/ODM2/services/readService.py +++ b/odm2api/ODM2/services/readService.py @@ -714,11 +714,11 @@ def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None codes (list, optional): List of SamplingFeature Codes. uuids (list, optional): List of UUIDs string. type (str, optional): Type of Dataset from - `controlled vocabulary name `_. + `controlled vocabulary name `_. Returns: - list: List of sampling feature objects along with their associated datasets + list: List of DataSetsResults Objects associated with the given sampling feature Examples: >>> READ = ReadODM2(SESSION_FACTORY) @@ -745,7 +745,7 @@ def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None sf_query = sf_query.filter(SamplingFeatures.SamplingFeatureUUID.in_(uuids)) sf_list = sf_query.all() - # , DataSetsResults)\ + q = self._session.query(DataSetsResults)\ .join(Results)\ .join(FeatureActions)\ From 01b1933a6ec7990f6d8717379ba3de00f2a357b3 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 15:02:08 -0700 Subject: [PATCH 5/9] cleanup documentation url --- odm2api/ODM2/services/readService.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odm2api/ODM2/services/readService.py b/odm2api/ODM2/services/readService.py index 9c71d49..85cec4d 100644 --- a/odm2api/ODM2/services/readService.py +++ b/odm2api/ODM2/services/readService.py @@ -714,7 +714,7 @@ def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None codes (list, optional): List of SamplingFeature Codes. uuids (list, optional): List of UUIDs string. type (str, optional): Type of Dataset from - `controlled vocabulary name `_. + `controlled vocabulary name `_. Returns: From e4de3e4418557a453d4a45e271a3072971df1b63 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 15:10:06 -0700 Subject: [PATCH 6/9] bold required element in documentation --- Examples/Sample.py | 2 +- odm2api/ODM2/services/readService.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Examples/Sample.py b/Examples/Sample.py index 81ad52c..2c0f41e 100644 --- a/Examples/Sample.py +++ b/Examples/Sample.py @@ -27,7 +27,7 @@ # session_factory = dbconnection.createConnection('sqlite', '/Users/stephanie/DEV/YODA-Tools/tests/test_files/XL_specimen.sqlite', 2.0) - +session_factory = dbconnection.createConnection('postgresql', 'odm2wofpy1.uwrl.usu.edu', 'odm2', 'dbadmin', 'pinkbananastastegross') diff --git a/odm2api/ODM2/services/readService.py b/odm2api/ODM2/services/readService.py index 85cec4d..54f3a29 100644 --- a/odm2api/ODM2/services/readService.py +++ b/odm2api/ODM2/services/readService.py @@ -707,7 +707,7 @@ def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None """Retrieve a list of Sampling Feature objects. Retrieve a list of Datasets associated with the given sampling feature data. - Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode) + >>>Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode) Args: ids (list, optional): List of SamplingFeatureIDs. From 60ebf3f300136780961e407719354c07e6c7e154 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 15:15:05 -0700 Subject: [PATCH 7/9] rename type to dstype --- odm2api/ODM2/services/readService.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/odm2api/ODM2/services/readService.py b/odm2api/ODM2/services/readService.py index 54f3a29..61dafeb 100644 --- a/odm2api/ODM2/services/readService.py +++ b/odm2api/ODM2/services/readService.py @@ -703,11 +703,11 @@ def getDataSets(self, codes=None, uuids=None): print('Error running Query {}'.format(e)) return None - def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None): + def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, dstype=None): """Retrieve a list of Sampling Feature objects. Retrieve a list of Datasets associated with the given sampling feature data. - >>>Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode) + >>> Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode) Args: ids (list, optional): List of SamplingFeatureIDs. @@ -726,7 +726,7 @@ def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None >>> READ.getSamplingFeatureDatasets(codes=['HOME', 'FIELD']) >>> READ.getSamplingFeatureDatasets(uuids=['a6f114f1-5416-4606-ae10-23be32dbc202', ... '5396fdf3-ceb3-46b6-aaf9-454a37278bb4']) - >>> READ.getSamplingFeatureDatasets(type='singleTimeSeries') + >>> READ.getSamplingFeatureDatasets(dstype='singleTimeSeries') """ @@ -751,8 +751,8 @@ def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, type=None .join(FeatureActions)\ .filter(FeatureActions.SamplingFeatureID.in_(sf_list)) - if type: - q = q.filter_by(DatasetTypeCV=type) + if dstype: + q = q.filter_by(DatasetTypeCV=dstype) try: return q.all() From 53e9631a081a6e0779ee7a45794b30adcc1987a8 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 15:19:50 -0700 Subject: [PATCH 8/9] fix bold documentations --- odm2api/ODM2/services/readService.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/odm2api/ODM2/services/readService.py b/odm2api/ODM2/services/readService.py index 61dafeb..06252ad 100644 --- a/odm2api/ODM2/services/readService.py +++ b/odm2api/ODM2/services/readService.py @@ -704,16 +704,16 @@ def getDataSets(self, codes=None, uuids=None): return None def getSamplingFeatureDatasets(self, ids=None, codes=None, uuids=None, dstype=None): - """Retrieve a list of Sampling Feature objects. + """ Retrieve a list of Datasets associated with the given sampling feature data. - >>> Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode) + **Must specify either samplingFeatureID OR samplingFeatureUUID OR samplingFeatureCode)** Args: ids (list, optional): List of SamplingFeatureIDs. codes (list, optional): List of SamplingFeature Codes. uuids (list, optional): List of UUIDs string. - type (str, optional): Type of Dataset from + dstype (str, optional): Type of Dataset from `controlled vocabulary name `_. From 4df7799f63fb288f5979b0368f0f4e16e85539b7 Mon Sep 17 00:00:00 2001 From: sreeder Date: Mon, 6 Nov 2017 15:24:47 -0700 Subject: [PATCH 9/9] all ready for merging --- Examples/Sample.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Examples/Sample.py b/Examples/Sample.py index 2c0f41e..3292780 100644 --- a/Examples/Sample.py +++ b/Examples/Sample.py @@ -17,7 +17,7 @@ #connect to database # createconnection (dbtype, servername, dbname, username, password) # session_factory = dbconnection.createConnection('connection type: sqlite|mysql|mssql|postgresql', '/your/path/to/db/goes/here', 2.0)#sqlite -# session_factory = dbconnection.createConnection('postgresql', 'localhost', 'odm2', 'ODM', 'odm') +session_factory = dbconnection.createConnection('postgresql', 'localhost', 'odm2', 'ODM', 'odm') # session_factory = dbconnection.createConnection('mysql', 'localhost', 'odm2', 'ODM', 'odm')#mysql # session_factory= dbconnection.createConnection('mssql', "(local)", "ODM2", "ODM", "odm")#win MSSQL @@ -27,13 +27,6 @@ # session_factory = dbconnection.createConnection('sqlite', '/Users/stephanie/DEV/YODA-Tools/tests/test_files/XL_specimen.sqlite', 2.0) -session_factory = dbconnection.createConnection('postgresql', 'odm2wofpy1.uwrl.usu.edu', 'odm2', 'dbadmin', 'pinkbananastastegross') - - - - - - @@ -42,7 +35,7 @@ create = CreateODM2(session_factory) -ds= read.getSamplingFeatureDatasets(ids = [1001]) + # Run some basic sample queries.