~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to database/schema/patch-2208-63-1.sql

  • Committer: Stuart Bishop
  • Date: 2011-06-09 12:55:22 UTC
  • mto: This revision was merged to the branch mainline in revision 13211.
  • Revision ID: stuart.bishop@canonical.com-20110609125522-vrauv071isnurl83
Optimize real BugSummary _inc and _dec functions too

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 
4
4
SET client_min_messages=ERROR;
5
5
 
 
6
CREATE OR REPLACE FUNCTION bug_summary_inc(d bugsummary) RETURNS VOID
 
7
LANGUAGE plpgsql AS
 
8
$$
 
9
BEGIN
 
10
    -- Shameless adaption from postgresql manual
 
11
    LOOP
 
12
        -- first try to update the row
 
13
        UPDATE BugSummary SET count = count + 1
 
14
        WHERE
 
15
            ((d.product IS NULL AND product IS NULL)
 
16
                OR product = d.product)
 
17
            AND ((d.productseries IS NULL AND productseries IS NULL)
 
18
                OR productseries = d.productseries)
 
19
            AND ((d.distribution IS NULL AND distribution IS NULL)
 
20
                OR distribution = d.distribution)
 
21
            AND ((d.distroseries IS NULL AND distroseries IS NULL)
 
22
                OR distroseries = d.distroseries)
 
23
            AND ((d.sourcepackagename IS NULL AND sourcepackagename IS NULL)
 
24
                OR sourcepackagename = d.sourcepackagename)
 
25
            AND ((d.viewed_by IS NULL AND viewed_by IS NULL)
 
26
                OR viewed_by = d.viewed_by)
 
27
            AND ((d.tag IS NULL AND tag IS NULL)
 
28
                OR tag = d.tag)
 
29
            AND ((d.status IS NULL AND status IS NULL)
 
30
                OR status = d.status)
 
31
            AND ((d.milestone IS NULL AND milestone IS NULL)
 
32
                OR milestone = d.milestone);
 
33
        IF found THEN
 
34
            RETURN;
 
35
        END IF;
 
36
        -- not there, so try to insert the key
 
37
        -- if someone else inserts the same key concurrently,
 
38
        -- we could get a unique-key failure
 
39
        BEGIN
 
40
            INSERT INTO BugSummary(
 
41
                count, product, productseries, distribution,
 
42
                distroseries, sourcepackagename, viewed_by, tag,
 
43
                status, milestone)
 
44
            VALUES (
 
45
                1, d.product, d.productseries, d.distribution,
 
46
                d.distroseries, d.sourcepackagename, d.viewed_by, d.tag,
 
47
                d.status, d.milestone);
 
48
            RETURN;
 
49
        EXCEPTION WHEN unique_violation THEN
 
50
            -- do nothing, and loop to try the UPDATE again
 
51
        END;
 
52
    END LOOP;
 
53
END;
 
54
$$;
 
55
 
 
56
COMMENT ON FUNCTION bug_summary_inc(bugsummary) IS
 
57
'UPSERT into bugsummary incrementing one row';
 
58
 
 
59
CREATE OR REPLACE FUNCTION bug_summary_dec(bugsummary) RETURNS VOID
 
60
LANGUAGE SQL AS
 
61
$$
 
62
    -- We own the row reference, so in the absence of bugs this cannot
 
63
    -- fail - just decrement the row.
 
64
    UPDATE BugSummary SET count = count - 1
 
65
    WHERE
 
66
        (($1.product IS NULL AND product IS NULL)
 
67
            OR product = $1.product)
 
68
        AND (($1.productseries IS NULL AND productseries IS NULL)
 
69
            OR productseries = $1.productseries)
 
70
        AND (($1.distribution IS NULL AND distribution IS NULL)
 
71
            OR distribution = $1.distribution)
 
72
        AND (($1.distroseries IS NULL AND distroseries IS NULL)
 
73
            OR distroseries = $1.distroseries)
 
74
        AND (($1.sourcepackagename IS NULL AND sourcepackagename IS NULL)
 
75
            OR sourcepackagename = $1.sourcepackagename)
 
76
        AND (($1.viewed_by IS NULL AND viewed_by IS NULL)
 
77
            OR viewed_by = $1.viewed_by)
 
78
        AND (($1.tag IS NULL AND tag IS NULL)
 
79
            OR tag = $1.tag)
 
80
        AND (($1.status IS NULL AND status IS NULL)
 
81
            OR status = $1.status)
 
82
        AND (($1.milestone IS NULL AND milestone IS NULL)
 
83
            OR milestone = $1.milestone);
 
84
    -- gc the row (perhaps should be garbo but easy enough to add here:
 
85
    DELETE FROM bugsummary
 
86
    WHERE
 
87
        count=0
 
88
        AND (($1.product IS NULL AND product IS NULL)
 
89
            OR product = $1.product)
 
90
        AND (($1.productseries IS NULL AND productseries IS NULL)
 
91
            OR productseries = $1.productseries)
 
92
        AND (($1.distribution IS NULL AND distribution IS NULL)
 
93
            OR distribution = $1.distribution)
 
94
        AND (($1.distroseries IS NULL AND distroseries IS NULL)
 
95
            OR distroseries = $1.distroseries)
 
96
        AND (($1.sourcepackagename IS NULL AND sourcepackagename IS NULL)
 
97
            OR sourcepackagename = $1.sourcepackagename)
 
98
        AND (($1.viewed_by IS NULL AND viewed_by IS NULL)
 
99
            OR viewed_by = $1.viewed_by)
 
100
        AND (($1.tag IS NULL AND tag IS NULL)
 
101
            OR tag = $1.tag)
 
102
        AND (($1.status IS NULL AND status IS NULL)
 
103
            OR status = $1.status)
 
104
        AND (($1.milestone IS NULL AND milestone IS NULL)
 
105
            OR milestone = $1.milestone);
 
106
    -- If its not found then someone else also dec'd and won concurrently.
 
107
$$;
 
108
 
 
109
 
6
110
-- bad comment fixup
7
111
COMMENT ON FUNCTION bug_summary_dec(bugsummary) IS
8
112
'UPSERT into bugsummary incrementing one row';