6 my $solver = DX::Solver->new;
10 has name => (is => 'ro', required => 1);
12 package My::ShellInstalled;
14 has server => (is => 'ro', required => 1);
15 has shell => (is => 'ro', required => 1);
18 $solver->facts->{server} = DX::OrderedSet->new(
19 values => [ map My::Server->new(name => $_), qw(one two three four five) ]
21 $solver->facts->{shell_installed} = DX::OrderedSet->new(
23 (map My::ShellInstalled->new(server => $_, shell => 'bash'),
25 (map My::ShellInstalled->new(server => $_, shell => 'csh'),
30 $solver->add_rule(has_shell => [ 'Srv', 'Shell' ],
31 [ exists => [ qw(Name SI) ] =>
32 [ member_of => 'SI', \'shell_installed' ],
33 [ prop => 'SI' => \'server' => 'Name' ],
34 [ prop => 'Srv' => \'name' => 'Name' ],
35 [ prop => 'SI' => \'shell' => 'Shell' ]
39 my @r = $solver->query([ 'X' ],
40 [ findall => X => S =>
41 [ member_of => 'S', \'server' ],
42 [ has_shell => 'S', \'bash' ],
47 [ map $_->name, $r[0]->value_for('X')->all ],
48 [ qw(one three four) ]
51 @r = $solver->query([],
52 [ foreach => S => [ [ member_of => 'S', \'server' ] ],
53 [ [ has_shell => 'S' => \'bash' ] ] ]
56 ok(!@r, 'No results for only bash');
58 $solver->add_rule(has_any_shell => [ 'S' ] => [ has_shell => 'S' => \'bash' ]);
59 $solver->add_rule(has_any_shell => [ 'S' ] => [ has_shell => 'S' => \'csh' ]);
61 @r = $solver->query([],
62 [ foreach => S => [ [ member_of => 'S', \'server' ] ],
63 [ [ has_any_shell => 'S' ] ] ]
66 # only three matches both legs of has_any_shell
68 is(scalar(@r), 2, 'Two solutions for any shell');