[aur-dev] [PATCH 2/3] Add "mergepkgid" argument to pkg_delete()

Lukas Fleischer archlinux at cryptocrack.de
Wed Aug 10 19:30:43 EDT 2011


On Wed, Aug 10, 2011 at 06:23:56PM -0500, Dan McGee wrote:
> On Wed, Aug 10, 2011 at 6:08 PM, Dan McGee <dpmcgee at gmail.com> wrote:
> > On Wed, Aug 10, 2011 at 5:48 PM, Lukas Fleischer
> > <archlinux at cryptocrack.de> wrote:
> >> On Wed, Aug 10, 2011 at 05:35:46PM -0500, Dan McGee wrote:
> >>> -- only update votes that wouldn't exist after modification
> >>> UPDATE PackageVotes
> >>> SET PackageID = ?merge
> >>> WHERE PackageID IN (?others)
> >>> AND UsersID NOT IN (
> >>>         -- this silly double SELECT works around shitty MySQL not
> >>> letting you reference the updated table in the update, as it forces
> >>> materialization of the subquery
> >>>       SELECT * FROM (
> >>>               SELECT UsersID
> >>>               FROM PackageVotes
> >>>               WHERE PackageID = ?merge
> >>>       ) temp
> >>> );
> >>
> >> That's what I had when I wrote the query for the very first time but
> >> that won't work if we merge more than one package at once. Read my
> >> next-to-last email in this thread for some more details.
> >
> > Oh damn it, I thought I set up my test data right- I'll see what I can tweak.
> 
> Since deletion/merging isn't exactly something that is done every
> second, I'm less worried about perfection here. 90% of merges are
> going to involve one package anyway, so when we have more than one ID,
> why don't we just run the query once per to-be-deleted package ID?
> Doing it in sequence will mean each sees the result of the previous
> and thus dupes won't be created on the 2nd and following merges.
> 
> for each ID:
>     UPDATE PackageVotes
>     SET PackageID = ?merge
>     WHERE PackageID = ?todelete
>     AND UsersID NOT IN (
> 	SELECT * FROM (
> 		SELECT UsersID
> 		FROM PackageVotes
> 		WHERE PackageID = ?merge
> 	) temp
>     );
> 
> This will be cross-database, not do anything too funky, and should
> still be plenty fast.

Well, yeah. I guess this is the best thing we can do here. Either this
or using a temporary table. I already spent ~1h trying to construct a
proper query that is simple, fast and actually works. Probably, it isn't
worth that much work. I can live with a solution that is somewhat less
than perfect as well.


More information about the aur-dev mailing list