Initial revision
[OpenSRF.git] / src / perlmods / OpenSRF / DomainObject / oilsSearch.pm
1 package OpenILS::DomainObject::oilsSearch;
2 use OpenILS::DomainObject;
3 use OpenILS::DomainObject::oilsPrimitive;
4 use OpenILS::DOM::Element::searchCriteria;
5 use base 'OpenILS::DomainObject';
6
7 sub new {
8         my $class = shift;
9         $class = ref($class) || $class;
10
11         unshift @_, 'table' if (@_ == 1);
12         my %args = @_;
13
14         my $self = $class->SUPER::new;
15         
16         for my $part ( keys %args ) {
17                 if ($part ne 'criteria') {
18                         $self->$part( $args{$part} );
19                         next;
20                 }
21                 $self->criteria( OpenILS::DOM::Element::searchCriteria->new( @{$args{$part}} ) );
22         }
23         return $self;
24 }
25
26 sub format {
27         my $self = shift;
28         return $self->_attr_get_set( format => shift );
29 }
30
31 sub table {
32         my $self = shift;
33         return $self->_attr_get_set( table => shift );
34 }
35
36 sub fields {
37         my $self = shift;
38         my $new_fields_ref = shift;
39
40         my ($old_fields) = $self->getChildrenByTagName("oils:domainObjectCollection");
41         
42         if ($new_fields_ref) {
43                 my $do = OpenILS::DomainObjectCollection::oilsArray->new( @$new_fields_ref );
44                 if (defined $old_fields) {
45                         $old_fields->replaceNode($do);
46                 } else {
47                         $self->appendChild($do);
48                         return $do->list;
49                 }
50         }
51
52         return $old_fields->list if ($old_fields);
53 }
54
55 sub limit {
56         my $self = shift;
57         return $self->_attr_get_set( limit => shift );
58 }
59
60 sub offset {
61         my $self = shift;
62         return $self->_attr_get_set( offset => shift );
63 }
64
65 sub group_by {
66         my $self = shift;
67         return $self->_attr_get_set( group_by => shift );
68 }
69
70 sub criteria {
71         my $self = shift;
72         my $new_crit = shift;
73
74         if (@_) {
75                 unshift @_, $new_crit;
76                 $new_crit = OpenILS::DOM::Element::searchCriteria->new(@_);
77         }
78
79         my ($old_crit) = $self->getChildrenByTagName("oils:searchCriteria");
80         
81         if (defined $new_crit) {
82                 if (defined $old_crit) {
83                         $old_crit->replaceNode($new_crit);
84                 } else {
85                         $self->appendChild($new_crit);
86                         return $new_crit;
87                 }
88         }
89
90         return $old_crit;
91 }
92
93 sub toSQL {
94         my $self = shift;
95
96         my $SQL  = 'SELECT    ' . join(',', $self->fields);
97            $SQL .= '  FROM    ' . $self->table;
98            $SQL .= '  WHERE   ' . $self->criteria->toSQL if ($self->criteria);
99            $SQL .= ' GROUP BY ' . $self->group_by if ($self->group_by);
100            $SQL .= '  LIMIT   ' . $self->limit if ($self->limit);
101            $SQL .= '  OFFSET  ' . $self->offset if ($self->offset);
102         
103         return $SQL;
104 }
105
106 1;