eliminate variable name requirement from query()
Matt S Trout [Sat, 22 Feb 2014 05:48:50 +0000 (05:48 +0000)]
bin/dx-shell
lib/DX/Op/FindAll.pm
lib/DX/Op/Materialize.pm
lib/DX/Result.pm
lib/DX/RuleSet.pm
lib/DX/Solver.pm
t/basic_rule.t
t/dot_ssh.t
t/findall.t

index 6848ed6..1865982 100644 (file)
@@ -47,8 +47,8 @@ sub expand_body {
 }
 
 $tcl->CreateCommand(query => sub {
-  my (undef, undef, undef, $vars, $body) = @_;
-  @last_q = expand_def($vars, $body);
+  my (undef, undef, undef, $body) = @_;
+  @last_q = expand_body($body);
   do_query();
   return;
 });
@@ -92,12 +92,6 @@ foreach my $rule (keys %{$solver->rule_set->rules}) {
   $tcl->CreateCommand($rule => $rule_sub);
 }
 
-$tcl->CreateCommand(exists => sub {
-  my (undef, undef, undef, $vars, $body) = @_;
-  push our @Body_Parts, [ exists => expand_def($vars, $body) ];
-  return;
-});
-
 $tcl->CreateCommand(foreach => sub {
   my (undef, undef, undef, $var, $body, $each_body) = @_;
   push our @Body_Parts, [
index f8770fb..ff22ce4 100644 (file)
@@ -17,7 +17,7 @@ sub make_result_handler {
   DX::Op::FromCode->new(
     code => sub {
       my ($self, $state) = @_;
-      $state->bind_value($state->scope->{$coll_name} => $coll)
+      $state->assign_vars($coll_name => { bound_value => $coll })
             ->then($self->next);
     },
     next => $self->next
index ee17e55..b9814fd 100644 (file)
@@ -4,15 +4,13 @@ use Moo;
 
 with 'DX::Role::Op';
 
-has var_name => (is => 'ro', required => 1);
-
 sub run {
   my ($self, $state) = @_;
-  my $var = $state->scope_var($self->var_name);
-  unless ($var->is_bound) {
-    die "Can't materialize unbound ".$self->var_name;
+  foreach my $k (keys %{$state->scope}) {
+    my $var = $state->scope_var($k);
+    next unless $var->is_bound;
+    $state->resolve_value($var);
   }
-  $state->resolve_value($var);
   $state->then($self->next);
 }
 
index d409b55..3740cc7 100644 (file)
@@ -6,7 +6,8 @@ use Moo;
 has _state => (is => 'ro', required => 1, init_arg => 'state');
 
 sub var_names {
-  sort keys %{$_[0]->_state->scope};
+  grep $_[0]->_state->scope_var($_)->is_bound,
+    sort keys %{$_[0]->_state->scope};
 }
 
 sub actions {
index 9449f92..f0ee6ed 100644 (file)
@@ -139,8 +139,8 @@ sub _expand_op_react {
 }
 
 sub _expand_op_materialize {
-  my ($self, $var_name) = @_;
-  DX::Op::Materialize->new(var_name => $var_name);
+  my ($self) = @_;
+  DX::Op::Materialize->new;
 }
 
 sub _expand_op_prop {
index 6626840..6300b23 100644 (file)
@@ -19,10 +19,9 @@ has facts => (is => 'ro', default => sub { {} });
 has observation_policy => (is => 'ro');
 
 sub query {
-  my ($self, $vars, @terms) = @_;
+  my ($self, @terms) = @_;
   my $rule_set = $self->rule_set;
-  push @terms, map +[ materialize => $_ ], @$vars;
-  my $head = $rule_set->expand_and_link(undef, @terms);
+  my $head = $rule_set->expand_and_link(undef, @terms, [ 'materialize' ]);
   my $state = DX::State->new(
     next_op => $head,
     return_stack => [],
@@ -31,7 +30,7 @@ sub query {
     last_choice => [],
     facts => $self->facts,
     rule_set => $rule_set,
-  )->assign_vars(map +($_ => {}), @$vars);
+  );
   return DX::ResultStream->new(
     for_state => $state,
     ($self->observation_policy
index 95d2666..1922d7e 100644 (file)
@@ -45,7 +45,7 @@ $solver->add_rule(
   server => [ 'S' ] => [ member_of => S => [ value => 'servers' ] ]
 );
 
-my $s = $solver->query([ 'S' ], [ server => 'S' ]);
+my $s = $solver->query([ server => 'S' ]);
 
 is_deeply([ map $_->value_for('S')->{name}, $s->results ], [ sort @servers ]);
 
@@ -61,7 +61,6 @@ $solver->add_rule(
                  );
 
 $s = $solver->query(
-       [ qw(Shell Srv) ],
        [ shell => 'Shell' ],
        [ name => 'Shell', [ value => 'bash' ] ],
        [ server => 'Srv' ],
index 9619022..aac7c71 100644 (file)
@@ -83,7 +83,7 @@ $solver->add_rule(@$_) for (
 
 sub paths_for_simple {
   join ' ', map $_->value_for('PS')->path, $solver->query(
-    [ qw(PS) ], [ path_status => 'PS' ], @_
+    [ path_status => 'PS' ], @_
   )->results;
 }
 
@@ -107,8 +107,7 @@ $solver->add_rule(
 
 throws_ok {
   $solver->query(
-    [ qw(PS) ],
-      [ path_status_at => 'PS', [ value => '.ssh' ] ]
+    [ path_status_at => 'PS', [ value => '.ssh' ] ]
   )->results
 } qr/ARGH/;
 
@@ -129,8 +128,7 @@ my @res;
 
 lives_ok {
   @res = $solver->query(
-    [ qw(PS) ],
-      [ path_status_at => 'PS', [ value => '.ssh' ] ]
+    [ path_status_at => 'PS', [ value => '.ssh' ] ]
   )->results
 };
 
@@ -166,7 +164,7 @@ $solver->add_rule(
 $ob_res{'.ssh'} = $protos{'.ssh'};
 
 sub paths_for {
-  join ' ', map $_->value_for('PS')->path, $solver->query([ 'PS' ], @_)->results;
+  join ' ', map $_->value_for('PS')->path, $solver->query(@_)->results;
 }
 
 is(
@@ -219,7 +217,7 @@ $ob_res{'.ssh'} = $empty{'.ssh'};
 $solver->{observation_policy} = sub { 1 };
 
 sub dot_ssh_query {
-  $solver->query([ 'PS' ], [ directory_at => 'PS' => [ value => '.ssh' ] ]);
+  $solver->query([ directory_at => 'PS' => [ value => '.ssh' ] ]);
 }
 
 is_deeply(
@@ -315,7 +313,7 @@ $solver->add_rule(@$_) for (
 %ob_res = %empty;
 
 sub keys_file {
-  $solver->query([ qw(D F) ],
+  $solver->query(
      [ directory_at => 'D' => \'.ssh' ],
      [ file_in => 'D' => \'authorized_keys' => 'F' ],
    );
index df84bfe..47fee23 100644 (file)
@@ -28,15 +28,13 @@ $solver->facts->{shell_installed} = DX::OrderedSet->new(
 );
 
 $solver->add_rule(has_shell => [ 'Srv', 'Shell' ],
-  [ exists => [ qw(Name SI) ] =>
-    [ member_of => 'SI', \'shell_installed' ],
-    [ prop => 'SI' => \'server' => 'Name' ],
-    [ prop => 'Srv' => \'name' => 'Name' ],
-    [ prop => 'SI' => \'shell' => 'Shell' ]
-  ],
+  [ member_of => 'SI', \'shell_installed' ],
+  [ prop => 'SI' => \'server' => 'Name' ],
+  [ prop => 'Srv' => \'name' => 'Name' ],
+  [ prop => 'SI' => \'shell' => 'Shell' ]
 );
 
-my @r = $solver->query([ 'X' ],
+my @r = $solver->query(
   [ findall => X => S =>
     [ member_of => 'S', \'server' ],
     [ has_shell => 'S', \'bash' ],
@@ -48,7 +46,7 @@ is_deeply(
   [ qw(one three four) ]
 );
 
-@r = $solver->query([],
+@r = $solver->query(
   [ foreach => S => [ [ member_of => 'S', \'server' ] ],
     [ [ has_shell => 'S' => \'bash' ] ] ]
 )->results;
@@ -58,7 +56,7 @@ ok(!@r, 'No results for only bash');
 $solver->add_rule(has_any_shell => [ 'S' ] => [ has_shell => 'S' => \'bash' ]);
 $solver->add_rule(has_any_shell => [ 'S' ] => [ has_shell => 'S' => \'csh' ]);
 
-@r = $solver->query([],
+@r = $solver->query(
   [ foreach => S => [ [ member_of => 'S', \'server' ] ],
     [ [ has_any_shell => 'S' ] ] ]
 )->results;