Skip to content

Query

query

QUERY

Source code in modules/query.py
class QUERY:
    def __init__(self):
        pass

    def authRead(self, query_id):
        auth = current.auth

        authorized = None
        if query_id == 0:
            authorized = auth.user is not None
        else:
            record = self.getPlainInfo(query_id)
            if record:
                authorized = record["is_shared"] or (
                    auth.user is not None and record["created_by"] == auth.user.id
                )
        msg = (
            f"No query with id: {query_id}"
            if authorized is None
            else f"You have no access to query with id {query_id}"
        )
        return (authorized, msg)

    def authWrite(self, query_id):
        auth = current.auth

        authorized = None
        if query_id == 0:
            authorized = auth.user is not None
        else:
            record = self.getPlainInfo(query_id)
            if record:
                authorized = (
                    auth.user is not None and record["created_by"] == auth.user.id
                )
        msg = (
            f"No item with id {query_id}"
            if authorized is None
            else f"You have no access to create/modify query with id {query_id}"
        )
        return (authorized, msg)

    def page(self, ViewSettings):
        Check = current.Check

        pageConfig = ViewSettings.writeConfig()

        query_id = Check.isId("goto", "q", "query", [])
        if query_id is not None:
            (authorized, msg) = self.authRead(query_id)
            if not authorized:
                query_id = 0
        return dict(
            pageConfig=pageConfig,
            query_id=query_id,
        )

    def body(self):
        """Retrieves a query record based on parameters.
        """
        Check = current.Check
        auth = current.auth

        vr = Check.field("material", "", "version")
        iidRep = Check.field("material", "", "iid")

        (iid, keywords) = iDecode("q", iidRep)
        (authorized, msg) = self.authRead(iid)
        msgs = []
        if authorized and iid == 0:
            msg = f"Not a valid query id: {iidRep}"
        if not authorized or iid == 0:
            msgs.append(("error", msg))
            return dict(
                writable=False,
                iidRep=iidRep,
                vr=vr,
                queryRecord=dict(),
                query=json.dumps(dict()),
                msgs=json.dumps(msgs),
                emdrosVersionsOld=set(EMDROS_VERSIONS[0:-1]),
            )
        queryRecord = self.getInfo(
            auth.user is not None,
            iid,
            vr,
            msgs,
            withIds=True,
            singleVersion=False,
            po=True,
        )
        if queryRecord is None:
            return dict(
                writable=True,
                iidRep=iidRep,
                vr=vr,
                queryRecord=dict(),
                query=json.dumps(dict()),
                msgs=json.dumps(msgs),
                emdrosVersionsOld=set(EMDROS_VERSIONS[0:-1]),
            )

        (authorized, msg) = self.authWrite(iid)

        return dict(
            writable=authorized,
            iidRep=iidRep,
            vr=vr,
            queryRecord=queryRecord,
            query=json.dumps(queryRecord),
            msgs=json.dumps(msgs),
            emdrosVersionsOld=set(EMDROS_VERSIONS[0:-1]),
        )

    def bodyJson(self):
        Check = current.Check

        vr = Check.field("material", "", "version")
        iidRep = Check.field("material", "", "iid")

        (iid, keywords) = iDecode("q", iidRep)
        (authorized, msg) = self.authRead(iid)
        if not authorized:
            result = dict(good=False, msg=[msg], data={})
        else:
            msgs = []
            queryRecord = self.getInfo(
                False, iid, vr, msgs, withIds=False, singleVersion=False, po=True
            )
            result = dict(good=queryRecord is not None, msg=msgs, data=queryRecord)
        return dict(data=json.dumps(result))

    def getItems(self, vr, chapter, onlyPub):
        Caching = current.Caching

        pubStatus = Caching.get(
            f"pubStatus_{vr}_",
            lambda: {},
            ALWAYS,
        )
        queriesFromChapter = Caching.get(
            f"queriesFromChapter_{vr}_",
            lambda: {},
            ALWAYS,
        )
        chapter_id = chapter.get("id", None)

        if chapter_id is None:
            return []

        slots = collections.defaultdict(lambda: set())
        r = []

        for (query_id, ranges) in queriesFromChapter.get(chapter_id, {}).items():
            if onlyPub and not pubStatus.get(query_id, {}).get(vr, False):
                continue
            for (first_m, last_m) in ranges:
                slots[query_id] |= set(range(first_m, last_m + 1))

        if len(slots):
            msgs = []
            queryrecords = self.getInfo(
                False,
                (str(q) for q in slots),
                vr,
                msgs,
                withIds=False,
                singleVersion=True,
                po=False,
            )
            for q in queryrecords:
                r.append({"item": q, "slots": json.dumps(sorted(list(slots[q["id"]])))})
        return r

    def read(self, vr, query_id):
        db = current.db

        query_exe_id = self.getExe(vr, query_id)
        if query_exe_id is None:
            return normRanges([])
        slotSets = db.executesql(
            dedent(
                f"""
                select first_m, last_m
                from monads
                where query_exe_id = {query_exe_id} order by first_m
                ;
                """
            )
        )
        return normRanges(slotSets)

    def getExe(self, vr, query_id):
        db = current.db

        recordsExe = db.executesql(
            dedent(
                f"""
                select id
                from query_exe
                where query_id = {query_id} and version = '{vr}'
                ;
                """
            )
        )
        if recordsExe is None or len(recordsExe) != 1:
            return None
        return recordsExe[0][0]

    def getPlainInfo(self, query_id):
        db = current.db

        records = db.executesql(
            dedent(
                f"""
                select * from query where id = {query_id}
                ;
                """
            ),
            as_dict=True,
        )
        return records[0] if records else {}

    def getBasicInfo(self, vr, query_id):
        db = current.db

        return db.executesql(
            dedent(
                f"""
                select
                    query.name as name,
                    query.description as description,
                    query.is_shared as is_shared,
                    query_exe.mql as mql,
                    query_exe.is_published as is_published
                from query inner join query_exe on
                    query.id = query_exe.query_id and query_exe.version = '{vr}'
                where query.id = {query_id}
                ;
                """
            ),
            as_dict=True,
        )

    def getTreeInfo(self, query_id):
        db = current.db

        return db.executesql(
            dedent(
                f"""
                select
                query.id as id,
                query.name as name,
                organization.id as org_id,
                organization.name as org_name,
                organization.website as org_website,
                project.id as project_id,
                project.name as project_name,
                project.website as project_website
                from query
                inner join organization on query.organization = organization.id
                inner join project on query.project = project.id
                where query.id = {query_id}
                ;
                """
            ),
            as_dict=True,
        )

    def getInfo(
        self,
        showPrivateFields,
        query_id,
        vr,
        msgs,
        singleVersion=False,
        withIds=True,
        po=False,
    ):
        """
        If called with singleVersion is True,
        we are grabbibg queries for the side list of a chapter.
        In this case:
        *   query_id is an iterable of query ids
        *   we only want the query exe records of these queries for a single version vr
        *   we only want query records that are:
            *   belong to a shared query
            *   up to date: executed after modified
        """
        db = current.db

        sqli = (
            dedent(
                """,
                query.created_by as user_id,
                project.id as project_id,
                organization.id as org_id
                """
            )
            if withIds and po
            else ""
        )

        sqlx = (
            dedent(
                """,
                query_exe.id as query_exe_id,
                query_exe.mql as mql,
                query_exe.version as version,
                query_exe.eversion as eversion,
                query_exe.resultmonads as resultmonads,
                query_exe.results as results,
                query_exe.executed_on as executed_on,
                query_exe.modified_on as xmodified_on,
                query_exe.is_published as is_published,
                query_exe.published_on as published_on
                """
            )
            if singleVersion
            else ""
        )

        sqlp = (
            dedent(
                """,
                project.name as project_name,
                project.website as project_website,
                organization.name as org_name,
                organization.website as org_website
                """
            )
            if po
            else ""
        )

        sqlb = (
            dedent(
                """,
                auth_user.email as uemail
            """
            )
            if showPrivateFields
            else dedent(
                """,
                'n.n@not.disclosed' as uemail
                """
            )
        )

        sqlm = dedent(
            f"""
            query.id as id,
            query.name as name,
            query.description as description,
            query.created_on as created_on,
            query.modified_on as modified_on,
            query.is_shared as is_shared,
            query.shared_on as shared_on,
            auth_user.first_name,
            auth_user.last_name
            {sqlb}{sqli}{sqlp}{sqlx}
            """
        )

        sqlr = (
            dedent(
                f"""
                inner join query_exe
                on
                    query_exe.query_id = query.id and
                    query_exe.version = '{vr}'
                """
            )
            if singleVersion
            else ""
        )

        sqlpr = (
            dedent(
                """
                inner join organization on query.organization = organization.id
                inner join project on query.project = project.id
                """
            )
            if po
            else ""
        )

        sqlc = (
            dedent(
                f"""
                where query.id in ({",".join(query_id)})
                and query.is_shared = 'T'
                and query_exe.executed_on >= query_exe.modified_on
            """
            )
            if singleVersion
            else dedent(
                f"""
                where query.id = {query_id}
                """
            )
        )

        sqlo = (
            dedent(
                """
                order by auth_user.last_name, query.name
                """
            )
            if singleVersion
            else ""
        )

        sql = dedent(
            f"""
            select{sqlm} from query
            inner join auth_user
            on query.created_by = auth_user.id
            {sqlr}{sqlpr}{sqlc}{sqlo}
            ;
            """
        )
        records = db.executesql(sql, as_dict=True)
        if records is None:
            msgs.append(("error", "Cannot lookup query(ies)"))
            return None
        if singleVersion:
            for record in records:
                self.getFields(vr, record, [], singleVersion=True)
            return records
        else:
            if len(records) == 0:
                msgs.append(("error", f"No query with id {query_id}"))
                return None
            record = records[0]
            record["description_md"] = markdown(
                record["description"] or "", output_format="xhtml5"
            )
            sql = dedent(
                f"""
                select
                    id as query_exe_id,
                    mql,
                    version,
                    eversion,
                    resultmonads,
                    results,
                    executed_on,
                    modified_on as xmodified_on,
                    is_published,
                    published_on
                from query_exe
                where query_id = {query_id}
                ;
                """
            )
            recordsExe = db.executesql(sql, as_dict=True)
            self.getFields(vr, record, recordsExe, singleVersion=False)
            return record

    def getFields(self, vr, record, recordsExe, singleVersion=False):
        VERSIONS = current.VERSIONS

        dateTimeStr(record)
        if not singleVersion:
            record["versions"] = dict(
                (
                    v,
                    dict(
                        query_exe_id=None,
                        mql=None,
                        status="warning",
                        is_published=None,
                        results=None,
                        resultmonads=None,
                        xmodified_on=None,
                        executed_on=None,
                        eversion=None,
                        published_on=None,
                    ),
                )
                for v in VERSIONS
            )
            for recordExe in recordsExe:
                versionExe = recordExe["version"]
                if versionExe not in VERSIONS:
                    continue
                dest = record["versions"][versionExe]
                dest.update(recordExe)
                dest["status"] = queryStatus(dest)
                dateTimeStr(dest)

__init__(self) special

Source code in modules/query.py
def __init__(self):
    pass

authRead(self, query_id)

Source code in modules/query.py
def authRead(self, query_id):
    auth = current.auth

    authorized = None
    if query_id == 0:
        authorized = auth.user is not None
    else:
        record = self.getPlainInfo(query_id)
        if record:
            authorized = record["is_shared"] or (
                auth.user is not None and record["created_by"] == auth.user.id
            )
    msg = (
        f"No query with id: {query_id}"
        if authorized is None
        else f"You have no access to query with id {query_id}"
    )
    return (authorized, msg)

authWrite(self, query_id)

Source code in modules/query.py
def authWrite(self, query_id):
    auth = current.auth

    authorized = None
    if query_id == 0:
        authorized = auth.user is not None
    else:
        record = self.getPlainInfo(query_id)
        if record:
            authorized = (
                auth.user is not None and record["created_by"] == auth.user.id
            )
    msg = (
        f"No item with id {query_id}"
        if authorized is None
        else f"You have no access to create/modify query with id {query_id}"
    )
    return (authorized, msg)

page(self, ViewSettings)

Source code in modules/query.py
def page(self, ViewSettings):
    Check = current.Check

    pageConfig = ViewSettings.writeConfig()

    query_id = Check.isId("goto", "q", "query", [])
    if query_id is not None:
        (authorized, msg) = self.authRead(query_id)
        if not authorized:
            query_id = 0
    return dict(
        pageConfig=pageConfig,
        query_id=query_id,
    )

body(self)

Retrieves a query record based on parameters.

Source code in modules/query.py
def body(self):
    """Retrieves a query record based on parameters.
    """
    Check = current.Check
    auth = current.auth

    vr = Check.field("material", "", "version")
    iidRep = Check.field("material", "", "iid")

    (iid, keywords) = iDecode("q", iidRep)
    (authorized, msg) = self.authRead(iid)
    msgs = []
    if authorized and iid == 0:
        msg = f"Not a valid query id: {iidRep}"
    if not authorized or iid == 0:
        msgs.append(("error", msg))
        return dict(
            writable=False,
            iidRep=iidRep,
            vr=vr,
            queryRecord=dict(),
            query=json.dumps(dict()),
            msgs=json.dumps(msgs),
            emdrosVersionsOld=set(EMDROS_VERSIONS[0:-1]),
        )
    queryRecord = self.getInfo(
        auth.user is not None,
        iid,
        vr,
        msgs,
        withIds=True,
        singleVersion=False,
        po=True,
    )
    if queryRecord is None:
        return dict(
            writable=True,
            iidRep=iidRep,
            vr=vr,
            queryRecord=dict(),
            query=json.dumps(dict()),
            msgs=json.dumps(msgs),
            emdrosVersionsOld=set(EMDROS_VERSIONS[0:-1]),
        )

    (authorized, msg) = self.authWrite(iid)

    return dict(
        writable=authorized,
        iidRep=iidRep,
        vr=vr,
        queryRecord=queryRecord,
        query=json.dumps(queryRecord),
        msgs=json.dumps(msgs),
        emdrosVersionsOld=set(EMDROS_VERSIONS[0:-1]),
    )

bodyJson(self)

Source code in modules/query.py
def bodyJson(self):
    Check = current.Check

    vr = Check.field("material", "", "version")
    iidRep = Check.field("material", "", "iid")

    (iid, keywords) = iDecode("q", iidRep)
    (authorized, msg) = self.authRead(iid)
    if not authorized:
        result = dict(good=False, msg=[msg], data={})
    else:
        msgs = []
        queryRecord = self.getInfo(
            False, iid, vr, msgs, withIds=False, singleVersion=False, po=True
        )
        result = dict(good=queryRecord is not None, msg=msgs, data=queryRecord)
    return dict(data=json.dumps(result))

getItems(self, vr, chapter, onlyPub)

Source code in modules/query.py
def getItems(self, vr, chapter, onlyPub):
    Caching = current.Caching

    pubStatus = Caching.get(
        f"pubStatus_{vr}_",
        lambda: {},
        ALWAYS,
    )
    queriesFromChapter = Caching.get(
        f"queriesFromChapter_{vr}_",
        lambda: {},
        ALWAYS,
    )
    chapter_id = chapter.get("id", None)

    if chapter_id is None:
        return []

    slots = collections.defaultdict(lambda: set())
    r = []

    for (query_id, ranges) in queriesFromChapter.get(chapter_id, {}).items():
        if onlyPub and not pubStatus.get(query_id, {}).get(vr, False):
            continue
        for (first_m, last_m) in ranges:
            slots[query_id] |= set(range(first_m, last_m + 1))

    if len(slots):
        msgs = []
        queryrecords = self.getInfo(
            False,
            (str(q) for q in slots),
            vr,
            msgs,
            withIds=False,
            singleVersion=True,
            po=False,
        )
        for q in queryrecords:
            r.append({"item": q, "slots": json.dumps(sorted(list(slots[q["id"]])))})
    return r

read(self, vr, query_id)

Source code in modules/query.py
def read(self, vr, query_id):
    db = current.db

    query_exe_id = self.getExe(vr, query_id)
    if query_exe_id is None:
        return normRanges([])
    slotSets = db.executesql(
        dedent(
            f"""
            select first_m, last_m
            from monads
            where query_exe_id = {query_exe_id} order by first_m
            ;
            """
        )
    )
    return normRanges(slotSets)

getExe(self, vr, query_id)

Source code in modules/query.py
def getExe(self, vr, query_id):
    db = current.db

    recordsExe = db.executesql(
        dedent(
            f"""
            select id
            from query_exe
            where query_id = {query_id} and version = '{vr}'
            ;
            """
        )
    )
    if recordsExe is None or len(recordsExe) != 1:
        return None
    return recordsExe[0][0]

getPlainInfo(self, query_id)

Source code in modules/query.py
def getPlainInfo(self, query_id):
    db = current.db

    records = db.executesql(
        dedent(
            f"""
            select * from query where id = {query_id}
            ;
            """
        ),
        as_dict=True,
    )
    return records[0] if records else {}

getBasicInfo(self, vr, query_id)

Source code in modules/query.py
def getBasicInfo(self, vr, query_id):
    db = current.db

    return db.executesql(
        dedent(
            f"""
            select
                query.name as name,
                query.description as description,
                query.is_shared as is_shared,
                query_exe.mql as mql,
                query_exe.is_published as is_published
            from query inner join query_exe on
                query.id = query_exe.query_id and query_exe.version = '{vr}'
            where query.id = {query_id}
            ;
            """
        ),
        as_dict=True,
    )

getTreeInfo(self, query_id)

Source code in modules/query.py
def getTreeInfo(self, query_id):
    db = current.db

    return db.executesql(
        dedent(
            f"""
            select
            query.id as id,
            query.name as name,
            organization.id as org_id,
            organization.name as org_name,
            organization.website as org_website,
            project.id as project_id,
            project.name as project_name,
            project.website as project_website
            from query
            inner join organization on query.organization = organization.id
            inner join project on query.project = project.id
            where query.id = {query_id}
            ;
            """
        ),
        as_dict=True,
    )

getInfo(self, showPrivateFields, query_id, vr, msgs, singleVersion=False, withIds=True, po=False)

If called with singleVersion is True,

we are grabbibg queries for the side list of a chapter. In this case: * query_id is an iterable of query ids * we only want the query exe records of these queries for a single version vr * we only want query records that are: * belong to a shared query * up to date: executed after modified

Source code in modules/query.py
def getInfo(
    self,
    showPrivateFields,
    query_id,
    vr,
    msgs,
    singleVersion=False,
    withIds=True,
    po=False,
):
    """
    If called with singleVersion is True,
    we are grabbibg queries for the side list of a chapter.
    In this case:
    *   query_id is an iterable of query ids
    *   we only want the query exe records of these queries for a single version vr
    *   we only want query records that are:
        *   belong to a shared query
        *   up to date: executed after modified
    """
    db = current.db

    sqli = (
        dedent(
            """,
            query.created_by as user_id,
            project.id as project_id,
            organization.id as org_id
            """
        )
        if withIds and po
        else ""
    )

    sqlx = (
        dedent(
            """,
            query_exe.id as query_exe_id,
            query_exe.mql as mql,
            query_exe.version as version,
            query_exe.eversion as eversion,
            query_exe.resultmonads as resultmonads,
            query_exe.results as results,
            query_exe.executed_on as executed_on,
            query_exe.modified_on as xmodified_on,
            query_exe.is_published as is_published,
            query_exe.published_on as published_on
            """
        )
        if singleVersion
        else ""
    )

    sqlp = (
        dedent(
            """,
            project.name as project_name,
            project.website as project_website,
            organization.name as org_name,
            organization.website as org_website
            """
        )
        if po
        else ""
    )

    sqlb = (
        dedent(
            """,
            auth_user.email as uemail
        """
        )
        if showPrivateFields
        else dedent(
            """,
            'n.n@not.disclosed' as uemail
            """
        )
    )

    sqlm = dedent(
        f"""
        query.id as id,
        query.name as name,
        query.description as description,
        query.created_on as created_on,
        query.modified_on as modified_on,
        query.is_shared as is_shared,
        query.shared_on as shared_on,
        auth_user.first_name,
        auth_user.last_name
        {sqlb}{sqli}{sqlp}{sqlx}
        """
    )

    sqlr = (
        dedent(
            f"""
            inner join query_exe
            on
                query_exe.query_id = query.id and
                query_exe.version = '{vr}'
            """
        )
        if singleVersion
        else ""
    )

    sqlpr = (
        dedent(
            """
            inner join organization on query.organization = organization.id
            inner join project on query.project = project.id
            """
        )
        if po
        else ""
    )

    sqlc = (
        dedent(
            f"""
            where query.id in ({",".join(query_id)})
            and query.is_shared = 'T'
            and query_exe.executed_on >= query_exe.modified_on
        """
        )
        if singleVersion
        else dedent(
            f"""
            where query.id = {query_id}
            """
        )
    )

    sqlo = (
        dedent(
            """
            order by auth_user.last_name, query.name
            """
        )
        if singleVersion
        else ""
    )

    sql = dedent(
        f"""
        select{sqlm} from query
        inner join auth_user
        on query.created_by = auth_user.id
        {sqlr}{sqlpr}{sqlc}{sqlo}
        ;
        """
    )
    records = db.executesql(sql, as_dict=True)
    if records is None:
        msgs.append(("error", "Cannot lookup query(ies)"))
        return None
    if singleVersion:
        for record in records:
            self.getFields(vr, record, [], singleVersion=True)
        return records
    else:
        if len(records) == 0:
            msgs.append(("error", f"No query with id {query_id}"))
            return None
        record = records[0]
        record["description_md"] = markdown(
            record["description"] or "", output_format="xhtml5"
        )
        sql = dedent(
            f"""
            select
                id as query_exe_id,
                mql,
                version,
                eversion,
                resultmonads,
                results,
                executed_on,
                modified_on as xmodified_on,
                is_published,
                published_on
            from query_exe
            where query_id = {query_id}
            ;
            """
        )
        recordsExe = db.executesql(sql, as_dict=True)
        self.getFields(vr, record, recordsExe, singleVersion=False)
        return record

getFields(self, vr, record, recordsExe, singleVersion=False)

Source code in modules/query.py
def getFields(self, vr, record, recordsExe, singleVersion=False):
    VERSIONS = current.VERSIONS

    dateTimeStr(record)
    if not singleVersion:
        record["versions"] = dict(
            (
                v,
                dict(
                    query_exe_id=None,
                    mql=None,
                    status="warning",
                    is_published=None,
                    results=None,
                    resultmonads=None,
                    xmodified_on=None,
                    executed_on=None,
                    eversion=None,
                    published_on=None,
                ),
            )
            for v in VERSIONS
        )
        for recordExe in recordsExe:
            versionExe = recordExe["version"]
            if versionExe not in VERSIONS:
                continue
            dest = record["versions"][versionExe]
            dest.update(recordExe)
            dest["status"] = queryStatus(dest)
            dateTimeStr(dest)

dateTimeStr(fields)

Source code in modules/query.py
def dateTimeStr(fields):
    for f in (
        "created_on",
        "modified_on",
        "shared_on",
        "xmodified_on",
        "executed_on",
        "published_on",
    ):
        if f in fields:
            ov = fields[f]
            fields[f] = str(ov) if ov else NULLDT
    for f in ("is_shared", "is_published"):
        if f in fields:
            fields[f] = fields[f] == "T"

queryStatus(queryExeRecord)

Source code in modules/query.py
def queryStatus(queryExeRecord):
    if not queryExeRecord["executed_on"]:
        return "warning"
    if queryExeRecord["executed_on"] < queryExeRecord["xmodified_on"]:
        return "error"
    return "good"