annotate sites/all/modules/custom/solrsearch/plugins/facetapi/query_type_date.inc @ 0:015d06b10d37 default tip

initial
author dwinter
date Wed, 31 Jul 2013 13:49:13 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
015d06b10d37 initial
dwinter
parents:
diff changeset
1 <?php
015d06b10d37 initial
dwinter
parents:
diff changeset
2
015d06b10d37 initial
dwinter
parents:
diff changeset
3 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
4 * @file
015d06b10d37 initial
dwinter
parents:
diff changeset
5 * Date query type plugin for the Apache Solr adapter.
015d06b10d37 initial
dwinter
parents:
diff changeset
6 */
015d06b10d37 initial
dwinter
parents:
diff changeset
7
015d06b10d37 initial
dwinter
parents:
diff changeset
8 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
9 * Plugin for "date" query types.
015d06b10d37 initial
dwinter
parents:
diff changeset
10 */
015d06b10d37 initial
dwinter
parents:
diff changeset
11 class solrsearchFacetapiDate extends FacetapiQueryTypeDate implements FacetapiQueryTypeInterface {
015d06b10d37 initial
dwinter
parents:
diff changeset
12
015d06b10d37 initial
dwinter
parents:
diff changeset
13 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
14 * Returns the query type associated with the plugin.
015d06b10d37 initial
dwinter
parents:
diff changeset
15 *
015d06b10d37 initial
dwinter
parents:
diff changeset
16 * @return string
015d06b10d37 initial
dwinter
parents:
diff changeset
17 * The query type.
015d06b10d37 initial
dwinter
parents:
diff changeset
18 */
015d06b10d37 initial
dwinter
parents:
diff changeset
19 static public function getType() {
015d06b10d37 initial
dwinter
parents:
diff changeset
20 return 'date';
015d06b10d37 initial
dwinter
parents:
diff changeset
21 }
015d06b10d37 initial
dwinter
parents:
diff changeset
22
015d06b10d37 initial
dwinter
parents:
diff changeset
23 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
24 * Adds the filter to the query object.
015d06b10d37 initial
dwinter
parents:
diff changeset
25 *
015d06b10d37 initial
dwinter
parents:
diff changeset
26 * @param DrupalSolrQueryInterface $query
015d06b10d37 initial
dwinter
parents:
diff changeset
27 * An object containing the query in the backend's native API.
015d06b10d37 initial
dwinter
parents:
diff changeset
28 */
015d06b10d37 initial
dwinter
parents:
diff changeset
29 public function execute($query) {
015d06b10d37 initial
dwinter
parents:
diff changeset
30 // Gets the data range in formats that Solr understands.
015d06b10d37 initial
dwinter
parents:
diff changeset
31 $date_range = $this->getDateRange($query);
015d06b10d37 initial
dwinter
parents:
diff changeset
32 if (empty($date_range)) {
015d06b10d37 initial
dwinter
parents:
diff changeset
33 return NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
34 }
015d06b10d37 initial
dwinter
parents:
diff changeset
35 list($start, $end, $gap) = $date_range;
015d06b10d37 initial
dwinter
parents:
diff changeset
36 $query->addParam('facet.date', $this->facet['field']);
015d06b10d37 initial
dwinter
parents:
diff changeset
37 $query->addParam('f.' . $this->facet['field'] . '.facet.date.start', $start);
015d06b10d37 initial
dwinter
parents:
diff changeset
38 $query->addParam('f.' . $this->facet['field'] . '.facet.date.end', $end);
015d06b10d37 initial
dwinter
parents:
diff changeset
39 $query->addParam('f.' . $this->facet['field'] . '.facet.date.gap', $gap);
015d06b10d37 initial
dwinter
parents:
diff changeset
40
015d06b10d37 initial
dwinter
parents:
diff changeset
41 // Adds "hard limit" parameter to prevent too many return values.
015d06b10d37 initial
dwinter
parents:
diff changeset
42 $settings = $this->adapter->getFacet($this->facet)->getSettings();
015d06b10d37 initial
dwinter
parents:
diff changeset
43 $limit = empty($settings->settings['hard_limit']) ? 20 : (int) $settings->settings['hard_limit'];
015d06b10d37 initial
dwinter
parents:
diff changeset
44 $query->addParam('f.' . $this->facet['field'] . '.facet.limit', $limit);
015d06b10d37 initial
dwinter
parents:
diff changeset
45
015d06b10d37 initial
dwinter
parents:
diff changeset
46 $active = $this->adapter->getActiveItems($this->facet);
015d06b10d37 initial
dwinter
parents:
diff changeset
47 // Date filters don't support OR operator.
015d06b10d37 initial
dwinter
parents:
diff changeset
48 foreach ($active as $value => $item) {
015d06b10d37 initial
dwinter
parents:
diff changeset
49 $query->addFilter($this->facet['field'], $value);
015d06b10d37 initial
dwinter
parents:
diff changeset
50 }
015d06b10d37 initial
dwinter
parents:
diff changeset
51 }
015d06b10d37 initial
dwinter
parents:
diff changeset
52
015d06b10d37 initial
dwinter
parents:
diff changeset
53 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
54 * Gets the range of dates we are using.
015d06b10d37 initial
dwinter
parents:
diff changeset
55 *
015d06b10d37 initial
dwinter
parents:
diff changeset
56 * @param DrupalSolrQueryInterface $query
015d06b10d37 initial
dwinter
parents:
diff changeset
57 * A SolrBaseQuery object.
015d06b10d37 initial
dwinter
parents:
diff changeset
58 *
015d06b10d37 initial
dwinter
parents:
diff changeset
59 * @return bool|array
015d06b10d37 initial
dwinter
parents:
diff changeset
60 * An array containing the gap and range information or false if not present
015d06b10d37 initial
dwinter
parents:
diff changeset
61 */
015d06b10d37 initial
dwinter
parents:
diff changeset
62 function getDateRange(DrupalSolrQueryInterface $query) {
015d06b10d37 initial
dwinter
parents:
diff changeset
63 $return = NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
64 $gap = NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
65
015d06b10d37 initial
dwinter
parents:
diff changeset
66 // Attempts to get next gap from passed date filters.
015d06b10d37 initial
dwinter
parents:
diff changeset
67 foreach ($this->adapter->getActiveItems($this->facet) as $item) {
015d06b10d37 initial
dwinter
parents:
diff changeset
68 if ($gap = facetapi_get_date_gap($item['start'], $item['end'])) {
015d06b10d37 initial
dwinter
parents:
diff changeset
69 $next_gap = facetapi_get_next_date_gap($gap, FACETAPI_DATE_SECOND);
015d06b10d37 initial
dwinter
parents:
diff changeset
70 if ($next_gap == $gap) {
015d06b10d37 initial
dwinter
parents:
diff changeset
71 $next_gap = NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
72 return NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
73 }
015d06b10d37 initial
dwinter
parents:
diff changeset
74 $return = array(
015d06b10d37 initial
dwinter
parents:
diff changeset
75 "{$item['start']}/$next_gap",
015d06b10d37 initial
dwinter
parents:
diff changeset
76 "{$item['end']}+1$next_gap/$next_gap",
015d06b10d37 initial
dwinter
parents:
diff changeset
77 "+1$next_gap",
015d06b10d37 initial
dwinter
parents:
diff changeset
78 );
015d06b10d37 initial
dwinter
parents:
diff changeset
79 }
015d06b10d37 initial
dwinter
parents:
diff changeset
80 }
015d06b10d37 initial
dwinter
parents:
diff changeset
81
015d06b10d37 initial
dwinter
parents:
diff changeset
82 // If no filters were passed, get default range.
015d06b10d37 initial
dwinter
parents:
diff changeset
83 if (NULL === $return) {
015d06b10d37 initial
dwinter
parents:
diff changeset
84
015d06b10d37 initial
dwinter
parents:
diff changeset
85 // Builds SQL that gets minimum and maximum values from node table.
015d06b10d37 initial
dwinter
parents:
diff changeset
86 $minimum = $maximum = FALSE;
015d06b10d37 initial
dwinter
parents:
diff changeset
87 if ($this->facet['min callback'] && is_callable($this->facet['min callback'])) {
015d06b10d37 initial
dwinter
parents:
diff changeset
88 $minimum = $this->facet['min callback']($this->facet);
015d06b10d37 initial
dwinter
parents:
diff changeset
89 }
015d06b10d37 initial
dwinter
parents:
diff changeset
90 if ($this->facet['max callback'] && is_callable($this->facet['max callback'])) {
015d06b10d37 initial
dwinter
parents:
diff changeset
91 $maximum = $this->facet['max callback']($this->facet);
015d06b10d37 initial
dwinter
parents:
diff changeset
92 }
015d06b10d37 initial
dwinter
parents:
diff changeset
93
015d06b10d37 initial
dwinter
parents:
diff changeset
94 // Gets the default gap.
015d06b10d37 initial
dwinter
parents:
diff changeset
95 //$gap = FACETAPI_DATE_YEAR;
015d06b10d37 initial
dwinter
parents:
diff changeset
96 if ($minimum && $maximum) {
015d06b10d37 initial
dwinter
parents:
diff changeset
97 $gap = facetapi_get_timestamp_gap($minimum, $maximum);
015d06b10d37 initial
dwinter
parents:
diff changeset
98 $minimum = facetapi_isodate($minimum, $gap);
015d06b10d37 initial
dwinter
parents:
diff changeset
99 $maximum = facetapi_isodate($maximum, $gap);
015d06b10d37 initial
dwinter
parents:
diff changeset
100 $return = array(
015d06b10d37 initial
dwinter
parents:
diff changeset
101 "$minimum/$gap",
015d06b10d37 initial
dwinter
parents:
diff changeset
102 "$maximum+1$gap/$gap",
015d06b10d37 initial
dwinter
parents:
diff changeset
103 "+1$gap",
015d06b10d37 initial
dwinter
parents:
diff changeset
104 );
015d06b10d37 initial
dwinter
parents:
diff changeset
105 }
015d06b10d37 initial
dwinter
parents:
diff changeset
106 }
015d06b10d37 initial
dwinter
parents:
diff changeset
107 // Returns the range information.
015d06b10d37 initial
dwinter
parents:
diff changeset
108 return $return;
015d06b10d37 initial
dwinter
parents:
diff changeset
109 }
015d06b10d37 initial
dwinter
parents:
diff changeset
110
015d06b10d37 initial
dwinter
parents:
diff changeset
111 /**
015d06b10d37 initial
dwinter
parents:
diff changeset
112 * Initializes the facet's build array.
015d06b10d37 initial
dwinter
parents:
diff changeset
113 *
015d06b10d37 initial
dwinter
parents:
diff changeset
114 * @return array
015d06b10d37 initial
dwinter
parents:
diff changeset
115 * The initialized render array.
015d06b10d37 initial
dwinter
parents:
diff changeset
116 */
015d06b10d37 initial
dwinter
parents:
diff changeset
117 public function build() {
015d06b10d37 initial
dwinter
parents:
diff changeset
118
015d06b10d37 initial
dwinter
parents:
diff changeset
119 // Initializes build and gets static response.
015d06b10d37 initial
dwinter
parents:
diff changeset
120 if (!$response = solrsearch_static_response_cache($this->adapter->getSearcher())) {
015d06b10d37 initial
dwinter
parents:
diff changeset
121 return array();
015d06b10d37 initial
dwinter
parents:
diff changeset
122 }
015d06b10d37 initial
dwinter
parents:
diff changeset
123 $build = array();
015d06b10d37 initial
dwinter
parents:
diff changeset
124
015d06b10d37 initial
dwinter
parents:
diff changeset
125 // Gets total number of documents matched in search.
015d06b10d37 initial
dwinter
parents:
diff changeset
126 $total = $response->response->numFound;
015d06b10d37 initial
dwinter
parents:
diff changeset
127
015d06b10d37 initial
dwinter
parents:
diff changeset
128 // Gets the active date facets, starts to builds the "parent - child"
015d06b10d37 initial
dwinter
parents:
diff changeset
129 // relationships.
015d06b10d37 initial
dwinter
parents:
diff changeset
130 $parent = NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
131 foreach ($this->adapter->getActiveItems($this->facet) as $value => $item) {
015d06b10d37 initial
dwinter
parents:
diff changeset
132 // Builds the raw facet "value", the count for selected items will be the
015d06b10d37 initial
dwinter
parents:
diff changeset
133 // total number of rows returned in the query.
015d06b10d37 initial
dwinter
parents:
diff changeset
134 $build[$value] = array('#count' => $total);
015d06b10d37 initial
dwinter
parents:
diff changeset
135
015d06b10d37 initial
dwinter
parents:
diff changeset
136 // If there is a previous item, there is a parent, uses a reference so the
015d06b10d37 initial
dwinter
parents:
diff changeset
137 // arrays are populated when they are updated.
015d06b10d37 initial
dwinter
parents:
diff changeset
138 if (NULL !== $parent) {
015d06b10d37 initial
dwinter
parents:
diff changeset
139 $build[$parent]['#item_children'][$value] = &$build[$value];
015d06b10d37 initial
dwinter
parents:
diff changeset
140 $build[$value]['#item_parents'][$parent] = $parent;
015d06b10d37 initial
dwinter
parents:
diff changeset
141 }
015d06b10d37 initial
dwinter
parents:
diff changeset
142
015d06b10d37 initial
dwinter
parents:
diff changeset
143 // Stores the last value iterated over.
015d06b10d37 initial
dwinter
parents:
diff changeset
144 $parent = $value;
015d06b10d37 initial
dwinter
parents:
diff changeset
145 }
015d06b10d37 initial
dwinter
parents:
diff changeset
146
015d06b10d37 initial
dwinter
parents:
diff changeset
147 // Gets raw facet data from the Solr server.
015d06b10d37 initial
dwinter
parents:
diff changeset
148 if (isset($response->facet_counts->facet_dates) && isset($response->facet_counts->facet_dates->{$this->facet['field']})) {
015d06b10d37 initial
dwinter
parents:
diff changeset
149 $raw_data = (array) $response->facet_counts->facet_dates->{$this->facet['field']};
015d06b10d37 initial
dwinter
parents:
diff changeset
150 }
015d06b10d37 initial
dwinter
parents:
diff changeset
151 else {
015d06b10d37 initial
dwinter
parents:
diff changeset
152 $raw_data = array();
015d06b10d37 initial
dwinter
parents:
diff changeset
153 }
015d06b10d37 initial
dwinter
parents:
diff changeset
154 //$end = (!empty($raw_data['end'])) ? $raw_data['end'] : '';
015d06b10d37 initial
dwinter
parents:
diff changeset
155 //$start = (!empty($raw_data['start'])) ? $raw_data['start'] : '';
015d06b10d37 initial
dwinter
parents:
diff changeset
156 $gap = (!empty($raw_data['gap'])) ? $raw_data['gap'] : '';
015d06b10d37 initial
dwinter
parents:
diff changeset
157
015d06b10d37 initial
dwinter
parents:
diff changeset
158 // We cannot list anything below a minute (range of 00 seconds till 59
015d06b10d37 initial
dwinter
parents:
diff changeset
159 // seconds. Milliseconds are not possible)
015d06b10d37 initial
dwinter
parents:
diff changeset
160 if ($gap != "+1SECOND") {
015d06b10d37 initial
dwinter
parents:
diff changeset
161 unset($raw_data['start']);
015d06b10d37 initial
dwinter
parents:
diff changeset
162 unset($raw_data['end']);
015d06b10d37 initial
dwinter
parents:
diff changeset
163 unset($raw_data['gap']);
015d06b10d37 initial
dwinter
parents:
diff changeset
164
015d06b10d37 initial
dwinter
parents:
diff changeset
165 // Treat each date facet as a range start, and use the next date facet
015d06b10d37 initial
dwinter
parents:
diff changeset
166 // as range end. Use 'end' for the final end.
015d06b10d37 initial
dwinter
parents:
diff changeset
167 $previous = NULL;
015d06b10d37 initial
dwinter
parents:
diff changeset
168
015d06b10d37 initial
dwinter
parents:
diff changeset
169 // Builds facet counts object used by the server.
015d06b10d37 initial
dwinter
parents:
diff changeset
170 foreach ($raw_data as $value => $count) {
015d06b10d37 initial
dwinter
parents:
diff changeset
171 if ($count) {
015d06b10d37 initial
dwinter
parents:
diff changeset
172 $from = $value;
015d06b10d37 initial
dwinter
parents:
diff changeset
173 $to = facetapi_isodate(strtotime($value . $gap));
015d06b10d37 initial
dwinter
parents:
diff changeset
174 $new_value = '[' . $from . ' TO ' . $to . ']';
015d06b10d37 initial
dwinter
parents:
diff changeset
175 $build[$new_value] = array('#count' => $count, '#active' => 0);
015d06b10d37 initial
dwinter
parents:
diff changeset
176 if (NULL !== $parent) {
015d06b10d37 initial
dwinter
parents:
diff changeset
177 $build[$parent]['#item_children'][$new_value] = &$build[$new_value];
015d06b10d37 initial
dwinter
parents:
diff changeset
178 $build[$new_value]['#item_parents'][$parent] = $parent;
015d06b10d37 initial
dwinter
parents:
diff changeset
179 }
015d06b10d37 initial
dwinter
parents:
diff changeset
180 }
015d06b10d37 initial
dwinter
parents:
diff changeset
181 }
015d06b10d37 initial
dwinter
parents:
diff changeset
182 }
015d06b10d37 initial
dwinter
parents:
diff changeset
183 return $build;
015d06b10d37 initial
dwinter
parents:
diff changeset
184 }
015d06b10d37 initial
dwinter
parents:
diff changeset
185 }