def create_query_execution(query,
                           engine_id,
                           data_cell_id=None,
                           originator=None):
    with DBSession() as session:
        verify_query_engine_permission(engine_id, session=session)

        uid = current_user.id
        query_execution = logic.create_query_execution(query=query,
                                                       engine_id=engine_id,
                                                       uid=uid,
                                                       session=session)

        data_doc = None
        if data_cell_id:
            datadoc_logic.append_query_executions_to_data_cell(
                data_cell_id, [query_execution.id], session=session)
            data_cell = datadoc_logic.get_data_cell_by_id(data_cell_id,
                                                          session=session)
            data_doc = data_cell.doc

        try:
            run_query_task.apply_async(args=[
                query_execution.id,
            ])
            query_execution_dict = query_execution.to_dict()

            if data_doc:
                socketio.emit(
                    "data_doc_query_execution",
                    (
                        originator,
                        query_execution_dict,
                        data_cell_id,
                    ),
                    namespace="/datadoc",
                    room=data_doc.id,
                    broadcast=True,
                )

            return query_execution_dict
        except Exception as e:
            # We might encounter ConnectionError caused by
            # Redis connection failing
            logic.create_query_execution_error(
                query_execution.id,
                error_type=None,
                error_message_extracted="Encountered Error connecting to Redis",
                error_message=str(e),
                commit=False,
                session=session,
            )
            query_execution.status = QueryExecutionStatus.ERROR
            session.commit()
            raise e
Exemple #2
0
def _start_query_execution_task(
    self,
    previous_query_status,
    cell_id,
    query_execution_params,
):
    if previous_query_status != QueryExecutionStatus.DONE.value:
        raise Exception(GENERIC_QUERY_FAILURE_MSG)

    with DBSession() as session:
        query_execution_id = qe_logic.create_query_execution(
            **query_execution_params, session=session).id
        datadoc_logic.append_query_executions_to_data_cell(
            cell_id, [query_execution_id], session=session)
        return query_execution_id