/** * Short description of method createRecursiveExpression * * @access public * @author firstname and lastname of author, <*****@*****.**> * @param Expression exp1 * @param Expression exp2 * @param Resource operator * @return core_kernel_rules_Expression */ public static function createRecursiveExpression(core_kernel_rules_Expression $exp1, core_kernel_rules_Expression $exp2, core_kernel_classes_Resource $operator) { $returnValue = null; if ($exp1 == null || $exp2 == null || $operator == null) { var_dump($exp1, $exp2, $operator); throw new common_Exception('paramaters could not be null'); } $expressionClass = new core_kernel_classes_Class(CLASS_EXPRESSION, __METHOD__); $label = 'Expression : ' . $exp1->getLabel() . ' ' . $operator->getLabel() . ' ' . $exp2->getLabel(); $comment = 'Expression : ' . $exp1->getUri() . ' ' . $operator->getUri() . ' ' . $exp2->getUri(); $expressionInst = core_kernel_classes_ResourceFactory::create($expressionClass, $label, $comment); $terminalExpressionProperty = new core_kernel_classes_Property(PROPERTY_TERMINAL_EXPRESSION, __METHOD__); $logicalOperatorProperty = new core_kernel_classes_Property(PROPERTY_HASLOGICALOPERATOR, __METHOD__); $firstExpressionProperty = new core_kernel_classes_Property(PROPERTY_FIRST_EXPRESSION, __METHOD__); $secondExpressionProperty = new core_kernel_classes_Property(PROPERTY_SECOND_EXPRESSION, __METHOD__); $returnValue = new core_kernel_rules_Expression($expressionInst->getUri()); $returnValue->debug = __METHOD__; $returnValue->setPropertyValue($terminalExpressionProperty, INSTANCE_EMPTY_TERM_URI); $returnValue->setPropertyValue($firstExpressionProperty, $exp1->getUri()); $returnValue->setPropertyValue($secondExpressionProperty, $exp2->getUri()); $returnValue->setPropertyValue($logicalOperatorProperty, $operator->getUri()); return $returnValue; }
public function testEvaluate() { $constantResource1 = core_kernel_rules_TermFactory::createConst('test1'); $constantResource2 = core_kernel_rules_TermFactory::createConst('test2'); $constantResource14 = core_kernel_rules_TermFactory::createConst('14'); $constantResource12 = core_kernel_rules_TermFactory::createConst('12'); $constantResource12b = core_kernel_rules_TermFactory::createConst('12'); $true = new core_kernel_rules_Expression(INSTANCE_EXPRESSION_TRUE); $this->assertTrue($true->evaluate()); $false = new core_kernel_rules_Expression(INSTANCE_EXPRESSION_FALSE); $this->assertFalse($false->evaluate()); $terminalExpression1 = core_kernel_rules_ExpressionFactory::createTerminalExpression($constantResource1); $terminalExpression2 = core_kernel_rules_ExpressionFactory::createTerminalExpression($constantResource2); $terminalExpression14 = core_kernel_rules_ExpressionFactory::createTerminalExpression($constantResource14); $terminalExpression12 = core_kernel_rules_ExpressionFactory::createTerminalExpression($constantResource12); $terminalExpression12b = core_kernel_rules_ExpressionFactory::createTerminalExpression($constantResource12b); // test1 == test2 $equalsOperator = new core_kernel_classes_Resource(INSTANCE_EQUALS_OPERATOR_URI); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression1, $terminalExpression2, $equalsOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // 12 == 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression12b, $equalsOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // test1 != test2 $diffOperator = new core_kernel_classes_Resource(INSTANCE_DIFFERENT_OPERATOR_URI); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression1, $terminalExpression2, $diffOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // 12 != 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression12b, $diffOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // 14 <= 12 $infEqOperator = new core_kernel_classes_Resource(INSTANCE_INF_EQ_OPERATOR_URI); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression14, $terminalExpression12, $infEqOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); //12 <= 14 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression14, $infEqOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); //12 <= 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression12b, $infEqOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // 14 >= 12 $supEqOperator = new core_kernel_classes_Resource(INSTANCE_SUP_EQ_OPERATOR_URI); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression14, $terminalExpression12, $supEqOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); //12 >= 14 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression14, $supEqOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); //12 >= 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression12b, $supEqOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // 14 < 12 $infOperator = new core_kernel_classes_Resource(INSTANCE_INF_OPERATOR_URI); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression14, $terminalExpression12, $infOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); //12 < 14 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression14, $infOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); //12 < 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression12b, $infOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // 14 > 12 $supOperator = new core_kernel_classes_Resource(INSTANCE_SUP_OPERATOR_URI); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression14, $terminalExpression12, $supOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); //12 > 14 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression14, $supOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); //12 > 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression12b, $supOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // trueExpression => 12 < 14 $trueExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression12, $terminalExpression14, $infOperator); //falseExpression => test1 == test2 $falseExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression1, $terminalExpression2, $equalsOperator); // trueExpression2 => test1 != test2 $trueExpression2 = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression1, $terminalExpression2, $diffOperator); //falseExpression2 => 14 < 12 $falseExpression2 = core_kernel_rules_ExpressionFactory::createRecursiveExpression($terminalExpression14, $terminalExpression12, $infOperator); // 12 < 14 AND test1 == test2 $andOperator = new core_kernel_classes_Resource(INSTANCE_AND_OPERATOR); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($trueExpression, $falseExpression, $andOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // 12 < 14 AND test1 != test2 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($trueExpression, $trueExpression2, $andOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // 12 < 14 OR test1 == test2 $orOperator = new core_kernel_classes_Resource(INSTANCE_OR_OPERATOR); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($trueExpression, $falseExpression, $orOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // 12 < 14 OR test1 != test2 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($trueExpression, $trueExpression2, $orOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // test1 == test2 OR 12 < 14 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($falseExpression, $trueExpression, $orOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); // test1 == test2 OR 14 < 12 $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($falseExpression, $falseExpression2, $orOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // (test1 == test2 OR 14 < 12) AND (12 < 14 OR test1 == test2) $finalExpression1 = core_kernel_rules_ExpressionFactory::createRecursiveExpression($falseExpression, $falseExpression2, $orOperator); $finalExpression2 = core_kernel_rules_ExpressionFactory::createRecursiveExpression($trueExpression, $falseExpression, $orOperator); $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($finalExpression1, $finalExpression2, $andOperator); $this->assertFalse($finalExpression->evaluate()); $finalExpression->delete(); // (test1 == test2 OR 14 < 12) OR (12 < 14 OR test1 == test2) $finalExpression = core_kernel_rules_ExpressionFactory::createRecursiveExpression($finalExpression1, $finalExpression2, $orOperator); $this->assertTrue($finalExpression->evaluate()); $finalExpression->delete(); $finalExpression1->delete(); $finalExpression2->delete(); $constantResource1->delete(); $constantResource2->delete(); $constantResource12->delete(); $constantResource12b->delete(); $terminalExpression1->delete(); $terminalExpression2->delete(); $terminalExpression12->delete(); $terminalExpression12b->delete(); $terminalExpression14->delete(); $trueExpression->delete(); $falseExpression->delete(); $trueExpression2->delete(); $falseExpression2->delete(); }
/** * Makes the condition persistence, by saving it in an Expression * * @throws Exception * @return core_kernel_rules_Expression */ public function import() { /* move this to constants.php */ //create an instance of expression $expressionClass = new core_kernel_classes_Class(CLASS_EXPRESSION, __METHOD__); $firstExpressionProperty = new core_kernel_classes_Property(PROPERTY_FIRST_EXPRESSION, __METHOD__); $secondExpressionProperty = new core_kernel_classes_Property(PROPERTY_SECOND_EXPRESSION, __METHOD__); $logicalOperatorProperty = new core_kernel_classes_Property(PROPERTY_HASLOGICALOPERATOR, __METHOD__); $terminalExpressionProperty = new core_kernel_classes_Property(PROPERTY_TERMINAL_EXPRESSION, __METHOD__); $termValueProperty = new core_kernel_classes_Property(PROPERTY_TERM_VALUE, __METHOD__); //check if it is a terminal expression , do not create subExpression //we enter recursive case if there are subconditions defined //the operator value could be either AND OR, (we have then two subconditions ) if (sizeOf($this->subConditionsList) > 1) { $expressionInstance = $expressionClass->createInstance($this, __(" generated by Condition Descriptor on ") . date(DATE_ISO8601)); //creates the first sub expression //call recursively for the first subcondition $firstExpression = $this->subConditionsList[0]->import(); //link it with the expression $expressionInstance->setPropertyValue($firstExpressionProperty, $firstExpression->getUri()); //creates the second subexpression //call recursively for the second subcondition $secondExpression = $this->subConditionsList[1]->import(); //link it with the expression $expressionInstance->setPropertyValue($secondExpressionProperty, $secondExpression->getUri()); //call recursively for the second subcondition //defines the operator type switch (strtoupper($this->bool)) { case "AND": $operator = INSTANCE_AND_OPERATOR; break; case "OR": $operator = INSTANCE_OR_OPERATOR; break; case "NOT": $operator = INSTANCE_NOT_OPERATOR; break; //NAND //NAND default: $operator = INSTANCE_OR_OPERATOR; break; } $expressionInstance->setPropertyValue($logicalOperatorProperty, $operator); $expressionInstance->setPropertyValue($terminalExpressionProperty, INSTANCE_EMPTY_TERM_URI); } else { //analyse left and right part and call the right import function to get the right terminal term (SPX, const, or operation) switch ($this->leftPartType) { //if left part is a variable , creates a term -> SPX case "variable": $leftTerm = $this->importTermSPX($this->leftPart); break; case "constant": $leftTerm = $this->importTermConstant($this->leftPart); break; case "aroperation": //recursive call on left part if ($this->leftPart instanceof ConditionDescriptor) { $leftTerm = $this->leftPart->importTermOperation(); } break; default: } //if right part is a constant switch ($this->rightPartType) { case "variable": $rightTerm = $this->importTermSPX($this->rightPart); break; case "constant": $rightTerm = $this->importTermConstant($this->rightPart); break; case "aroperation": //recursive call on right part if ($this->rightPart instanceof ConditionDescriptor) { $rightTerm = $this->rightPart->importTermOperation(); } break; default: } $expressionClass = new core_kernel_classes_Class(CLASS_EXPRESSION, __METHOD__); $leftExpression = $expressionClass->createInstance("Left Expr:" . $this->leftPart, __(" generated by Condition Descriptor on ") . date(DATE_ISO8601)); $rightExpression = $expressionClass->createInstance("Right Expr:" . $this->rightPart, __(" generated by Condition Descriptor on ") . date(DATE_ISO8601)); $leftExpression->setPropertyValue($terminalExpressionProperty, $leftTerm->getUri()); $leftExpression->setPropertyValue($logicalOperatorProperty, INSTANCE_EXISTS_OPERATOR_URI); //unary operator if (isset($rightTerm)) { $rightExpression->setPropertyValue($terminalExpressionProperty, $rightTerm->getUri()); $rightExpression->setPropertyValue($logicalOperatorProperty, INSTANCE_EXISTS_OPERATOR_URI); } $expressionInstance = $expressionClass->createInstance($this, __(" generated by Condition Descriptor on ") . date(DATE_ISO8601)); $expressionInstance = new core_kernel_rules_Expression($expressionInstance); //creates the term and link it with the expressioninstance $expressionInstance->setPropertyValue($firstExpressionProperty, $leftExpression->getUri()); //unary operator if (isset($rightExpression)) { $expressionInstance->setPropertyValue($secondExpressionProperty, $rightExpression->getUri()); } $expressionInstance->setPropertyValue($terminalExpressionProperty, INSTANCE_EMPTY_TERM_URI); switch ($this->cmp) { case 'equal': $expressionInstance->setPropertyValue($logicalOperatorProperty, INSTANCE_EQUALS_OPERATOR_URI); break; case 'notEqual': $expressionInstance->setPropertyValue($logicalOperatorProperty, INSTANCE_DIFFERENT_OPERATOR_URI); break; case 'greaterEqual': $expressionInstance->setPropertyValue($logicalOperatorProperty, INSTANCE_SUP_EQ_OPERATOR_URI); break; case 'lessEqual': $expressionInstance->setPropertyValue($logicalOperatorProperty, INSTANCE_INF_EQ_OPERATOR_URI); break; case 'greater': $expressionInstance->setPropertyValue($logicalOperatorProperty, INSTANCE_SUP_OPERATOR_URI); break; case 'less': $expressionInstance->setPropertyValue($logicalOperatorProperty, INSTANCE_INF_OPERATOR_URI); break; case 'exists': trigger_error("exists not implemented yet"); case 'answered': trigger_error("answered not implemented yet"); default: throw new Exception("\n[" . $this->cmp . "] in " . $this . " is not implemented yet \n"); } } //returns the instance of expression return $expressionInstance; }