diff --git a/Examples/Sample.py b/Examples/Sample.py index dcd8896..3292780 100644 --- a/Examples/Sample.py +++ b/Examples/Sample.py @@ -22,6 +22,7 @@ # 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) @@ -29,16 +30,14 @@ - - - - - #_session = session_factory.getSession() read = ReadODM2(session_factory) create = CreateODM2(session_factory) + + + # 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/services/readService.py b/odm2api/ODM2/services/readService.py index 5816127..06252ad 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, dstype=None): + """ + 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. + dstype (str, optional): Type of Dataset from + `controlled vocabulary name `_. + + + Returns: + list: List of DataSetsResults Objects associated with the given sampling feature + + 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(dstype='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() + + + q = self._session.query(DataSetsResults)\ + .join(Results)\ + .join(FeatureActions)\ + .filter(FeatureActions.SamplingFeatureID.in_(sf_list)) + + if dstype: + q = q.filter_by(DatasetTypeCV=dstype) + + try: + return q.all() + except Exception as e: + print('Error running Query: {}'.format(e)) + return None + # Data Quality def getDataQuality(self): """