3 * A general crtieria class
5 * @author Roland Haeder <webmaster@ship-simu.org>
7 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
8 * @license GNU GPL 3.0 or any newer version
9 * @link http://www.ship-simu.org
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 class BaseCriteria extends BaseFrameworkSystem {
26 * Wrapper class name stored in config entry
28 private $wrapperConfigEntry = '';
33 private $criteria = array();
35 * Protected constructor
37 * @param $className Name of the class
40 protected function __construct ($className) {
41 // Call parent constructor
42 parent::__construct($className);
46 * Setter for wrapper class name
48 * @param $wrapperConfigEntry Configuration entry which hold the wrapper class' name
51 public final function setWrapperConfigEntry ($wrapperConfigEntry) {
52 $this->wrapperConfigEntry = (string) $wrapperConfigEntry;
56 * Getter for wrapper class name
58 * @return $wrapperConfigEntry Configuration entry which hold the wrapper class' name
60 public final function getWrapperConfigEntry () {
61 return $this->wrapperConfigEntry;
65 * Getter for criteria array
69 public final function getCriteriaArray () {
70 return $this->criteria;
74 * Add criteria, this method converts dashes to underscores because dashes
75 * are not valid for criteria keys.
77 * @param $criteriaKey Criteria key
78 * @param $criteriaValue Criteria value
81 public final function addCriteria ($criteriaKey, $criteriaValue) {
83 if (strpos($criteriaKey, 'my-') !== false) $this->debugBackTrace('criteriaKey=' . $criteriaKey);
84 //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CRITERIA: criteriaKey=' . $criteriaKey . ',criteriaValue=' . $criteriaValue);
87 $this->criteria[$this->convertDashesToUnderscores($criteriaKey)] = (string)$criteriaValue;
91 * Add configured criteria
93 * @param $criteriaKey Criteria key
94 * @param $configEntry Configuration entry
97 public final function addConfiguredCriteria ($criteriaKey, $configEntry) {
98 // Add the configuration entry as a criteria
99 $value = $this->getConfigInstance()->getConfigEntry($configEntry);
100 $this->addCriteria($criteriaKey, $value);
104 * Get criteria element or null if not found
106 * @param $criteriaKey The requested criteria key
107 * @return $value Whether the value of the critera or null
109 public function getCriteriaElemnent ($criteriaKey) {
110 // Convert dashes to underscore
111 $criteriaKey = $this->convertDashesToUnderscores($criteriaKey);
114 //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CRITERIA: criteriaKey=' . $criteriaKey . ',criteria()=' . count($this->criteria));
116 // Default is not found
119 // Is the criteria there?
120 if (isset($this->criteria[$criteriaKey])) {
122 $value = $this->criteria[$criteriaKey];
130 * Checks whether given array entry matches
132 * @param $entryArray Array with the entries to find
133 * @return $matches Whether the entry matches or not
135 public function ifEntryMatches (array $entryArray) {
136 // First nothing matches and nothing is counted
140 // Walk through all entries
141 foreach ($entryArray as $key => $entry) {
142 // Convert dashes to underscore
143 $key = $this->convertDashesToUnderscores($key);
145 // Then walk through all search criteria
146 foreach ($this->criteria as $criteriaKey => $criteriaValue) {
147 // Convert dashes to underscore
148 $criteriaKey = $this->convertDashesToUnderscores($criteriaKey);
150 // Is the element found and does it match?
151 if (($key == $criteriaKey) && ($criteriaValue == $entry)) {
152 // Then count this one up
158 // Now check if expected criteria counts match
159 $matches = ($counted == count($this->criteria));
166 * "Getter" for a cache key
168 * @param $onlyKeys Only use these keys for a cache key
169 * @return $cacheKey The key suitable for the cache system
171 public function getCacheKey ($onlyKeys = array()) {
172 // Initialize the key
175 // Now walk through all criterias
176 foreach ($this->criteria as $criteriaKey => $criteriaValue) {
177 // Convert dashes to underscore
178 $criteriaKey = $this->convertDashesToUnderscores($criteriaKey);
180 // Is the value in array or is $onlyKeys empty?
181 if ((isset($onlyKeys[$criteriaKey])) || (count($onlyKeys) == 0)) {
182 // Add the value URL encoded to avoid any trouble with special characters
183 $cacheKey .= sprintf("%s=%s;",
185 urlencode($criteriaValue)
190 // Remove last semicolon
191 $cacheKey = substr($cacheKey, 0, -1);
193 // Is the instance SearchCriteria?
194 if ($this instanceof SearchCriteria) {
195 // Check if 'limit' and 'skip' are in
196 if (((isset($onlyKeys['limit'])) && (isset($onlyKeys['skip']))) || (count($onlyKeys) == 0)) {
197 // Add limit and skip values
198 $cacheKey .= sprintf(";%%limit%%=%s;%%skip%%=%s",
205 // Return the cache key
210 * Count the criteria, e.g. useful to find out if a database query has no limitation (search criteria)
212 * @return $count Count of all criteria entries
214 public final function count () {
216 return count($this->criteria);