/** * Merge two null check expression trees by removing duplicate nodes. * * @param AbstractExpression $nullCheckExpTree1 First expression. * @param AbstractExpression $nullCheckExpTree2 Second expression. * * @return UnaryExpression or LogicalExpression */ private function _mergeNullableExpressionTrees($nullCheckExpTree1, $nullCheckExpTree2) { $this->_mapTable = array(); $this->_map($nullCheckExpTree1); $this->_map($nullCheckExpTree2); $expression = null; $isNullFunctionDescription = null; foreach ($this->_mapTable as $node) { if ($expression == null) { $expression = new UnaryExpression(new FunctionCallExpression(FunctionDescription::isNullCheckFunction($node->getType()), array($node)), ExpressionType::NOT_LOGICAL, new Boolean()); } else { $expression = new LogicalExpression($expression, new UnaryExpression(new FunctionCallExpression(FunctionDescription::isNullCheckFunction($node->getType()), array($node)), ExpressionType::NOT_LOGICAL, new Boolean()), ExpressionType::AND_LOGICAL); } } return $expression; }
/** * Function to create a nullable expression subtree for checking the * nullablilty of parent (and current poperty optionally) properties * * @param boolean $includeMe Boolean flag indicating whether to include null * check for this property along with parents * * @return AbstractExpression Instance of UnaryExpression, LogicalExpression * or Null * */ public function createNullableExpressionTree($includeMe) { $basePropertyExpression = $this; while ($basePropertyExpression != null && $basePropertyExpression->parent != null) { $basePropertyExpression = $basePropertyExpression->parent; } //This property is direct child of ResourceSet, no need to check //nullability for direct ResourceSet properties // ($c->CustomerID, $c->Order, $c->Address) unless $includeMe is true if ($basePropertyExpression == $this) { if ($includeMe) { return new UnaryExpression(new FunctionCallExpression(FunctionDescription::isNullCheckFunction($basePropertyExpression->getType()), array($basePropertyExpression)), ExpressionType::NOT_LOGICAL, new Boolean()); } return null; } //This property is a property of a complex type or resource reference //$c->Order->OrderID, $c->Address->LineNumber, // $c->complex1->complex2->primitveVar //($c->Order != null),($c->Address != null), // (($c->complex1 != null) && ($c->complex1->complex2 != null)) $expression = new UnaryExpression(new FunctionCallExpression(FunctionDescription::isNullCheckFunction($basePropertyExpression->getType()), array($basePropertyExpression)), ExpressionType::NOT_LOGICAL, new Boolean()); while ($basePropertyExpression->getChild() != null && $basePropertyExpression->getChild()->getChild() != null) { $basePropertyExpression = $basePropertyExpression->getChild(); $expression2 = new UnaryExpression(new FunctionCallExpression(FunctionDescription::isNullCheckFunction($basePropertyExpression->getType()), array($basePropertyExpression)), ExpressionType::NOT_LOGICAL, new Boolean()); $expression = new LogicalExpression($expression, $expression2, ExpressionType::AND_LOGICAL); } if ($includeMe) { $basePropertyExpression = $basePropertyExpression->getChild(); $expression2 = new UnaryExpression(new FunctionCallExpression(FunctionDescription::isNullCheckFunction($basePropertyExpression->getType()), array($basePropertyExpression)), ExpressionType::NOT_LOGICAL, new Boolean()); $expression = new LogicalExpression($expression, $expression2, ExpressionType::AND_LOGICAL); } return $expression; }