uid = $uid; $this->survey = $survey; $this->respondent = $respondent; $this->answers = $answers; } /** * function evaluate() * evaluates the references of survey, respondent and answers. */ public function evaluate() { if(is_string($this->survey)) { $result = Survey::get(array("uid" => $this->survey)); if(!isset($result[0])) return false; $this->survey = $result[0]; } if(is_string($this->respondent)) { $result = Respondent::get(array("uid" => $this->respondent)); if(!isset($result[0])) return false; $this->respondent = $result[0]; } if(!empty($this->answers) && is_string($this->answers[0])) { $newanswers = array(); foreach($this->answers as $answer) { $result = Answer::get(array("uid" => $answer)); if(!isset($result[0])) return false; $newanswers[] = $result[0]; } $this->answers = $newanswers; } return true; } /** * function save() * Saves the current object into the database. */ public function save() { //If evaluation fails, some references are incorrect. //We shouldn't save in this case. Instead - let the user know. This function returns false if the evaluation has failed. //TODO: Decide how to fix invalid references graciously. if(!$this->evaluate()) return false; //Ensure the required folder exists. if(!is_dir('data/results/')) mkdir('data/results/'); $model = ResearchToolObject::load(AnswerSet::$filename); $resourceAnswerSet = new Resource(ANSWERSET . '/' . $this->uid); //Remove the old value stored with the given id $model->subtract($model->find($resourceAnswerSet, null, null)); //Set the new values $resourceAnswerSetType = new Resource(ANSWERSET); $predicateRType = new Resource(RTYPE); $model->add(new Statement($resourceAnswerSet, $predicateRType, $resourceAnswerSetType)); $answerSetId = new Literal($this->uid); $predicateId = new Resource(UID); $model->add(new Statement($resourceAnswerSet, $predicateId, $answerSetId)); $surveyId = new Literal($this->survey->uid); $predicateSurvey = new Resource(FOR_SURVEY); $model->add(new Statement($resourceAnswerSet, $predicateSurvey, $surveyId)); $respondentId = new Literal($this->respondent->uid); $predicateRespondent = new Resource(BY_RESPONDENT); $model->add(new Statement($resourceAnswerSet, $predicateRespondent, $respondentId)); if(isset($this->answers)) { foreach($this->answers as $answer) { $answerId = new Literal($answer->uid); $predicateAnswer = new Resource(GIVEN_ANSWER); $model->add(new Statement($resourceAnswerSet, $predicateAnswer, $answerId)); } } $model->saveAs(AnswerSet::$filename, 'rdf'); return true; } /** * function get() * @param type $arguments : An array having one ore more of the following elements: * 'uid', 'survey', 'respondent', 'answers'. */ public static function get($arguments) { $model = ResearchToolObject::load(AnswerSet::$filename); //Build the query string $querystring = ' PREFIX predicates: <' . SURVEYTOOL_PREDICATES_NAMESPACE . '> PREFIX resources: <' . SURVEYTOOL_RESOURCES_NAMESPACE . '> SELECT DISTINCT ?uid, ?for_survey, ?by_respondent WHERE { _answerset predicates:resource_type resources:answerset ; predicates:uid ?uid ; predicates:for_survey ?for_survey ; predicates:by_respondent ?by_respondent ; ' . ResearchToolObject::createArguments($arguments) . ' }'; //Query the model $results = $model->sparqlQuery($querystring); $answerSets = array(); if(!empty($results)) { foreach($results as $result) { $survey = $result['?for_survey']->label; $respondent = $result['?by_respondent']->label; $answers = AnswerSet::getAnswers($model, $result['?uid']->label); $answerSets[] = new AnswerSet($result['?uid']->label, $survey, $respondent, $answers); } } return $answerSets; } /** * function getAnswers() * @param type $uid : the uid for which the answers should be retrieved. */ private static function getAnswers($model, $uid) { $result = $model->findRegex("[(".$uid.")]", "[(given_answer)]", null); $iterator = $result->getStatementIterator(); $answers = array(); while($iterator->hasNext()) { $element = $iterator->next(); $answers[] = $element->getLabelObject(); } return $answers; } }