[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