Module Gnumed.business.gmDataMining

GNUmed data mining middleware.

Functions

def delete_report_definition(name=None)
Expand source code
def delete_report_definition(name=None):
        queries = [{
                'sql': 'DELETE FROM cfg.report_query WHERE label = %(name)s',
                'args': {'name': name}
        }]
        gmPG2.run_rw_queries(queries=queries)
        return True
def report_exists(name=None)
Expand source code
def report_exists(name=None):
        rows = gmPG2.run_ro_queries(queries = [{
                'sql': 'SELECT EXISTS(SELECT 1 FROM cfg.report_query WHERE label = %(name)s)',
                'args': {'name': name}
        }])
        return rows[0][0]
def run_report_query(query=None, limit=None, pk_identity=None)
Expand source code
def run_report_query(query=None, limit=None, pk_identity=None):
        """Returns (status, hint, cols, rows)"""

        PATIENT_ID_TOKEN = '$<ID_ACTIVE_PATIENT>$'
        if limit is None:
                limit = ''
        else:
                limit = 'LIMIT %s' % limit

        # does user want to insert current patient ID ?
        if query.find(PATIENT_ID_TOKEN) == -1:
                wrapper_query = """
                        SELECT * FROM (
                                %%s
                        ) AS user_query
                        %s
                """ % limit
        else:
                # she does, but is it possible ?
                if pk_identity is None:
                        gmDispatcher.send('statustext', msg = _('Query needs active patient.'), beep = True)
                        cols = [_('Error')]
                        rows = [
                                [_('Active patient query')],
                                [''],
                                [_('This query requires a patient to be active in the client.')],
                                [''],
                                [_('Please activate the patient you are interested')],
                                [_('in and re-run the query.')]
                        ]
                        return (False, 'pk_identity', cols, rows)

                query = query.replace(PATIENT_ID_TOKEN, str(pk_identity))
                wrapper_query = """
                        SELECT %s AS pk_patient, * FROM (
                                %%s
                        ) AS user_query
                        %s
                """ % (pk_identity, limit)

        wrapped_query = wrapper_query % query
        _log.debug('running report query:')
        _log.debug(wrapped_query)

        try:
                # read-only for safety reasons
                rows = gmPG2.run_ro_queries(queries = [{'sql': wrapped_query}])
        except Exception:
                _log.exception('report query failed')
                gmDispatcher.send('statustext', msg = _('The query failed.'), beep = True)
                cols = [_('Error')]
                t, v = sys.exc_info()[:2]
                rows = [
                        [_('The query failed.')],
                        [''],
                        [str(t)]
                ]
                for line in str(v).split('\n'):
                        rows.append([line])
                rows.append([''])
                for line in query.split('\n'):
                        rows.append([line])
                return (False, 'query failed', cols, rows)

        if rows:
                cols = list(rows[0].keys())
        else:
                cols = [_('No results.')]

        return (True, None, cols, rows)

Returns (status, hint, cols, rows)

def save_report_definition(name=None, query=None, overwrite=False)
Expand source code
def save_report_definition(name=None, query=None, overwrite=False):
        if not overwrite:
                if report_exists(name=name):
                        return False

        args = {'name': name, 'query': query}
        queries = [
                {'sql': 'DELETE FROM cfg.report_query WHERE label = %(name)s', 'args': args},
                {'sql': 'INSERT INTO cfg.report_query (label, cmd) VALUES (%(name)s, %(query)s)', 'args': args}
        ]
        gmPG2.run_rw_queries(queries = queries)
        return True