根据an earlier question,我正在从布吉拉迁移到雷德明,在迁移过程中,我想利用雷德明提供的路线图。
在bugzilla中,错误总是记录在导致问题出现的软件版本上,尽管我现在已经在一个自定义字段中保留了这个信息(参见前面提到的问题),但我现在需要将路线图减少到更易于管理的程度,即:
更改所有错误的版本,使其接近符合路线图的简化等效版本(例如0.1234变为0.1,2.9876变为2.9)。这允许任何一个道路地图版本有多达999个子版本,这是我们倾向于与Bugzilla已经做的。
将所有打开的Bug更改为新的“计划外”版本。
删除所有当前未使用的版本号
我想这可以通过以下步骤实现:
获取所有可用的当前版本
对于检索到的每个版本,去掉除前三个字符以外的所有字符
检查该产品的版本号是否已经存在。
如果版本号是新的,则将其添加为新版本。
运行数据库中的每个问题,并且(a)如果问题已关闭,则将其分配给缩短的版本号;或者(b)如果问题仍处于打开状态,则将其分配给“非计划”版本。
…但是,唉,我缺乏SQL知识,这让我很失望。有人知道怎么解决这个问题吗?

最佳答案

此查询将获得所有现有版本的所有3个字符版本名称,按项目:

SELECT DISTINCT v.project_id, Left(v.name, 3) newversionname
    FROM issues i
        INNER JOIN versions v ON i.fixed_version_id=v.id

您需要一个不存在的所有3个字符版本名称的列表:
SELECT f.project_id, f.newversionname
    FROM (
        SELECT DISTINCT v.project_id, Left(v.name, 3) newversionname
            FROM issues i INNER JOIN versions v ON i.fixed_version_id=v.id
    ) f
    LEFT OUTER JOIN versions v2 ON f.project_id = v2.project_id and f.newversionname=v2.name
    WHERE v2.project_id is null

您需要为上述查询的每个结果插入新版本(我将把上述查询的修改作为INSERT查询留给您…)。
编辑:更新查询以添加版本详细信息
SELECT f.project_id, f.newversionname, v3.description, v3.created_on, v3.updated_on
    FROM (
        SELECT v.project_id, Left(v.name, 3) newversionname, MIN(v.id) minversionid
            FROM issues i INNER JOIN versions v ON i.fixed_version_id=v.id
            GROUP BY v.project_id
    ) f
    LEFT OUTER JOIN versions v2 ON f.project_id = v2.project_id and f.newversionname=v2.name
    INNER JOIN versions v3 ON f.minversionid=v3.id
    WHERE v2.project_id is null

这只需为每个新版本选择id最低的版本的详细信息。
注意:如果您的版本大于9(即11.234变为11.),则此操作将中断。
现在我们对于每一个与旧版本关联的问题,都存在一个新的3字符版本。以下查询显示了哪一个:
SELECT DISTINCT i.id, v.id oldversionid, v.name oldversionname, v2.id newversionid, v2.name newversionname
    FROM issues i
        INNER JOIN versions v ON i.fixed_version_id=v.id
        INNER JOIN versions v2 ON LEFT(v.name, 3) = v2.name and v.project_id = v2.project_id
    WHERE v.id <> v2.id

您可以使用此查询,并在进行健全性检查后将其调整为UPDATE查询。您仍然需要添加标准来区分打开的问题和关闭的问题(status_id)。
希望这有助于你的移民,玩得开心!

09-11 17:25