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)
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
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
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
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
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
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))