def get_scenario_view_states(self, states_filter=None, pagination=None): """Search for scenario view_states by filter. :param states_filter: instance of :class:`ScenarioStateFilter <autostorage.core.scenario.param_spec.ScenarioStateFilter>`. :param pagination: instance of `Pagination <autostorage.core.param_spec.Pagination>`. :returns: list with instances of :class:`ScenarioState <autostorage.core.scenario.scenario.ScenarioState>`. """ ids_query = Query(ScenarioViewStateRecord) subquery = Query([ ScenarioViewStateRecord.scenario_id, func.max(ScenarioViewStateRecord.changed).label('newest_change_date') ]) if states_filter and states_filter.date: subquery = subquery.filter(ScenarioViewStateRecord.changed <= states_filter.date) subquery = subquery.group_by(ScenarioViewStateRecord.scenario_id).subquery() ids_query = ids_query.join( subquery, and_( ScenarioViewStateRecord.scenario_id == subquery.columns.scenario_id, ScenarioViewStateRecord.changed == subquery.columns.newest_change_date ) ) if pagination: offset = pagination.page_index * pagination.items_per_page ids_query = ids_query.offset(offset).limit(pagination.items_per_page) with self.base.get_session() as session: bound_query = ids_query.with_session(session) states = [] for state_record in bound_query: scenario = ScenarioEntity(self.base, state_record.scenario_id) state = ScenarioViewStateEntity( scenario=scenario, name=state_record.name, description=state_record.description, date=state_record.changed ) states.append(state) return states
def get_structure(self, structure_filter=None): """Get structure of scenario by filter. :param structure_filter: instance of :class:`ScenarioStructureFilter <autostorage.core.scenario.param_spec.ScenarioStructureFilter>`. :returns: dictionary with tree_path as keys and node_ids as values. """ subquery = Query([ ScenarioStructureStateRecord.scenario_id, ScenarioStructureStateRecord.tree_path, func.max(ScenarioStructureStateRecord.changed).label('newest_change_date') ]).filter_by( scenario_id=self.__id ) if structure_filter: if structure_filter.date: subquery = subquery.filter( ScenarioStructureStateRecord.changed <= structure_filter.date) if structure_filter.tree_path: subquery = subquery.filter(ScenarioStructureStateRecord.tree_path.like( "{0}-%".format(structure_filter.tree_path) )) subquery = subquery.group_by( ScenarioStructureStateRecord.scenario_id, ScenarioStructureStateRecord.tree_path ).subquery() states_query = Query([ ScenarioStructureStateRecord ]).join( subquery, and_( ScenarioStructureStateRecord.scenario_id == subquery.columns.scenario_id, ScenarioStructureStateRecord.tree_path == subquery.columns.tree_path, ScenarioStructureStateRecord.changed == subquery.columns.newest_change_date ) ).filter( ScenarioStructureStateRecord.enabled == True # pylint: disable=singleton-comparison ) with self.base.get_session() as session: bound_query = states_query.with_session(session) return {record.tree_path: record.node_id for record in bound_query}