/**
  * 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;
 }
Example #2
0
 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;
 }