Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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}