def get_duplicates(db, param):
    param.dupe_filter = esfilter2sqlwhere(db, {"terms": {"dupe": param.bug_list}})
    param.dupe_of_filter = esfilter2sqlwhere(db, {"terms": {"dupe_of": param.bug_list}})

    return db.query("""
        SELECT dupe AS bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'dupe_of' AS field_name
            , CAST(dupe_of AS SIGNED) AS new_value
            , CAST(null AS SIGNED) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM duplicates d
        WHERE
            {{dupe_filter}}
        UNION
        SELECT dupe_of
            , null
            , null
            , 'dupe_by'
            , CAST(dupe AS SIGNED)
            , null
            , null
            , 2
        FROM duplicates d
        WHERE
            {{dupe_of_filter}}
        ORDER BY bug_id
    """, param)
def get_dependencies(db, param):
    param.blocks_filter = esfilter2sqlwhere(db, {"terms": {"blocked": param.bug_list}})
    param.dependson_filter = esfilter2sqlwhere(db, {"terms": {"dependson": param.bug_list}})

    return db.query("""
        SELECT blocked AS bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'dependson' AS field_name
            , CAST(dependson AS SIGNED) AS new_value
            , CAST(null AS SIGNED) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM dependencies d
        WHERE
           {{blocks_filter}}
        UNION
        SELECT dependson dependson
            , null
            , null
            , 'blocked'
            , CAST(blocked AS SIGNED)
            , null
            , null
            , 2
        FROM dependencies d
        WHERE
            {{dependson_filter}}
        ORDER BY bug_id
    """, param)
def get_new_activities(db, param):
    get_screened_whiteboard(db)

    if param.allow_private_bugs:
        param.screened_fields = SQL(SCREENED_FIELDDEFS)
    else:
        param.screened_fields = SQL([-1])

    #TODO: CF_LAST_RESOLVED IS IN PDT, FIX IT
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"a.bug_id": param.bug_list}})
    param.mixed_case_fields = SQL(MIXED_CASE)
    param.screened_whiteboard = esfilter2sqlwhere(db, {"terms": {"m.group_id": SCREENED_BUG_GROUP_IDS}})
    param.whiteboard_field = STATUS_WHITEBOARD_FIELD_ID

    output = db.query("""
        SELECT
            a.bug_id,
            UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
            lower(login_name) AS modified_by,
            replace(field.`name`, '.', '_') AS field_name,
            CAST(
                CASE
                WHEN a.fieldid IN {{screened_fields}} THEN '[screened]'
                WHEN m.bug_id IS NOT NULL AND a.fieldid={{whiteboard_field}} AND added IS NOT NULL AND trim(added)<>'' THEN '[screened]'
                WHEN a.fieldid IN {{mixed_case_fields}} THEN trim(added)
                WHEN trim(added)='' THEN NULL
                ELSE lower(trim(added))
                END
            AS CHAR CHARACTER SET utf8) AS new_value,
            CAST(
                CASE
                WHEN a.fieldid IN {{screened_fields}} THEN '[screened]'
                WHEN m.bug_id IS NOT NULL AND a.fieldid={{whiteboard_field}} AND removed IS NOT NULL AND trim(removed)<>'' THEN '[screened]'
                WHEN a.fieldid IN {{mixed_case_fields}} THEN trim(removed)
                WHEN trim(removed)='' THEN NULL
                ELSE lower(trim(removed))
                END
            AS CHAR CHARACTER SET utf8) AS old_value,
            attach_id,
            9 AS _merge_order
        FROM
            bugs_activity a
        JOIN
            profiles p ON a.who = p.userid
        JOIN
            fielddefs field ON a.fieldid = field.`id`
        LEFT JOIN
            bug_group_map m on m.bug_id=a.bug_id AND {{screened_whiteboard}}
        WHERE
            {{bug_filter}}
            # NEED TO QUERY ES TO GET bug_version_num OTHERWISE WE NEED ALL HISTORY
            # AND bug_when >= {{start_time_str}}
        ORDER BY
            a.bug_id,
            bug_when DESC,
            attach_id
    """, param)

    return output
Example #4
0
def get_comments(db, param):
    if not param.bug_list:
        return []

    if param.allow_private_bugs:
        param.comment_field = SQL("'[screened]' comment")
        param.bug_filter = esfilter2sqlwhere(
            db, {"and": [{
                "terms": {
                    "bug_id": param.bug_list
                }
            }]})
    else:
        param.comment_field = SQL("c.thetext comment")
        param.bug_filter = esfilter2sqlwhere(
            db, {
                "and": [{
                    "terms": {
                        "bug_id": param.bug_list
                    }
                }, {
                    "term": {
                        "isprivate": 0
                    }
                }]
            })

    try:
        comments = db.query(
            """
            SELECT
                c.comment_id,
                c.bug_id,
                p.login_name modified_by,
                UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
                {{comment_field}},
                c.isprivate
            FROM
                longdescs c
            LEFT JOIN
                profiles p ON c.who = p.userid
            LEFT JOIN
                longdescs_tags t ON t.comment_id=c.comment_id AND t.tag <> 'deleted'
            WHERE
                {{bug_filter}} AND
                bug_when >= {{start_time_str}}
            """, param)

        return comments
    except Exception, e:
        Log.error("can not get comment data", e)
def get_comments_by_id(db, comments, param):
    """
    GET SPECIFIC COMMENTS
    """
    if param.allow_private_bugs:
        return []

    param.comments_filter = esfilter2sqlwhere(db, {"and": [
        {"term": {"isprivate": 0}},
        {"terms": {"c.comment_id": comments}}
    ]})

    try:
        comments = db.query("""
            SELECT
                c.comment_id,
                c.bug_id,
                p.login_name modified_by,
                UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
                c.thetext comment,
                c.isprivate
            FROM
                longdescs c
            LEFT JOIN
                profiles p ON c.who = p.userid
            LEFT JOIN
                longdescs_tags t ON t.comment_id=c.comment_id AND t.tag <> 'deleted'
            WHERE
                {{comments_filter}}
            """, param)

        return comments
    except Exception, e:
        Log.error("can not get comment data", e)
def get_all_cc_changes(db, bug_list):
    CC_FIELD_ID = 37

    if not bug_list:
        return []

    return db.query("""
            SELECT
                bug_id,
                CAST({{max_time}} AS signed) AS modified_ts,
                CAST(null AS CHAR) AS new_value,
                lower(CAST(p.login_name AS CHAR CHARACTER SET utf8)) AS old_value
            FROM
                cc
            LEFT JOIN
                profiles p ON cc.who = p.userid
            WHERE
                {{bug_filter}}
        UNION ALL
            SELECT
                a.bug_id,
                UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
                lower(CAST(trim(added) AS CHAR CHARACTER SET utf8)) AS new_value,
                lower(CAST(trim(removed) AS CHAR CHARACTER SET utf8)) AS old_value
            FROM
                bugs_activity a
            WHERE
                a.fieldid = {{cc_field_id}} AND
                {{bug_filter}}
    """, {
        "max_time": MAX_TIME,
        "cc_field_id": CC_FIELD_ID,
        "bug_filter": esfilter2sqlwhere(db, {"terms": {"bug_id": bug_list}})
    })
def get_attachments(db, param):
    """
    GET ALL CURRENT ATTACHMENTS
    """
    if param.allow_private_bugs:
        param.attachments_filter = SQL("1=1")  #ALWAYS TRUE, ALLOWS ALL ATTACHMENTS
    else:
        param.attachments_filter = SQL("isprivate=0")

    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    output = db.query("""
        SELECT bug_id
            , UNIX_TIMESTAMP(CONVERT_TZ(a.creation_ts, 'US/Pacific','UTC'))*1000 AS modified_ts
            , lower(login_name) AS modified_by
            , UNIX_TIMESTAMP(CONVERT_TZ(a.creation_ts, 'US/Pacific','UTC'))*1000 AS created_ts
            , login_name AS created_by
            , ispatch AS 'attachments_ispatch'
            , isobsolete AS 'attachments_isobsolete'
            , isprivate AS 'attachments_isprivate'
            , mimetype AS 'attachments_mimetype'
            , attach_id
        FROM
            attachments a
            JOIN profiles p ON a.submitter_id = p.userid
        WHERE
            {{bug_filter}} AND
            {{attachments_filter}}
        ORDER BY
            bug_id,
            attach_id,
            a.creation_ts
    """, param)
    return flatten_attachments(output)
Example #8
0
def get_flags(db, param):
    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    return db.query(
        """
        SELECT bug_id
            , UNIX_TIMESTAMP(CONVERT_TZ(f.creation_date, 'US/Pacific','UTC'))*1000 AS modified_ts
            , ps.login_name AS modified_by
            , 'flagtypes_name' AS field_name
            , CONCAT(ft.`name`,status,IF(requestee_id IS NULL,'',CONCAT('(',pr.login_name,')'))) AS new_value
            , CAST(null AS CHAR) AS old_value
            , attach_id
            , 8 AS _merge_order
        FROM
            flags f
        JOIN `flagtypes` ft ON f.type_id = ft.id
        JOIN profiles ps ON f.setter_id = ps.userid
        LEFT JOIN profiles pr ON f.requestee_id = pr.userid
        WHERE
            {{bug_filter}}
        ORDER BY
            bug_id
    """, param)
Example #9
0
def diff(db, table, old_record, new_record):
    """
    UPDATE bugs_activity WITH THE CHANGES IN RECORDS
    """
    now = milli2string(db, CNV.datetime2milli(get_current_time(db)))
    changed = set(old_record.keys()) ^ set(new_record.keys())
    changed |= set([k for k, v in old_record.items() if v != new_record[k]])

    if table != u"bugs":
        prefix = table + u"."
    else:
        prefix = u""

    for c in changed:
        fieldid=db.query("SELECT id FROM fielddefs WHERE name={{field_name}}", {"field_name": prefix + c})[0].id

        if fieldid == None:
            Log.error("Expecting a valid field name")

        activity = Struct(
            bug_id=old_record.bug_id,
            who=1,
            bug_when=now,
            fieldid=fieldid,
            removed=old_record[c],
            added=new_record[c],
            attach_id=old_record.attach_id,
            comment_id=old_record.comment_id
        )
        db.insert("bugs_activity", activity)

    db.execute("UPDATE bugs SET delta_ts={{now}} WHERE {{where}}", {
        "now":now,
        "where":esfilter2sqlwhere(db, {"term":{"bug_id":old_record.bug_id}})
    })
Example #10
0
def get_screened_whiteboard(db):
    if not SCREENED_BUG_GROUP_IDS:
        groups = db.query(
            "SELECT id FROM groups WHERE {{where}}", {
                "where":
                esfilter2sqlwhere(
                    db, {"terms": {
                        "name": SCREENED_WHITEBOARD_BUG_GROUPS
                    }})
            })
        globals()["SCREENED_BUG_GROUP_IDS"] = Q.select(groups, "id")
def get_comments(db, param):
    if not param.bug_list:
        return []

    if param.allow_private_bugs:
        param.comment_field = SQL("'[screened]' comment")
        param.bug_filter = esfilter2sqlwhere(db, {"and": [
            {"terms": {"bug_id": param.bug_list}}
        ]})
    else:
        param.comment_field = SQL("c.thetext comment")
        param.bug_filter = esfilter2sqlwhere(db, {"and": [
            {"terms": {"bug_id": param.bug_list}},
            {"term": {"isprivate": 0}}
        ]})

    try:
        comments = db.query("""
            SELECT
                c.comment_id,
                c.bug_id,
                p.login_name modified_by,
                UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
                {{comment_field}},
                c.isprivate
            FROM
                longdescs c
            LEFT JOIN
                profiles p ON c.who = p.userid
            LEFT JOIN
                longdescs_tags t ON t.comment_id=c.comment_id AND t.tag <> 'deleted'
            WHERE
                {{bug_filter}} AND
                bug_when >= {{start_time_str}}
            """, param)

        return comments
    except Exception, e:
        Log.error("can not get comment data", e)
Example #12
0
def get_dependencies(db, param):
    param.blocks_filter = esfilter2sqlwhere(
        db, {"terms": {
            "blocked": param.bug_list
        }})
    param.dependson_filter = esfilter2sqlwhere(
        db, {"terms": {
            "dependson": param.bug_list
        }})

    return db.query(
        """
        SELECT blocked AS bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'dependson' AS field_name
            , CAST(dependson AS SIGNED) AS new_value
            , CAST(null AS SIGNED) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM dependencies d
        WHERE
           {{blocks_filter}}
        UNION
        SELECT dependson dependson
            , null
            , null
            , 'blocked'
            , CAST(blocked AS SIGNED)
            , null
            , null
            , 2
        FROM dependencies d
        WHERE
            {{dependson_filter}}
        ORDER BY bug_id
    """, param)
Example #13
0
def get_duplicates(db, param):
    param.dupe_filter = esfilter2sqlwhere(db,
                                          {"terms": {
                                              "dupe": param.bug_list
                                          }})
    param.dupe_of_filter = esfilter2sqlwhere(
        db, {"terms": {
            "dupe_of": param.bug_list
        }})

    return db.query(
        """
        SELECT dupe AS bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'dupe_of' AS field_name
            , CAST(dupe_of AS SIGNED) AS new_value
            , CAST(null AS SIGNED) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM duplicates d
        WHERE
            {{dupe_filter}}
        UNION
        SELECT dupe_of
            , null
            , null
            , 'dupe_by'
            , CAST(dupe AS SIGNED)
            , null
            , null
            , 2
        FROM duplicates d
        WHERE
            {{dupe_of_filter}}
        ORDER BY bug_id
    """, param)
def get_bug_groups(db, param):
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    return db.query("""
        SELECT bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'bug_group' AS field_name
            , lower(CAST(g.`name` AS CHAR)) AS new_value
            , CAST(null AS CHAR) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM bug_group_map bg
        JOIN groups g ON bg.group_id = g.id
        WHERE
            {{bug_filter}}
    """, param)
def get_bug_see_also(db, param):
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    return db.query("""
        SELECT bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'see_also' AS field_name
            , CAST(`value` AS CHAR) AS new_value
            , CAST(null AS CHAR) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM bug_see_also
        WHERE
            {{bug_filter}}
        ORDER BY bug_id
    """, param)
def get_keywords(db, param):
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    return db.query("""
        SELECT bug_id
            , NULL AS modified_ts
            , NULL AS modified_by
            , 'keywords' AS field_name
            , lower(kd.name) AS new_value
            , NULL AS old_value
            , NULL AS attach_id
            , 2 AS _merge_order
        FROM keywords k
        JOIN keyworddefs kd ON k.keywordid = kd.id
        WHERE
            {{bug_filter}}
        ORDER BY bug_id
    """, param)
def get_tracking_flags(db, param):
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    return db.query("""
        SELECT
            bug_id,
            CAST({{start_time}} AS signed) AS modified_ts,
            lower(f.name) AS field_name,
            lower(t.value) AS new_value,
            1 AS _merge_order
        FROM
            tracking_flags_bugs t
        JOIN
            tracking_flags f on f.id=t.tracking_flag_id
        WHERE
            {{bug_filter}}
        ORDER BY
            bug_id
    """, param)
def get_cc(db, param):
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    return db.query("""
        SELECT bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'cc' AS field_name
            , lower(CAST(p.login_name AS CHAR)) AS new_value
            , CAST(null AS CHAR) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM
            cc
        JOIN
            profiles p ON cc.who = p.userid
        WHERE
            {{bug_filter}}
    """, param)
Example #19
0
def get_comments_by_id(db, comments, param):
    """
    GET SPECIFIC COMMENTS
    """
    if param.allow_private_bugs:
        return []

    param.comments_filter = esfilter2sqlwhere(db, {
        "and": [{
            "term": {
                "isprivate": 0
            }
        }, {
            "terms": {
                "c.comment_id": comments
            }
        }]
    })

    try:
        comments = db.query(
            """
            SELECT
                c.comment_id,
                c.bug_id,
                p.login_name modified_by,
                UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
                c.thetext comment,
                c.isprivate
            FROM
                longdescs c
            LEFT JOIN
                profiles p ON c.who = p.userid
            LEFT JOIN
                longdescs_tags t ON t.comment_id=c.comment_id AND t.tag <> 'deleted'
            WHERE
                {{comments_filter}}
            """, param)

        return comments
    except Exception, e:
        Log.error("can not get comment data", e)
Example #20
0
def get_bug_groups(db, param):
    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    return db.query(
        """
        SELECT bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'bug_group' AS field_name
            , lower(CAST(g.`name` AS CHAR)) AS new_value
            , CAST(null AS CHAR) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM bug_group_map bg
        JOIN groups g ON bg.group_id = g.id
        WHERE
            {{bug_filter}}
    """, param)
Example #21
0
def get_bug_see_also(db, param):
    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    return db.query(
        """
        SELECT bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'see_also' AS field_name
            , CAST(`value` AS CHAR) AS new_value
            , CAST(null AS CHAR) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM bug_see_also
        WHERE
            {{bug_filter}}
        ORDER BY bug_id
    """, param)
def get_flags(db, param):
    param.bug_filter = esfilter2sqlwhere(db, {"terms": {"bug_id": param.bug_list}})

    return db.query("""
        SELECT bug_id
            , UNIX_TIMESTAMP(CONVERT_TZ(f.creation_date, 'US/Pacific','UTC'))*1000 AS modified_ts
            , ps.login_name AS modified_by
            , 'flagtypes_name' AS field_name
            , CONCAT(ft.`name`,status,IF(requestee_id IS NULL,'',CONCAT('(',pr.login_name,')'))) AS new_value
            , CAST(null AS CHAR) AS old_value
            , attach_id
            , 8 AS _merge_order
        FROM
            flags f
        JOIN `flagtypes` ft ON f.type_id = ft.id
        JOIN profiles ps ON f.setter_id = ps.userid
        LEFT JOIN profiles pr ON f.requestee_id = pr.userid
        WHERE
            {{bug_filter}}
        ORDER BY
            bug_id
    """, param)
Example #23
0
def diff(db, table, old_record, new_record):
    """
    UPDATE bugs_activity WITH THE CHANGES IN RECORDS
    """
    now = milli2string(db, CNV.datetime2milli(get_current_time(db)))
    changed = set(old_record.keys()) ^ set(new_record.keys())
    changed |= set([k for k, v in old_record.items() if v != new_record[k]])

    if table != u"bugs":
        prefix = table + u"."
    else:
        prefix = u""

    for c in changed:
        fieldid = db.query(
            "SELECT id FROM fielddefs WHERE name={{field_name}}",
            {"field_name": prefix + c})[0].id

        if fieldid == None:
            Log.error("Expecting a valid field name")

        activity = Struct(bug_id=old_record.bug_id,
                          who=1,
                          bug_when=now,
                          fieldid=fieldid,
                          removed=old_record[c],
                          added=new_record[c],
                          attach_id=old_record.attach_id,
                          comment_id=old_record.comment_id)
        db.insert("bugs_activity", activity)

    db.execute(
        "UPDATE bugs SET delta_ts={{now}} WHERE {{where}}", {
            "now": now,
            "where": esfilter2sqlwhere(db,
                                       {"term": {
                                           "bug_id": old_record.bug_id
                                       }})
        })
Example #24
0
def get_keywords(db, param):
    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    return db.query(
        """
        SELECT bug_id
            , NULL AS modified_ts
            , NULL AS modified_by
            , 'keywords' AS field_name
            , lower(kd.name) AS new_value
            , NULL AS old_value
            , NULL AS attach_id
            , 2 AS _merge_order
        FROM keywords k
        JOIN keyworddefs kd ON k.keywordid = kd.id
        WHERE
            {{bug_filter}}
        ORDER BY bug_id
    """, param)
Example #25
0
def get_attachments(db, param):
    """
    GET ALL CURRENT ATTACHMENTS
    """
    if param.allow_private_bugs:
        param.attachments_filter = SQL(
            "1=1")  #ALWAYS TRUE, ALLOWS ALL ATTACHMENTS
    else:
        param.attachments_filter = SQL("isprivate=0")

    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    output = db.query(
        """
        SELECT bug_id
            , UNIX_TIMESTAMP(CONVERT_TZ(a.creation_ts, 'US/Pacific','UTC'))*1000 AS modified_ts
            , lower(login_name) AS modified_by
            , UNIX_TIMESTAMP(CONVERT_TZ(a.creation_ts, 'US/Pacific','UTC'))*1000 AS created_ts
            , login_name AS created_by
            , ispatch AS 'attachments_ispatch'
            , isobsolete AS 'attachments_isobsolete'
            , isprivate AS 'attachments_isprivate'
            , mimetype AS 'attachments_mimetype'
            , attach_id
        FROM
            attachments a
            JOIN profiles p ON a.submitter_id = p.userid
        WHERE
            {{bug_filter}} AND
            {{attachments_filter}}
        ORDER BY
            bug_id,
            attach_id,
            a.creation_ts
    """, param)
    return flatten_attachments(output)
Example #26
0
def get_all_cc_changes(db, bug_list):
    CC_FIELD_ID = 37

    if not bug_list:
        return []

    return db.query(
        """
            SELECT
                bug_id,
                CAST({{max_time}} AS signed) AS modified_ts,
                CAST(null AS CHAR) AS new_value,
                lower(CAST(p.login_name AS CHAR CHARACTER SET utf8)) AS old_value
            FROM
                cc
            LEFT JOIN
                profiles p ON cc.who = p.userid
            WHERE
                {{bug_filter}}
        UNION ALL
            SELECT
                a.bug_id,
                UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
                lower(CAST(trim(added) AS CHAR CHARACTER SET utf8)) AS new_value,
                lower(CAST(trim(removed) AS CHAR CHARACTER SET utf8)) AS old_value
            FROM
                bugs_activity a
            WHERE
                a.fieldid = {{cc_field_id}} AND
                {{bug_filter}}
    """, {
            "max_time": MAX_TIME,
            "cc_field_id": CC_FIELD_ID,
            "bug_filter": esfilter2sqlwhere(db,
                                            {"terms": {
                                                "bug_id": bug_list
                                            }})
        })
Example #27
0
def get_cc(db, param):
    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    return db.query(
        """
        SELECT bug_id
            , CAST(null AS signed) AS modified_ts
            , CAST(null AS CHAR) AS modified_by
            , 'cc' AS field_name
            , lower(CAST(p.login_name AS CHAR)) AS new_value
            , CAST(null AS CHAR) AS old_value
            , CAST(null AS signed) AS attach_id
            , 2 AS _merge_order
        FROM
            cc
        JOIN
            profiles p ON cc.who = p.userid
        WHERE
            {{bug_filter}}
    """, param)
Example #28
0
def get_tracking_flags(db, param):
    param.bug_filter = esfilter2sqlwhere(db,
                                         {"terms": {
                                             "bug_id": param.bug_list
                                         }})

    return db.query(
        """
        SELECT
            bug_id,
            CAST({{start_time}} AS signed) AS modified_ts,
            lower(f.name) AS field_name,
            lower(t.value) AS new_value,
            1 AS _merge_order
        FROM
            tracking_flags_bugs t
        JOIN
            tracking_flags f on f.id=t.tracking_flag_id
        WHERE
            {{bug_filter}}
        ORDER BY
            bug_id
    """, param)
    def test_recent_private_stuff_does_not_show(self):
        self.settings.param.allow_private_bugs = False
        File(self.settings.param.first_run_time).delete()
        File(self.settings.param.last_run_time).delete()

        database.make_test_instance(self.settings.bugzilla)

        es = elasticsearch.make_test_instance("candidate",
                                              self.settings.real.bugs)
        es_c = elasticsearch.make_test_instance("candidate_comments",
                                                self.settings.real.comments)
        bz_etl.main(self.settings, es, es_c)

        #MARK SOME STUFF PRIVATE
        with DB(self.settings.bugzilla) as db:
            #BUGS
            private_bugs = set(Random.sample(self.settings.param.bugs, 3))
            Log.note("The private bugs are {{bugs}}", {"bugs": private_bugs})
            for b in private_bugs:
                database.add_bug_group(db, b, BUG_GROUP_FOR_TESTING)

            #COMMENTS
            comments = db.query("SELECT comment_id FROM longdescs").comment_id
            marked_private_comments = Random.sample(comments, 5)
            for c in marked_private_comments:
                database.mark_comment_private(db, c, isprivate=1)

            #INCLUDE COMMENTS OF THE PRIVATE BUGS
            implied_private_comments = db.query(
                """
                SELECT comment_id FROM longdescs WHERE {{where}}
            """, {
                    "where":
                    esfilter2sqlwhere(db, {"terms": {
                        "bug_id": private_bugs
                    }})
                }).comment_id
            private_comments = marked_private_comments + implied_private_comments
            Log.note("The private comments are {{comments}}",
                     {"comments": private_comments})

            #ATTACHMENTS
            attachments = db.query("SELECT bug_id, attach_id FROM attachments")
            private_attachments = Random.sample(attachments, 5)
            Log.note("The private attachments are {{attachments}}",
                     {"attachments": private_attachments})
            for a in private_attachments:
                database.mark_attachment_private(db, a.attach_id, isprivate=1)

        if not File(self.settings.param.last_run_time).exists:
            Log.error("last_run_time should exist")
        bz_etl.main(self.settings, es, es_c)

        Thread.sleep(2)  # MUST SLEEP WHILE ES DOES ITS INDEXING
        verify_no_private_bugs(es, private_bugs)
        verify_no_private_attachments(es, private_attachments)
        verify_no_private_comments(es_c, private_comments)

        #MARK SOME STUFF PUBLIC

        with DB(self.settings.bugzilla) as db:
            for b in private_bugs:
                database.remove_bug_group(db, b, BUG_GROUP_FOR_TESTING)

        bz_etl.main(self.settings, es, es_c)

        #VERIFY BUG IS PUBLIC, BUT PRIVATE ATTACHMENTS AND COMMENTS STILL NOT
        Thread.sleep(2)  # MUST SLEEP WHILE ES DOES ITS INDEXING
        verify_public_bugs(es, private_bugs)
        verify_no_private_attachments(es, private_attachments)
        verify_no_private_comments(es_c, marked_private_comments)
Example #30
0
def get_new_activities(db, param):
    get_screened_whiteboard(db)

    if param.allow_private_bugs:
        param.screened_fields = SQL(SCREENED_FIELDDEFS)
    else:
        param.screened_fields = SQL([-1])

    #TODO: CF_LAST_RESOLVED IS IN PDT, FIX IT
    param.bug_filter = esfilter2sqlwhere(
        db, {"terms": {
            "a.bug_id": param.bug_list
        }})
    param.mixed_case_fields = SQL(MIXED_CASE)
    param.screened_whiteboard = esfilter2sqlwhere(
        db, {"terms": {
            "m.group_id": SCREENED_BUG_GROUP_IDS
        }})
    param.whiteboard_field = STATUS_WHITEBOARD_FIELD_ID

    output = db.query(
        """
        SELECT
            a.bug_id,
            UNIX_TIMESTAMP(CONVERT_TZ(bug_when, 'US/Pacific','UTC'))*1000 AS modified_ts,
            lower(login_name) AS modified_by,
            replace(field.`name`, '.', '_') AS field_name,
            CAST(
                CASE
                WHEN a.fieldid IN {{screened_fields}} THEN '[screened]'
                WHEN m.bug_id IS NOT NULL AND a.fieldid={{whiteboard_field}} AND added IS NOT NULL AND trim(added)<>'' THEN '[screened]'
                WHEN a.fieldid IN {{mixed_case_fields}} THEN trim(added)
                WHEN trim(added)='' THEN NULL
                ELSE lower(trim(added))
                END
            AS CHAR CHARACTER SET utf8) AS new_value,
            CAST(
                CASE
                WHEN a.fieldid IN {{screened_fields}} THEN '[screened]'
                WHEN m.bug_id IS NOT NULL AND a.fieldid={{whiteboard_field}} AND removed IS NOT NULL AND trim(removed)<>'' THEN '[screened]'
                WHEN a.fieldid IN {{mixed_case_fields}} THEN trim(removed)
                WHEN trim(removed)='' THEN NULL
                ELSE lower(trim(removed))
                END
            AS CHAR CHARACTER SET utf8) AS old_value,
            attach_id,
            9 AS _merge_order
        FROM
            bugs_activity a
        JOIN
            profiles p ON a.who = p.userid
        JOIN
            fielddefs field ON a.fieldid = field.`id`
        LEFT JOIN
            bug_group_map m on m.bug_id=a.bug_id AND {{screened_whiteboard}}
        WHERE
            {{bug_filter}}
            # NEED TO QUERY ES TO GET bug_version_num OTHERWISE WE NEED ALL HISTORY
            # AND bug_when >= {{start_time_str}}
        ORDER BY
            a.bug_id,
            bug_when DESC,
            attach_id
    """, param)

    return output
def get_screened_whiteboard(db):
    if not SCREENED_BUG_GROUP_IDS:
        groups = db.query("SELECT id FROM groups WHERE {{where}}", {
            "where": esfilter2sqlwhere(db, {"terms": {"name": SCREENED_WHITEBOARD_BUG_GROUPS}})
        })
        globals()["SCREENED_BUG_GROUP_IDS"] = Q.select(groups, "id")
def get_bugs(db, param):
    try:
        get_bugs_table_columns(db, db.settings.schema)
        get_screened_whiteboard(db)

        #TODO: CF_LAST_RESOLVED IS IN PDT, FIX IT
        def lower(col):
            if col.column_type.startswith("varchar"):
                return "lower(" + db.quote_column(col.column_name) + ") " + db.quote_column(col.column_name)
            else:
                return db.quote_column(col.column_name)

        param.bugs_columns = Q.select(bugs_columns, "column_name")
        param.bugs_columns_SQL = SQL(",\n".join([lower(c) for c in bugs_columns]))
        param.bug_filter = esfilter2sqlwhere(db, {"terms": {"b.bug_id": param.bug_list}})
        param.screened_whiteboard = esfilter2sqlwhere(db, {"and": [
            {"exists": "m.bug_id"},
            {"terms": {"m.group_id": SCREENED_BUG_GROUP_IDS}}
        ]})

        if param.allow_private_bugs:
            param.sensitive_columns = SQL("""
                '[screened]' short_desc,
                '[screened]' bug_file_loc
            """)
        else:
            param.sensitive_columns = SQL("""
                short_desc,
                bug_file_loc
            """)

        bugs = db.query("""
            SELECT
                b.bug_id,
                UNIX_TIMESTAMP(CONVERT_TZ(b.creation_ts, 'US/Pacific','UTC'))*1000 AS modified_ts,
                lower(pr.login_name) AS modified_by,
                UNIX_TIMESTAMP(CONVERT_TZ(b.creation_ts, 'US/Pacific','UTC'))*1000 AS created_ts,
                lower(pr.login_name) AS created_by,
                lower(pa.login_name) AS assigned_to,
                lower(pq.login_name) AS qa_contact,
                lower(prod.`name`) AS product,
                lower(comp.`name`) AS component,
                CASE WHEN {{screened_whiteboard}} AND b.status_whiteboard IS NOT NULL AND trim(b.status_whiteboard)<>'' THEN '[screened]' ELSE trim(lower(b.status_whiteboard)) END status_whiteboard,
                {{sensitive_columns}},
                {{bugs_columns_SQL}}
            FROM
                bugs b
            LEFT JOIN
                profiles pr ON b.reporter = pr.userid
            LEFT JOIN
                profiles pa ON b.assigned_to = pa.userid
            LEFT JOIN
                profiles pq ON b.qa_contact = pq.userid
            LEFT JOIN
                products prod ON prod.id = product_id
            LEFT JOIN
                components comp ON comp.id = component_id
            LEFT JOIN
                bug_group_map m ON m.bug_id = b.bug_id
            WHERE
                {{bug_filter}}
            """, param)

        #bugs IS LIST OF BUGS WHICH MUST BE CONVERTED TO THE DELTA RECORDS FOR ALL FIELDS
        output = []
        for r in bugs:
            flatten_bugs_record(r, output)

        return output
    except Exception, e:
        Log.error("can not get basic bug data", e)
Example #33
0
    def test_recent_private_stuff_does_not_show(self):
        self.settings.param.allow_private_bugs = False
        File(self.settings.param.first_run_time).delete()
        File(self.settings.param.last_run_time).delete()

        database.make_test_instance(self.settings.bugzilla)

        es = elasticsearch.make_test_instance("candidate", self.settings.real.bugs)
        es_c = elasticsearch.make_test_instance("candidate_comments", self.settings.real.comments)
        bz_etl.main(self.settings, es, es_c)

        #MARK SOME STUFF PRIVATE
        with DB(self.settings.bugzilla) as db:
            #BUGS
            private_bugs = set(Random.sample(self.settings.param.bugs, 3))
            Log.note("The private bugs are {{bugs}}", {"bugs": private_bugs})
            for b in private_bugs:
                database.add_bug_group(db, b, BUG_GROUP_FOR_TESTING)

            #COMMENTS
            comments = db.query("SELECT comment_id FROM longdescs").comment_id
            marked_private_comments = Random.sample(comments, 5)
            for c in marked_private_comments:
                database.mark_comment_private(db, c, isprivate=1)

            #INCLUDE COMMENTS OF THE PRIVATE BUGS
            implied_private_comments = db.query("""
                SELECT comment_id FROM longdescs WHERE {{where}}
            """, {
                "where": esfilter2sqlwhere(db, {"terms":{"bug_id":private_bugs}})
            }).comment_id
            private_comments = marked_private_comments + implied_private_comments
            Log.note("The private comments are {{comments}}", {"comments": private_comments})

            #ATTACHMENTS
            attachments = db.query("SELECT bug_id, attach_id FROM attachments")
            private_attachments = Random.sample(attachments, 5)
            Log.note("The private attachments are {{attachments}}", {"attachments": private_attachments})
            for a in private_attachments:
                database.mark_attachment_private(db, a.attach_id, isprivate=1)

        if not File(self.settings.param.last_run_time).exists:
            Log.error("last_run_time should exist")
        bz_etl.main(self.settings, es, es_c)

        Thread.sleep(2)  # MUST SLEEP WHILE ES DOES ITS INDEXING
        verify_no_private_bugs(es, private_bugs)
        verify_no_private_attachments(es, private_attachments)
        verify_no_private_comments(es_c, private_comments)

        #MARK SOME STUFF PUBLIC

        with DB(self.settings.bugzilla) as db:
            for b in private_bugs:
                database.remove_bug_group(db, b, BUG_GROUP_FOR_TESTING)

        bz_etl.main(self.settings, es, es_c)

        #VERIFY BUG IS PUBLIC, BUT PRIVATE ATTACHMENTS AND COMMENTS STILL NOT
        Thread.sleep(2)  # MUST SLEEP WHILE ES DOES ITS INDEXING
        verify_public_bugs(es, private_bugs)
        verify_no_private_attachments(es, private_attachments)
        verify_no_private_comments(es_c, marked_private_comments)
Example #34
0
def get_bugs(db, param):
    try:
        get_bugs_table_columns(db, db.settings.schema)
        get_screened_whiteboard(db)

        #TODO: CF_LAST_RESOLVED IS IN PDT, FIX IT
        def lower(col):
            if col.column_type.startswith("varchar"):
                return "lower(" + db.quote_column(
                    col.column_name) + ") " + db.quote_column(col.column_name)
            else:
                return db.quote_column(col.column_name)

        param.bugs_columns = Q.select(bugs_columns, "column_name")
        param.bugs_columns_SQL = SQL(",\n".join(
            [lower(c) for c in bugs_columns]))
        param.bug_filter = esfilter2sqlwhere(
            db, {"terms": {
                "b.bug_id": param.bug_list
            }})
        param.screened_whiteboard = esfilter2sqlwhere(
            db, {
                "and": [{
                    "exists": "m.bug_id"
                }, {
                    "terms": {
                        "m.group_id": SCREENED_BUG_GROUP_IDS
                    }
                }]
            })

        if param.allow_private_bugs:
            param.sensitive_columns = SQL("""
                '[screened]' short_desc,
                '[screened]' bug_file_loc
            """)
        else:
            param.sensitive_columns = SQL("""
                short_desc,
                bug_file_loc
            """)

        bugs = db.query(
            """
            SELECT
                b.bug_id,
                UNIX_TIMESTAMP(CONVERT_TZ(b.creation_ts, 'US/Pacific','UTC'))*1000 AS modified_ts,
                lower(pr.login_name) AS modified_by,
                UNIX_TIMESTAMP(CONVERT_TZ(b.creation_ts, 'US/Pacific','UTC'))*1000 AS created_ts,
                lower(pr.login_name) AS created_by,
                lower(pa.login_name) AS assigned_to,
                lower(pq.login_name) AS qa_contact,
                lower(prod.`name`) AS product,
                lower(comp.`name`) AS component,
                CASE WHEN {{screened_whiteboard}} AND b.status_whiteboard IS NOT NULL AND trim(b.status_whiteboard)<>'' THEN '[screened]' ELSE trim(lower(b.status_whiteboard)) END status_whiteboard,
                {{sensitive_columns}},
                {{bugs_columns_SQL}}
            FROM
                bugs b
            LEFT JOIN
                profiles pr ON b.reporter = pr.userid
            LEFT JOIN
                profiles pa ON b.assigned_to = pa.userid
            LEFT JOIN
                profiles pq ON b.qa_contact = pq.userid
            LEFT JOIN
                products prod ON prod.id = product_id
            LEFT JOIN
                components comp ON comp.id = component_id
            LEFT JOIN
                bug_group_map m ON m.bug_id = b.bug_id
            WHERE
                {{bug_filter}}
            """, param)

        #bugs IS LIST OF BUGS WHICH MUST BE CONVERTED TO THE DELTA RECORDS FOR ALL FIELDS
        output = []
        for r in bugs:
            flatten_bugs_record(r, output)

        return output
    except Exception, e:
        Log.error("can not get basic bug data", e)