[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1341684 - in /subversion/trunk: build/transform_sql.py subversion/libsvn_wc/wc-queries.sql subversion/tests/libsvn_wc/wc-queries-test.c

From: Greg Stein <gstein_at_gmail.com>
Date: Tue, 22 May 2012 22:56:14 -0400

On Tue, May 22, 2012 at 8:03 PM, <rhuijben_at_apache.org> wrote:
>...
> +++ subversion/trunk/build/transform_sql.py Wed May 23 00:03:06 2012
> @@ -110,10 +110,35 @@ class Processor(object):
> † † for line in input.split('\n'):
> † † † line = line.replace('"', '\\"')
>
> + † † †# IS_STRICT_DESCENDANT_OF()
> +
> + † † †# A common operation in the working copy is determining descendants of
> + † † †# a node. To allow Sqlite to use its indexes to provide the answer we
> + † † †# must provide simple less than and greater than operations.
> + † † †#
> + † † †# For relative paths that consist of one or more components like 'subdir'
> + † † †# we can accomplish this by comparing local_relpath with 'subdir/' and
> + † † †# 'subdir0' ('/'+1 = '0')
> + † † †#
> + † † †# For the working copy root this case is less simple and not strictly
> + † † †# valid utf-8/16 (but luckily Sqlite doesn't validate utf-8 nor utf-16).
> + † † †# The binary blob x'FFFF' is higher than any valid utf-8 and utf-16
> + † † †# sequence.
> + † † †#
> + † † †# So for the root we can compare with > '' and < x'FFFF'. (This skips the
> + † † †# root itself and selects all descendants)
> + † † †#
> + † † †### RH: I implemented this first with a user defined Sqlite function. But
> + † † †### when I wrote the documentation for it, I found out I could just
> + † † †### define it this way, without losing the option of just dropping the
> + † † †### query in a plain sqlite3.
> +
> † † † # '/'+1 == '0'
> - † † †line = re.sub(r'IS_STRICT_DESCENDANT_OF[(]([A-Za-z_.]+), ([?][0-9]+)[)]',
> - † † † † † † † † † †r"((\2) != '' AND ((\1) > (\2) || '/') AND ((\1) < (\2) || '0')) ",
> - † † † † † † † † † †line)
> + † † †line = re.sub(
> + † † † † † †r'IS_STRICT_DESCENDANT_OF[(]([A-Za-z_.]+), ([?][0-9]+)[)]',
> + † † † † † †r"(((\1) > (CASE (\2) WHEN '' THEN '' ELSE (\2) || '/' END))" +
> + † † † † † †r" AND ((\1) < CASE (\2) WHEN '' THEN X'FFFF' ELSE (\2) || '0' END))",
> + † † † † † †line)

Rather than using the CASE logic, couldn't you just do something like:

r"(((\2 = '') AND (\1 != '')) OR (... old condition ...))"

Seems simpler to me. Does it somehow invalidate the usage of the index?

Cheers,
-g
Received on 2012-05-23 04:56:48 CEST

This is an archived mail posted to the Subversion Dev mailing list.