Commit 686b2b7a5a8a8bc7dc37c40a835b1f0b6fcde498
1 parent
fc3b3458
KTS-4214. Changed the behaviour of the search to allow multiple joins on a singl…
…e table when the document_fields_link table is involved - i.e. an AnyMetadata search. Fixed Search does not return any results if more than one metadata type is included in the search expression with an AND statement. Committed by: Paul Barrett Reviewed by: Megan Watson
Showing
2 changed files
with
42 additions
and
4 deletions
search2/search/expr.inc.php
| @@ -1079,6 +1079,7 @@ class SQLQueryBuilder implements QueryBuilder | @@ -1079,6 +1079,7 @@ class SQLQueryBuilder implements QueryBuilder | ||
| 1079 | if (array_key_exists($tablename, $this->used_tables)) | 1079 | if (array_key_exists($tablename, $this->used_tables)) |
| 1080 | { | 1080 | { |
| 1081 | $this->used_tables[$tablename]++; | 1081 | $this->used_tables[$tablename]++; |
| 1082 | + if (isset($expr->references)) ++$expr->references; | ||
| 1082 | } | 1083 | } |
| 1083 | } | 1084 | } |
| 1084 | } | 1085 | } |
| @@ -1244,7 +1245,18 @@ class SQLQueryBuilder implements QueryBuilder | @@ -1244,7 +1245,18 @@ class SQLQueryBuilder implements QueryBuilder | ||
| 1244 | } | 1245 | } |
| 1245 | if ($this->used_tables['document_fields_link'] > 0) | 1246 | if ($this->used_tables['document_fields_link'] > 0) |
| 1246 | { | 1247 | { |
| 1247 | - $sql .= ' LEFT JOIN document_fields_link pdfl ON dmv.id=pdfl.metadata_version_id ' . "\n"; | 1248 | + // NOTE this is a bit of a hack, maybe? or maybe it really is the best way? |
| 1249 | + // ...what about using the loop below which checks the expression | ||
| 1250 | + // for a join table rather than this up here? - otherwise this only | ||
| 1251 | + // affects this particular query type - then again maybe that's what we want... | ||
| 1252 | + for ($i = 0; $i < $this->used_tables['document_fields_link']; ++$i) | ||
| 1253 | + { | ||
| 1254 | + if ($i > 0) $counter = $i; | ||
| 1255 | + else $counter = ''; | ||
| 1256 | + | ||
| 1257 | + $sql .= ' LEFT JOIN document_fields_link pdfl' . $counter . ' ' | ||
| 1258 | + . 'ON dmv.id=pdfl' . $counter . '.metadata_version_id ' . "\n"; | ||
| 1259 | + } | ||
| 1248 | } | 1260 | } |
| 1249 | 1261 | ||
| 1250 | if ($this->used_tables['tag_words'] > 0) | 1262 | if ($this->used_tables['tag_words'] > 0) |
| @@ -1374,7 +1386,6 @@ class SQLQueryBuilder implements QueryBuilder | @@ -1374,7 +1386,6 @@ class SQLQueryBuilder implements QueryBuilder | ||
| 1374 | 1386 | ||
| 1375 | public function buildComplexQuery($expr) | 1387 | public function buildComplexQuery($expr) |
| 1376 | { | 1388 | { |
| 1377 | -// print "building complex \n\n"; | ||
| 1378 | $this->exploreExprs($expr); | 1389 | $this->exploreExprs($expr); |
| 1379 | 1390 | ||
| 1380 | $sql = $this->buildCoreSQL(); | 1391 | $sql = $this->buildCoreSQL(); |
| @@ -1396,7 +1407,6 @@ class SQLQueryBuilder implements QueryBuilder | @@ -1396,7 +1407,6 @@ class SQLQueryBuilder implements QueryBuilder | ||
| 1396 | 1407 | ||
| 1397 | public function buildSimpleQuery($op, $group) | 1408 | public function buildSimpleQuery($op, $group) |
| 1398 | { | 1409 | { |
| 1399 | -// print "building simple \n\n"; | ||
| 1400 | $this->exploreGroup($group); | 1410 | $this->exploreGroup($group); |
| 1401 | 1411 | ||
| 1402 | $sql = $this->buildCoreSQL(); | 1412 | $sql = $this->buildCoreSQL(); |
search2/search/fields/AnyMetadataField.inc.php
| @@ -40,7 +40,7 @@ | @@ -40,7 +40,7 @@ | ||
| 40 | class AnyMetadataField extends DBFieldExpr | 40 | class AnyMetadataField extends DBFieldExpr |
| 41 | { | 41 | { |
| 42 | public $general_op = ExprOp::CONTAINS; | 42 | public $general_op = ExprOp::CONTAINS; |
| 43 | - | 43 | + public $references = 0; |
| 44 | 44 | ||
| 45 | public function __construct() | 45 | public function __construct() |
| 46 | { | 46 | { |
| @@ -48,6 +48,34 @@ class AnyMetadataField extends DBFieldExpr | @@ -48,6 +48,34 @@ class AnyMetadataField extends DBFieldExpr | ||
| 48 | $this->setAlias('Metadata'); | 48 | $this->setAlias('Metadata'); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | + /* | ||
| 52 | + * Overridden function to adjust table alias in cases of | ||
| 53 | + * the document_fields_link table being included more than once | ||
| 54 | + * | ||
| 55 | + * NOTE this only works in conjunction with code in expr.inc.php which adds the left joins to the db query. | ||
| 56 | + * I don't like this and think we should look for a way to make the table joining more generic | ||
| 57 | + * such that it can be controlled via these classes and thereby contained as a unit. | ||
| 58 | + */ | ||
| 59 | + public function modifyName($name) | ||
| 60 | + { | ||
| 61 | + if ($this->references > 0) | ||
| 62 | + { | ||
| 63 | + static $count = 0; | ||
| 64 | + if ($count >= $this->references) | ||
| 65 | + { | ||
| 66 | + $count = 0; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + if ((($pos = strpos($name, '.')) !== false) && ($count != 0)) | ||
| 70 | + { | ||
| 71 | + $name = substr($name, 0, $pos) . $count . substr($name, $pos); | ||
| 72 | + } | ||
| 73 | + ++$count; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + return $name; | ||
| 77 | + } | ||
| 78 | + | ||
| 51 | public function getInputRequirements() | 79 | public function getInputRequirements() |
| 52 | { | 80 | { |
| 53 | return array('value'=>array('type'=>FieldInputType::TEXT)); | 81 | return array('value'=>array('type'=>FieldInputType::TEXT)); |