示例#1
0
 def _sql_columns(self):
     try:
         return [
             self._adapter.get_table().c[field]
             for field in self.report_filter.fields
         ]
     except KeyError as e:
         raise ColumnNotFoundError(e.message)
示例#2
0
def _get_distinct_values(data_source_configuration, column_config, expansion_limit=DEFAULT_MAXIMUM_EXPANSION):
    """
    Return a tuple. The first item is a list of distinct values in the given
    ExpandedColumn no longer than expansion_limit. The second is a boolean which
    is True if the number of distinct values in the column is greater than the
    limit.

    :param data_source_configuration:
    :param column_config:
    :param expansion_limit:
    :return:
    """
    from corehq.apps.userreports.sql.adapter import get_indicator_table

    too_many_values = False

    session = Session()
    try:
        connection = session.connection()
        table = get_indicator_table(data_source_configuration)
        if not table.exists(bind=connection):
            return [], False

        if column_config.field not in table.c:
            raise ColumnNotFoundError(_(
                'The column "{}" does not exist in the report source! '
                'Please double check your report configuration.').format(column_config.field)
            )
        column = table.c[column_config.field]

        query = sqlalchemy.select([column], limit=expansion_limit + 1).distinct()
        result = connection.execute(query).fetchall()
        distinct_values = [x[0] for x in result]
        if len(distinct_values) > expansion_limit:
            distinct_values = distinct_values[:expansion_limit]
            too_many_values = True
    except:
        session.rollback()
        raise
    finally:
        session.close()

    return distinct_values, too_many_values
示例#3
0
    def _distribute_table(self):
        config = self.config.sql_settings.citus_config
        self.session_helper.Session.remove()
        if not self.session_helper.is_citus_db:
            # only do this if the database contains the citus extension
            return

        from custom.icds_reports.utils.migrations import (
            create_citus_distributed_table, create_citus_reference_table
        )
        with self.engine.begin() as connection:
            if config.distribution_type == 'hash':
                if config.distribution_column not in self.get_table().columns:
                    raise ColumnNotFoundError("Column '{}' not found.".format(config.distribution_column))
                create_citus_distributed_table(connection, self.get_table().name, config.distribution_column)
            elif config.distribution_type == 'reference':
                create_citus_reference_table(connection, self.get_table().name)
            else:
                raise ValueError("unknown distribution type: %r" % config.distribution_type)
            return True
示例#4
0
    def get_distinct_values(self, column, limit):
        too_many_values = False
        table = self.get_table()
        if not table.exists(bind=self.engine):
            return [], False

        if column not in table.c:
            raise ColumnNotFoundError(_(
                'The column "{}" does not exist in the report source! '
                'Please double check your report configuration.').format(column)
            )
        column = table.c[column]

        query = self.session_helper.Session.query(column).order_by(column).limit(limit + 1).distinct()
        result = query.all()
        distinct_values = [x[0] for x in result]
        if len(distinct_values) > limit:
            distinct_values = distinct_values[:limit]
            too_many_values = True

        return distinct_values, too_many_values
示例#5
0
    def _distribute_table(self):
        config = self.config.sql_settings.citus_config
        self.session_helper.Session.remove()
        if not self.session_helper.is_citus_db:
            # only do this if the database contains the citus extension
            return

        with self.engine.begin() as connection:
            if config.distribution_type == 'hash':
                if config.distribution_column not in self.get_table().columns:
                    raise ColumnNotFoundError("Column '{}' not found.".format(config.distribution_column))
                connection.execute("select create_distributed_table('{}', '{}')".format(
                    self.get_table().name, config.distribution_column
                ))
            elif config.distribution_type == 'reference':
                connection.execute("select create_reference_table('{}')".format(
                    self.get_table().name
                ))
            else:
                raise ValueError("unknown distribution type: %r" % config.distribution_type)
            return True
示例#6
0
def _get_distinct_values(data_source_configuration,
                         column_config,
                         expansion_limit=DEFAULT_MAXIMUM_EXPANSION):
    """
    Return a tuple. The first item is a list of distinct values in the given
    ExpandedColumn no longer than expansion_limit. The second is a boolean which
    is True if the number of distinct values in the column is greater than the
    limit.

    :param data_source_configuration:
    :param column_config:
    :param expansion_limit:
    :return:
    """
    from corehq.apps.userreports.sql import IndicatorSqlAdapter
    adapter = IndicatorSqlAdapter(data_source_configuration)
    too_many_values = False

    table = adapter.get_table()
    if not table.exists(bind=adapter.engine):
        return [], False

    if column_config.field not in table.c:
        raise ColumnNotFoundError(
            _('The column "{}" does not exist in the report source! '
              'Please double check your report configuration.').format(
                  column_config.field))
    column = table.c[column_config.field]

    query = adapter.session_helper.Session.query(column).limit(
        expansion_limit + 1).distinct()
    result = query.all()
    distinct_values = [x[0] for x in result]
    if len(distinct_values) > expansion_limit:
        distinct_values = distinct_values[:expansion_limit]
        too_many_values = True

    return distinct_values, too_many_values
示例#7
0
 def _sql_column(self):
     try:
         return self._adapter.get_table().c[self.report_filter.field]
     except KeyError as e:
         raise ColumnNotFoundError(six.text_type(e))