|
|
@@ -979,6 +979,8 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface
|
|
|
$sortAsc = SORT_ASC;
|
|
|
$sortNum = SORT_NUMERIC;
|
|
|
|
|
|
+ $sortFieldValues = array();
|
|
|
+
|
|
|
require_once 'Zend/Search/Lucene/Exception.php';
|
|
|
for ($count = 1; $count < count($argList); $count++) {
|
|
|
$fieldName = $argList[$count];
|
|
|
@@ -988,29 +990,35 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface
|
|
|
}
|
|
|
|
|
|
if (strtolower($fieldName) == 'score') {
|
|
|
- $sortArgs[] = $scores;
|
|
|
+ $sortArgs[] = &$scores;
|
|
|
} else {
|
|
|
if (!in_array($fieldName, $fieldNames)) {
|
|
|
throw new Zend_Search_Lucene_Exception('Wrong field name.');
|
|
|
}
|
|
|
|
|
|
- $valuesArray = array();
|
|
|
- foreach ($hits as $hit) {
|
|
|
- try {
|
|
|
- $value = $hit->getDocument()->getFieldValue($fieldName);
|
|
|
- } catch (Zend_Search_Lucene_Exception $e) {
|
|
|
- if (strpos($e->getMessage(), 'not found') === false) {
|
|
|
- throw new Zend_Search_Lucene_Exception($e->getMessage(), $e->getCode(), $e);
|
|
|
- } else {
|
|
|
- $value = null;
|
|
|
+ if (!isset($sortFieldValues[$fieldName])) {
|
|
|
+ $valuesArray = array();
|
|
|
+ foreach ($hits as $hit) {
|
|
|
+ try {
|
|
|
+ $value = $hit->getDocument()->getFieldValue($fieldName);
|
|
|
+ } catch (Zend_Search_Lucene_Exception $e) {
|
|
|
+ if (strpos($e->getMessage(), 'not found') === false) {
|
|
|
+ throw new Zend_Search_Lucene_Exception($e->getMessage(), $e->getCode(), $e);
|
|
|
+ } else {
|
|
|
+ $value = null;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ $valuesArray[] = $value;
|
|
|
}
|
|
|
|
|
|
- $valuesArray[] = $value;
|
|
|
+ // Collect loaded values in $sortFieldValues
|
|
|
+ // Required for PHP 5.3 which translates references into values when source
|
|
|
+ // variable is destroyed
|
|
|
+ $sortFieldValues[$fieldName] = $valuesArray;
|
|
|
}
|
|
|
|
|
|
- $sortArgs[] = &$valuesArray;
|
|
|
- unset($valuesArray);
|
|
|
+ $sortArgs[] = &$sortFieldValues[$fieldName];
|
|
|
}
|
|
|
|
|
|
if ($count + 1 < count($argList) && is_integer($argList[$count+1])) {
|