1 package OpenILS::DomainObjectCollection::oilsMultiSearch;
2 use OpenILS::DomainObjectCollection;
3 use OpenILS::DomainObject::oilsPrimitive;
4 use OpenILS::DomainObject::oilsSearch;
5 use OpenILS::DOM::Element::searchCriteria;
6 use OpenILS::DOM::Element::searchCriterium;
7 use base 'OpenILS::DomainObjectCollection::oilsHash';
13 $class = ref($class) || $class;
15 my $self = $class->SUPER::new;
17 tie my %hash, 'OpenILS::DomainObjectCollection::oilsHash', $self;
19 $self->set( bind_count => 1 );
20 $self->set( searches => new OpenILS::DomainObjectCollection::oilsHash );
21 $self->set( relators => new OpenILS::DomainObjectCollection::oilsArray );
22 $self->set( fields => new OpenILS::DomainObjectCollection::oilsArray );
23 $self->set( group_by => new OpenILS::DomainObjectCollection::oilsArray );
24 $self->set( order_by => new OpenILS::DomainObjectCollection::oilsArray );
35 $search = OpenILS::DomainObject::oilsSearch->new($search) if (ref($search) eq 'ARRAY');
37 $self->searches->set( $alias => $search );
39 if ($self->searches->size > 1) {
40 throw OpenILS::EX::InvalidArg ('You need to pass a relator searchCriterium')
41 unless (defined $relator);
44 $relator = OpenILS::DOM::Element::searchCriterium->new( @$relator )
45 if (ref($relator) eq 'ARRAY');
47 $self->relators->push( $relator ) if (defined $relator);
53 return $_[0]->_accessor('relators');
57 return $_[0]->_accessor('searches');
64 $self->set( fields => OpenILS::DomainObjectCollection::oilsArray->new(@_) );
66 return $self->_accessor('fields')->list;
70 $_[0]->set( format => $_[1] ) if (defined $_[1]);
71 return $_[0]->_accessor('format');
75 $_[0]->set( limit => $_[1] ) if (defined $_[1]);
76 return $_[0]->_accessor('limit');
80 $_[0]->set( offset => $_[1] ) if (defined $_[1]);
81 return $_[0]->_accessor('offset');
85 $_[0]->set( chunk_key => $_[1] ) if (defined $_[1]);
86 return $_[0]->_accessor('chunk_key');
93 $self->set( order_by => OpenILS::DomainObjectCollection::oilsArray->new(@_) );
95 return $self->_accessor('order_by')->list;
102 $self->set( group_by => OpenILS::DomainObjectCollection::oilsArray->new(@_) );
104 return $self->_accessor('group_by')->list;
107 sub SQL_select_list {
110 if (my $sql = $self->_accessor('sql_select_list')) {
114 $self->set( sql_select_list => 'SELECT '.join(', ', $self->fields) ) if defined($self->fields);
115 return $self->_accessor('sql_select_list');
121 if (my $sql = $self->_accessor('sql_group_by')) {
125 $self->set( sql_group_by => 'GROUP BY '.join(', ', $self->group_by) ) if defined($self->group_by);
126 return $self->_accessor('sql_group_by');
132 if (my $sql = $self->_accessor('sql_order_by')) {
136 $self->set( sql_order_by => 'ORDER BY '.join(', ', $self->order_by) ) if defined($self->order_by);
137 return $self->_accessor('sql_order_by');
143 if (my $sql = $self->_accessor('sql_offset')) {
147 $self->set( sql_offset => 'OFFSET '.$self->offset ) if defined($self->offset);
148 return $self->_accessor('sql_offset');
154 if (my $sql = $self->_accessor('sql_limit')) {
158 $self->set( sql_limit => 'LIMIT '.$self->limit ) if defined($self->limit);
159 return $self->_accessor('sql_limit');
165 my $SQL = $self->SQL_select_list.' FROM ';
168 for my $search ( $self->searches->keys ) {
169 push @subselects, '('.$self->searches->_accessor($search)->toSQL.') '.$search;
171 $SQL .= join(', ', @subselects).' WHERE ';
174 for my $rel ( $self->relators->list ) {
175 push @relators, $rel->value->toSQL( no_quote => 1 );
177 $SQL .= join(' AND ', @relators).' ';
178 $SQL .= join ' ', ($self->SQL_group_by, $self->SQL_order_by, $self->SQL_limit, $self->SQL_offset);
183 #this is just to allow DomainObject to "upcast" nicely
184 package OpenILS::DomainObject::oilsMultiSearch;
185 use base OpenILS::DomainObjectCollection::oilsMultiSearch;