Details
-
Bug
-
Resolution: Unresolved
-
Medium
-
None
-
2011.10, 2011.11, 2011.12
-
None
-
Operating System: Fedora 14 Linux
PHP Version: 5.3.8
Database and version: Community Project 2011.8
Browser (and version): Any
Description
If you add more than one AttributeFilter to the $subTreeParameters the resulting SQL will not find any results.
$subTreeParameters['AttributeFilter'] = array('or', array('format/show_in_program', '=', 1), array('redirect/show_in_program', '=', 1)); $SourceNodeID = 2; $result = eZContentObjectTreeNode::subTreeByNodeID( $subTreeParameters, $SourceNodeID );
The search for each single filter works and is expected that the combined 'or' search should include results form both separate queries.
The reason for this bug is that createAttributeFilterSQLStrings() creates an inner join of two ezcontentobject_attribute tables (as a1 and a2).
FROM ... ezcontentobject_attribute a1, ezcontentobject_attribute a2, ... WHERE ezcontentobject_tree.path_string LIKE '/1/2/75/%' AND a1.contentobject_id = ezcontentobject.id AND a1.contentclassattribute_id = 632 AND a1.version = ezcontentobject_name.content_version AND ( a1.language_id & ezcontentobject.language_mask > 0 AND ( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a1.language_id ) ) & 1 ) + (( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a1.language_id ) ) & 2 )) < ( a1.language_id & 1 ) + (( a1.language_id & 2 )) ) AND a2.contentobject_id = ezcontentobject.id AND a2.contentclassattribute_id = 640 AND a2.version = ezcontentobject_name.content_version AND ( a2.language_id & ezcontentobject.language_mask > 0 AND ( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a2.language_id ) ) & 1 ) + (( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a2.language_id ) ) & 2 )) < ( a2.language_id & 1 ) + (( a2.language_id & 2 )) ) AND ( a1.sort_key_int = '1' OR a2.sort_key_int = '1' )
A solution would be to use only one joined table ezcontentobject_attribute 'a' and to put all a1 WHERE clauses in parentheses. Do the same with the a2 clauses and combine both blocks with one OR.
FROM ... ezcontentobject_attribute a1, ... WHERE ezcontentobject_tree.path_string LIKE '/1/2/75/%' AND (a1.contentobject_id = ezcontentobject.id AND a1.contentclassattribute_id = 632 AND a1.version = ezcontentobject_name.content_version AND (( a1.language_id & ezcontentobject.language_mask > 0 AND ( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a1.language_id ) ) & 1 ) + (( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a1.language_id ) ) & 2 )) < ( a1.language_id & 1 ) + (( a1.language_id & 2 )) )) OR (a1.contentobject_id = ezcontentobject.id AND a1.contentclassattribute_id = 640 AND a1.version = ezcontentobject_name.content_version AND ( a1.language_id & ezcontentobject.language_mask > 0 AND ( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a1.language_id ) ) & 1 ) + (( ( ezcontentobject.language_mask - ( ezcontentobject.language_mask & a1.language_id ) ) & 2 )) < ( a1.language_id & 1 ) + (( a1.language_id & 2 )) ))) AND ( a1.sort_key_int = '1' OR a1.sort_key_int = '1' )
You also could use two tables a1 and a2 and a LEFT JOIN.
Steps to reproduce
$subTreeParameters['AttributeFilter'] = array('or', array('format/show_in_program', '=', 1), array('redirect/show_in_program', '=', 1)); $SourceNodeID = 2; $result = eZContentObjectTreeNode::subTreeByNodeID( $subTreeParameters, $SourceNodeID );