[Jifty-commit] r6526 - in Jifty-DBI/branches/tisql: lib/Jifty/DBI t/tisql/internals
Jifty commits
jifty-commit at lists.jifty.org
Fri Feb 27 17:26:33 EST 2009
Author: ruz
Date: Fri Feb 27 17:26:27 2009
New Revision: 6526
Modified:
Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm
Jifty-DBI/branches/tisql/t/tisql/internals/parse_column.t
Jifty-DBI/branches/tisql/t/tisql/searches_attrs.t
Jifty-DBI/branches/tisql/t/tisql/searches_links.t
Log:
* switch to named placeholders
Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm (original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm Fri Feb 27 17:26:27 2009
@@ -16,14 +16,15 @@
my $re_delim = qr{$RE{delimited}{-delim=>qq{\'\"}}};
my $re_field = qr{[a-zA-Z][a-zA-Z0-9_]*};
my $re_alias_name = $re_field;
-my $re_ph = qr{%[1-9][0-9]*};
+my $re_ph_name = qr{[a-z][a-z_]*};
+my $re_ph = qr{%$re_ph_name};
my $re_binding = qr{\?};
my $re_value = qr{$re_delim|[0-9.]+};
my $re_value_ph = qr{$re_value|$re_ph};
my $re_value_ph_b = qr{$re_value_ph|$re_binding};
my $re_cs_values = qr{$re_value(?:\s*,\s*$re_value)*};
-my $re_ph_access = qr{{\s*(?:$re_cs_values|$re_ph|$re_binding)?\s*}};
+my $re_ph_access = qr{{\s*$re_ph_name\s*=>\s*(?:$re_cs_values|$re_ph|$re_binding)\s*}};
my $re_column = qr{$re_alias_name?(?:\.$re_field$re_ph_access*)+};
my $re_alias = qr{$re_column\s+AS\s+$re_alias_name}i;
@@ -339,11 +340,10 @@
$limit{'quote_value'} = 0;
$limit{'value'} = $cond->{'rhs'}{'table'}{'sql_alias'} .'.'. $cond->{'rhs'}{'column'};
}
- elsif ( $cond->{'rhs'} =~ /^%(\d+)$/ ) {
- return unless exists $joint->{'placeholders'}[ $1 - 1 ];
-
- my $phs = $joint->{'placeholders'}[ $1 - 1 ];
+ elsif ( $cond->{'rhs'} =~ /^%($re_ph_name)$/o ) {
+ my $phs = $joint->{'placeholders'}{ $1 };
return unless defined $phs;
+
if ( ref $phs ) {
$limit{'value'} = [ map $parser->dq($_), @{ $phs } ];
$limit{'value'} = $limit{'value'}->[0] if @{ $limit{'value'} } == 1;
@@ -488,9 +488,8 @@
foreach my $side (qw(lhs rhs)) {
unless ( ref $cond->{ $side } eq 'HASH' ) {
- if ( $placeholders && $cond->{ $side } =~ /^%([0-9])+$/ ) {
- if ( exists $placeholders->[ $1 - 1 ] && defined $placeholders->[ $1 - 1 ] ) {
- my $phs = $placeholders->[ $1 - 1 ];
+ if ( $placeholders && $cond->{ $side } =~ /^%($re_ph_name)$/o ) {
+ if ( defined ( my $phs = $placeholders->{ $1 } ) ) {
if ( ref $phs ) {
$phs = [ map $parser->dq($_), @{ $phs } ];
$phs = $phs->[0] if @{ $phs } == 1;
@@ -526,14 +525,14 @@
my $description = $self->describe_join( $model => $ref->{'name'} );
if ( $cond->{$side}{'alias'} eq $inverse_on ) {
my $linear = $self->_linearize_join(
- $description, 'inverse', { to => $res[$right_border], place => $conditions }, $ref->{'placeholders'} || [],
+ $description, 'inverse', { to => $res[$right_border], place => $conditions }, $ref->{'placeholders'},
);
$last_join = $set_condition_on = $linear->[0];
splice @res, $right_border, 1, @$linear;
$right_border -= (@$linear - 1);
} else {
my $linear = $self->_linearize_join(
- $description, undef, { to => $res[$left_border] }, $ref->{'placeholders'} || [],
+ $description, undef, { to => $res[$left_border] }, $ref->{'placeholders'},
);
$last_join = $linear->[-1];
splice @res, $left_border, 1, @$linear;
@@ -641,17 +640,18 @@
# returns something like:
# {
-# 'string' => 'nodes.attr{"category"}.value',
+# 'string' => 'nodes.attr{name => "category"}.value',
# 'alias' => 'nodes', # alias or ''
# 'chain' => [
# {
# 'name' => 'attr',
-# 'string' => 'nodes.attr{"category"}',
-# 'placeholders' => ['"category"'],
+# 'string' => 'nodes.attr{name => "category"}',
+# 'placeholders' => {name => '"category"'},
# },
# {
# 'name' => 'value',
-# 'string' => 'nodes.attr{"category"}.value'
+# 'string' => 'nodes.attr{name => "category"}.value'
+# 'placeholders' => {},
# }
# ],
# }
@@ -674,14 +674,16 @@
my $string = $col;
$col =~ s/^($re_field)//;
my $field = $1;
- my @phs = split /{\s*($re_cs_values|$re_ph|$re_binding)?\s*}/, $col;
- @phs = grep !defined || length, @phs;
+
+ my @phs = split /{\s*($re_ph_name)\s*=>\s*($re_cs_values|$re_ph|$re_binding)\s*}/, $col;
+ @phs = grep !defined || length, @phs; # skip delimiters
+
$col = {
name => $field,
string => $prev .".$string",
};
- $col->{'placeholders'} = \@phs if @phs;
- foreach my $ph ( grep defined && $_ ne '?' && !/^%[0-9]+$/, @phs ) {
+ $col->{'placeholders'} = { @phs };
+ foreach my $ph ( grep $_ ne '?' && !/^$re_ph$/o, values %{ $col->{'placeholders'} } ) {
my @values;
while ( $ph =~ s/^($re_value)\s*,?\s*// ) {
push @values, $1;
Modified: Jifty-DBI/branches/tisql/t/tisql/internals/parse_column.t
==============================================================================
--- Jifty-DBI/branches/tisql/t/tisql/internals/parse_column.t (original)
+++ Jifty-DBI/branches/tisql/t/tisql/internals/parse_column.t Fri Feb 27 17:26:27 2009
@@ -22,59 +22,65 @@
parse_ok ".col" => {
alias => '',
- chain => [{ name => 'col', string => '.col' }],
+ chain => [{ name => 'col', string => '.col', placeholders => {} }],
};
parse_ok "alias.col" => {
alias => 'alias',
- chain => [{ name => 'col', string => 'alias.col' }],
+ chain => [{ name => 'col', string => 'alias.col', placeholders => {} }],
};
parse_ok ".col.id" => {
alias => '',
- chain => [{ name => 'col', string => '.col' }, { name => 'id', string => '.col.id' }],
+ chain => [
+ { name => 'col', string => '.col', placeholders => {} },
+ { name => 'id', string => '.col.id', placeholders => {} },
+ ],
};
parse_ok "alias.col.id" => {
alias => 'alias',
- chain => [{ name => 'col', string => 'alias.col' }, { name => 'id', string => 'alias.col.id' }],
+ chain => [
+ { name => 'col', string => 'alias.col', placeholders => {} },
+ { name => 'id', string => 'alias.col.id', placeholders => {} },
+ ],
};
# place holders
-parse_ok ".col{'v'}" => {
+parse_ok ".col{k=>'v'}" => {
alias => '',
- chain => [{ name => 'col', string => ".col{'v'}", placeholders => [["'v'"]] }],
+ chain => [{ name => 'col', string => ".col{k=>'v'}", placeholders => { k => ["'v'"] } }],
};
-parse_ok ".col{'v1', 'v2'}" => {
+parse_ok ".col{ k => 'v1', 'v2' }" => {
alias => '',
- chain => [{ name => 'col', string => ".col{'v1', 'v2'}", placeholders => [["'v1'", "'v2'"]] }],
+ chain => [{ name => 'col', string => ".col{ k => 'v1', 'v2' }", placeholders => { k => ["'v1'", "'v2'"] } }],
};
-parse_ok ".col{'v11', 'v12'}{'v21', 'v22'}" => {
+parse_ok ".col{ foo =>'v11', 'v12'}{bar=> 'v21', 'v22'}" => {
alias => '',
- chain => [{ name => 'col', string => ".col{'v11', 'v12'}{'v21', 'v22'}", placeholders => [["'v11'", "'v12'"], ["'v21'", "'v22'"]] }],
+ chain => [{ name => 'col', string => ".col{ foo =>'v11', 'v12'}{bar=> 'v21', 'v22'}", placeholders => { foo => ["'v11'", "'v12'"], bar => ["'v21'", "'v22'"]} }],
};
# bindings in placeholder
-parse_ok ".col{?}" => {
+parse_ok ".col{k => ?}" => {
alias => '',
- chain => [{ name => 'col', string => ".col{?}", placeholders => ['?'] }],
+ chain => [{ name => 'col', string => ".col{k => ?}", placeholders => { k => '?' } }],
};
-parse_ok ".col{?}{?}" => {
+parse_ok ".col{foo => ?}{ bar => ? }" => {
alias => '',
- chain => [{ name => 'col', string => ".col{?}{?}", placeholders => ['?', '?'] }],
+ chain => [{ name => 'col', string => ".col{foo => ?}{ bar => ? }", placeholders => { foo => '?', bar => '?' } }],
};
-parse_ok ".col{%1}" => {
+parse_ok ".col{ foo => %bar }" => {
alias => '',
- chain => [{ name => 'col', string => ".col{%1}", placeholders => ['%1'] }],
+ chain => [{ name => 'col', string => ".col{ foo => %bar }", placeholders => { foo => '%bar' } }],
};
-parse_ok ".col{%1}{%3}" => {
+parse_ok ".col{ foo => %foo }{bar=>%zoo}" => {
alias => '',
- chain => [{ name => 'col', string => ".col{%1}{%3}", placeholders => ['%1', '%3'] }],
+ chain => [{ name => 'col', string => ".col{ foo => %foo }{bar=>%zoo}", placeholders => { foo => '%foo', bar => '%zoo' } }],
};
1;
Modified: Jifty-DBI/branches/tisql/t/tisql/searches_attrs.t
==============================================================================
--- Jifty-DBI/branches/tisql/t/tisql/searches_attrs.t (original)
+++ Jifty-DBI/branches/tisql/t/tisql/searches_attrs.t Fri Feb 27 17:26:27 2009
@@ -51,39 +51,39 @@
# has no attrs
".attrs.id IS NULL" => [qw(a- m-)],
"has no .attrs" => [qw(a- m-)],
- ".attrs{'a'}.id IS NULL" => [qw(a- m- aba abb abc acc mba mbb mbc mcc)],
- "has no .attrs{'a'}" => [qw(a- m- aba abb abc acc mba mbb mbc mcc)],
- "has no .attrs{'a', 'b'}" => [qw(a- m- acc mcc)],
+ ".attrs{ name => 'a'}.id IS NULL" => [qw(a- m- aba abb abc acc mba mbb mbc mcc)],
+ "has no .attrs{name => 'a'}" => [qw(a- m- aba abb abc acc mba mbb mbc mcc)],
+ "has no .attrs{name => 'a', 'b'}" => [qw(a- m- acc mcc)],
# has attrs
".attrs.id IS NOT NULL" => [qw(aaa aab aac aaaab aabac aacaa aba abb abc acc maa mab mac maaab mabac macaa mba mbb mbc mcc)],
"has .attrs" => [qw(aaa aab aac aaaab aabac aacaa aba abb abc acc maa mab mac maaab mabac macaa mba mbb mbc mcc)],
- ".attrs{'a'}.id IS NOT NULL" => [qw(aaa aab aac aaaab aabac aacaa maa mab mac maaab mabac macaa)],
- "has .attrs{'a'}" => [qw(aaa aab aac aaaab aabac aacaa maa mab mac maaab mabac macaa)],
- "has .attrs{'b','c'}" => [qw(aba abb abc acc mba mbb mbc mcc)],
+ ".attrs{name => 'a'}.id IS NOT NULL" => [qw(aaa aab aac aaaab aabac aacaa maa mab mac maaab mabac macaa)],
+ "has .attrs{name => 'a'}" => [qw(aaa aab aac aaaab aabac aacaa maa mab mac maaab mabac macaa)],
+ "has .attrs{name => 'b','c'}" => [qw(aba abb abc acc mba mbb mbc mcc)],
# attr = x
".attrs.value = 'no'" => [qw()],
".attrs.value = 'a'" => [qw(aaa aaaab aacaa aba maa maaab macaa mba)],
- ".attrs{'a'}.value = 'a'" => [qw(aaa aaaab aacaa maa maaab macaa)],
- ".attrs{'a', 'b'}.value = 'c'" => [qw(aac aacaa aabac abc mac macaa mabac mbc)],
+ ".attrs{name => 'a'}.value = 'a'" => [qw(aaa aaaab aacaa maa maaab macaa)],
+ ".attrs{name => 'a', 'b'}.value = 'c'" => [qw(aac aacaa aabac abc mac macaa mabac mbc)],
"has .attrs.value = 'no'" => [qw()],
"has .attrs.value = 'a'" => [qw(aaa aaaab aacaa aba maa maaab macaa mba)],
- "has .attrs{'a'}.value = 'a'" => [qw(aaa aaaab aacaa maa maaab macaa)],
- "has .attrs{'a', 'b'}.value = 'c'" => [qw(aac aacaa aabac abc mac macaa mabac mbc)],
+ "has .attrs{name => 'a'}.value = 'a'" => [qw(aaa aaaab aacaa maa maaab macaa)],
+ "has .attrs{name => 'a', 'b'}.value = 'c'" => [qw(aac aacaa aabac abc mac macaa mabac mbc)],
# attr != x
".attrs.value != 'no'" => [qw(a- aaa aab aac aaaab aabac aacaa aba abb abc acc m- maa mab mac maaab mabac macaa mba mbb mbc mcc)],
".attrs.value != 'a'" => [qw(a- aab aac aabac abb abc acc m- mab mac mabac mbb mbc mcc)],
- ".attrs{'a'}.value != 'a'" => [qw(a- aab aac aabac aba abb abc acc m- mab mac mabac mba mbb mbc mcc)],
+ ".attrs{name => 'a'}.value != 'a'" => [qw(a- aab aac aabac aba abb abc acc m- mab mac mabac mba mbb mbc mcc)],
# attr = x and/or attr = y
".attrs.value = 'no' AND .attrs.value = 'a'" => [qw()],
".attrs.value = 'no' OR .attrs.value = 'a'" => [qw(aaa aaaab aacaa aba maa maaab macaa mba)],
".attrs.value = 'a' AND .attrs.value = 'b'" => [qw(aaaab maaab)],
".attrs.value = 'a' OR .attrs.value = 'b'" => [qw(aaa aaaab aacaa aba maa maaab macaa mba aab abb mab mbb aabac mabac)],
- ".attrs{'a'}.value = 'a' AND .attrs{'b'}.value = 'b'" => [qw()],
- ".attrs{'a'}.value = 'a' OR .attrs{'b'}.value = 'b'" => [qw(aaa aaaab aacaa abb maa maaab macaa mbb)],
+ ".attrs{name => 'a'}.value = 'a' AND .attrs{name => 'b'}.value = 'b'" => [qw()],
+ ".attrs{name => 'a'}.value = 'a' OR .attrs{name => 'b'}.value = 'b'" => [qw(aaa aaaab aacaa abb maa maaab macaa mbb)],
# tag != x and/or tag = y
@@ -91,12 +91,12 @@
".attrs.value != 'no' OR .attrs.value = 'a'" => [qw(a- aab aac aabac abb abc m- mab mac mabac mbb mbc acc mcc aaa aaaab aacaa aba maa maaab macaa mba)],
".attrs.value != 'a' AND .attrs.value = 'b'" => [qw(abb mbb aab aabac mab mabac)],
".attrs.value != 'a' OR .attrs.value = 'b'" => [qw(a- aab aac aabac abb abc m- mab mac mabac mbb mbc acc mcc aaaab maaab)],
- ".attrs{'a'}.value != 'a' AND .attrs{'b'}.value = 'b'" => [qw(abb mbb)],
- ".attrs{'a'}.value != 'a' OR .attrs{'b'}.value = 'b'" => [qw(a- aab aac aabac aba abc m- mab mac mabac mba mbc acc mcc abb mbb)],
+ ".attrs{name => 'a'}.value != 'a' AND .attrs{name => 'b'}.value = 'b'" => [qw(abb mbb)],
+ ".attrs{name => 'a'}.value != 'a' OR .attrs{name => 'b'}.value = 'b'" => [qw(a- aab aac aabac aba abc m- mab mac mabac mba mbc acc mcc abb mbb)],
# has .tag != x
"has .attrs.value != 'a'" => [qw(aab aac aaaab aabac aacaa abb abc mab mac maaab mabac macaa mbb mbc acc mcc)],
- "has .attrs{'a'}.value != 'b'" => [qw(aaa aac aaaab aabac aacaa maa mac maaab mabac macaa)],
+ "has .attrs{name => 'a'}.value != 'b'" => [qw(aaa aac aaaab aabac aacaa maa mac maaab mabac macaa)],
# # has no .tag != x
# "has no .attrs.value != 'no'" => [qw(a m)],
@@ -186,7 +186,7 @@
column type => type is 'varchar(36)';
column subject => type is 'varchar(36)';
column attrs => refers_to TestApp::AttributeCollection
- by tisql => "attrs.node = .id AND attrs.name = %1";
+ by tisql => "attrs.node = .id AND attrs.name = %name";
};
}
Modified: Jifty-DBI/branches/tisql/t/tisql/searches_links.t
==============================================================================
--- Jifty-DBI/branches/tisql/t/tisql/searches_links.t (original)
+++ Jifty-DBI/branches/tisql/t/tisql/searches_links.t Fri Feb 27 17:26:27 2009
@@ -46,11 +46,11 @@
run_our_cool_tests(
$tasks_obj,
".links_to.dst_id = 2" => [qw(1_m_of_2)],
- ".links_to{'member_of'}.dst_id = 2" => [qw(1_m_of_2)],
- ".links_to{}{'task'}.dst_id = 2" => [qw(1_m_of_2)],
- ".links_to{'member_of'}{'task'}.dst_id = 2" => [qw(1_m_of_2)],
- ".links_from{'member_of'}{'task'}.src_id = 1" => [qw(2_has_m_1)],
-# TODO ".linked_tasks.subject = '2_has_m_1'" => [qw(qwe)],
+ ".links_to{type => 'member_of'}.dst_id = 2" => [qw(1_m_of_2)],
+ ".links_to{model => 'task'}.dst_id = 2" => [qw(1_m_of_2)],
+ ".links_to{type => 'member_of'}{model => 'task'}.dst_id = 2" => [qw(1_m_of_2)],
+ ".links_from{type => 'member_of'}{model => 'task'}.src_id = 1" => [qw(2_has_m_1)],
+# TODO: ".linked_tasks.subject = '2_has_m_1'" => [qw(qwe)],
".linked_to_tasks.subject = '2_has_m_1'" => [qw(1_m_of_2)],
".linked_from_tasks.subject = '1_m_of_2'" => [qw(2_has_m_1)],
".member_of.subject = '2_has_m_1'" => [qw(1_m_of_2)],
@@ -132,25 +132,26 @@
column subject => type is 'varchar(32)';
column links => refers_to TestApp::LinkCollection
- by tisql => 'links.type = %1 AND ((links.src_model = "task" AND links.src_id = .id)
+ by tisql => 'links.type = %type AND ((links.src_model = "task" AND links.src_id = .id)
OR (links.dst_model = "task" AND dst_id = .id))';
column links_from => refers_to TestApp::LinkCollection
by tisql => 'links_from.dst_model = "task" AND links_from.dst_id = .id'
- .' AND links_from.type = %1 AND links_from.src_model = %2';
+ .' AND links_from.type = %type AND links_from.src_model = %model';
column links_to => refers_to TestApp::LinkCollection
by tisql => 'links_to.src_model = "task" AND links_to.src_id = .id'
- .' AND links_to.type = %1 AND links_to.dst_model = %2';
+ .' AND links_to.type = %type AND links_to.dst_model = %model';
column linked_tasks => refers_to TestApp::TaskCollection
- by tisql => 'linked_tasks.id = .links_from{%1}{"task"}.src_id OR linked_tasks.id = .links_to{%1}{"task"}.dst_id';
+ by tisql => 'linked_tasks.id = .links_from{type => %type}{model => "task"}.src_id'
+ .' OR linked_tasks.id = .links_to{type => %type}{model => "task"}.dst_id';
column linked_to_tasks => refers_to TestApp::TaskCollection
- by tisql => 'linked_to_tasks.id = .links_to{%1}{"task"}.dst_id';
+ by tisql => 'linked_to_tasks.id = .links_to{type => %type}{model => "task"}.dst_id';
column linked_from_tasks => refers_to TestApp::TaskCollection
- by tisql => 'linked_from_tasks.id = .links_from{%1}{"task"}.src_id';
+ by tisql => 'linked_from_tasks.id = .links_from{type => %type}{model => "task"}.src_id';
column member_of => refers_to TestApp::TaskCollection
- by tisql => 'member_of.id = .links_to{"member_of"}{"task"}.dst_id';
+ by tisql => 'member_of.id = .links_to{type => "member_of"}{model => "task"}.dst_id';
};
sub init_data {
More information about the Jifty-commit
mailing list