Преглед на файлове

OQL enhancement: continuation... (bug fix with a query on object history)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3507 a333f486-631f-4898-b8df-5754b55c2be0
romainq преди 10 години
родител
ревизия
a80cf12522
променени са 1 файла, в които са добавени 17 реда и са изтрити 10 реда
  1. 17 10
      core/metamodel.class.php

+ 17 - 10
core/metamodel.class.php

@@ -3098,6 +3098,23 @@ abstract class MetaModel
 //echo "<p><b>ExtAttr2: $sTargetAlias.$sAttCode to $sKeyClassAlias.$sRemoteAttExpr (class: $sKeyClass)</b></p>\n";
 								}
 							}
+
+							if ($oKeyAttDef instanceof AttributeObjectKey)
+							{
+								// Add the condition: `$sTargetAlias`.$sClassAttCode IN (subclasses of $sKeyClass')
+								$sClassAttCode = $oKeyAttDef->Get('class_attcode');
+								$oClassAttDef = self::GetAttributeDef($sTargetClass, $sClassAttCode);
+								foreach ($oClassAttDef->GetSQLExpressions() as $sColID => $sSQLExpr)
+								{
+									$aTranslateNow[$sTargetAlias][$sClassAttCode.$sColId] = new FieldExpressionResolved($sSQLExpr, $sTableAlias);
+								}
+
+								$oClassListExpr = ListExpression::FromScalars(self::EnumChildClasses($sKeyClass, ENUM_CHILD_CLASSES_ALL));
+								$oClassExpr = new FieldExpression($sClassAttCode, $sTargetAlias);
+								$oClassRestriction = new BinaryExpression($oClassExpr, 'IN', $oClassListExpr);
+								$oBuild->m_oQBExpressions->AddCondition($oClassRestriction);
+							}
+
 							// Translate prior to recursing
 							//
 //echo "<p>oQBExpr ".__LINE__.": <pre>\n".print_r($oBuild->m_oQBExpressions, true)."\n".print_r($aTranslateNow, true)."</pre></p>\n";
@@ -3119,16 +3136,6 @@ abstract class MetaModel
 							$sLocalKeyField = current($aCols); // get the first column for an external key
 			
 							self::DbgTrace("External key $sKeyAttCode, Join on $sLocalKeyField = $sExternalKeyField");
-							if ($oKeyAttDef instanceof AttributeObjectKey)
-							{
-								$sClassAttCode = $oKeyAttDef->Get('class_attcode');
-
-								// Add the condition: `$sTargetAlias`.$sClassAttCode IN (subclasses of $sKeyClass')
-								$oClassListExpr = ListExpression::FromScalars(self::EnumChildClasses($sKeyClass, ENUM_CHILD_CLASSES_ALL));
-								$oClassExpr = new FieldExpression($sClassAttCode, $sTargetAlias);
-								$oClassRestriction = new BinaryExpression($oClassExpr, 'IN', $oClassListExpr);
-								$oBuild->m_oQBExpressions->AddCondition($oClassRestriction);
-							}
 							if ($oKeyAttDef->IsNullAllowed())
 							{
 								$oSelectBase->AddLeftJoin($oSelectExtKey, $sLocalKeyField, $sExternalKeyField, $sExternalKeyTable);