source: Dev/branches/jos-branch/server/classes/models/SurveyInstance.php @ 268

Last change on this file since 268 was 268, checked in by jkraaijeveld, 13 years ago

Implemented SurveyInstance?

File size: 8.4 KB
Line 
1<?php
2require_once 'rdfConstants.php';
3include(RDFAPI_INCLUDE_DIR . "RDFAPI.php");
4/**
5 * Description of SurveyInstance
6 *
7 * @author jkraaijeveld
8 */
9class SurveyInstance extends ResearchToolObject{
10    public static $filename = 'data/surveys/surveyinstances.rdf';
11   
12    public $survey;
13    public $starttime;
14    public $endtime;
15    public $open;
16    public $presetanswers;
17    public $answersets;
18
19    /**
20     * Constructor for a SurveyInstance object
21     * @param type $uid: The UID of the survey instance object.
22     * @param type $starttime: The starttime of the survey round.
23     * @param type $endtime: The endtime of the survey round.
24     * @param type $open: A boolean to specify whether the survey is open.
25     * @param type $presetanswers: A list of answers which are preset for everyone doing the survey.
26     * @param type $answersets: A list of answersets.
27     */
28    public function __construct($uid = null, $survey = null, $starttime = null, $endtime = null, $open = false, $presetanswers = null, $answersets = null)
29    {
30        if(!isset($uid))
31        {
32                $uid = md5(uniqid(rand(), true));
33        }
34
35        $this->uid = $uid;
36        $this->survey = $survey;
37        $this->starttime = $starttime;
38        $this->endtime = $endtime;
39        $this->open = $open;
40        $this->presetanswers = $presetanswers;
41        $this->answersets = $answersets;
42    }
43
44    /**
45     * function evaluate()
46     * Evaluates the references in this object
47     */
48    public function evaluate()
49    {
50        if(is_string($this->survey))
51        {
52            $result = Survey::get(array("uid" => $this->survey));
53            if(!isset($result[0]))
54            {
55                return false;
56            }
57            $this->survey = $result[0];
58        }
59       
60        /* Check if all preset answers exist */
61        if(!empty($this->presetanswers) && is_string($this->presetanswers[0]))
62        {
63                $newPresets = array();
64                foreach($this->presetanswers as $answer)
65                {
66                        $result = Answer::get(array("uid" => $answer));
67                        if(!isset($result[0]))
68                                return false;
69                        $newPresets[] = $result[0];
70                }
71                $this->presetanswers = $newPresets;
72        }
73
74        /* Check if all answersets exist */
75        if(!empty($this->answersets) && is_string($this->answersets[0]))
76        {
77                $newAnswerSets = array();
78                foreach($this->answersets as $answerSet)
79                {
80                        $result = AnswerSet::get(array("uid" => $answerSet));
81                        if(!isset($result[0]))
82                        {
83                                return false;
84                        }
85                        $newAnswerSets[] = $result[0];
86                }
87                $this->answersets = $newAnswerSets;
88        }
89        return true;
90    }
91
92    /**
93     * function save()
94     * Saves the current object into the database.
95     */
96    public function save()
97    {
98        //If evaluation fails, some references are incorrect. We shouldn't save in this case.
99        //TODO: Decide how to fix invalid references graciously.
100        if(!$this->evaluate())
101                throw new Exception('Evaluation failed.');
102
103        //Ensure the required folder exists.
104        if(!is_dir('data/surveys/'))
105                mkdir('data/surveys/');
106
107        $model = ResearchToolObject::load(SurveyInstance::$filename);
108
109        $resourceSI = new Resource(SURVEYINSTANCE . '/' . $this->uid);
110        //Remove the old value stored with the given id
111        $model->subtract($model->find($resourceSI, null, null));
112
113        //Set the new values
114        $resourceSIType = new Resource(SURVEYINSTANCE);
115        $predicateRType = new Resource(RTYPE);
116        $model->add(new Statement($resourceSI, $predicateRType, $resourceSIType));
117
118        $SIID = new Literal($this->uid);
119        $predicateId = new Resource(UID);
120        $model->add(new Statement($resourceSI, $predicateId, $SIID));
121       
122        $SISurvey = new Literal($this->survey->uid);
123        $predicateSurvey = new Resource(OF_SURVEY);
124        $model->add(new Statement($resourceSI, $predicateSurvey, $SISurvey));
125
126        $SIStartTime = new Literal($this->starttime->getTimestamp());
127        $predicateStartTime = new Resource(STARTTIME);
128        $model->add(new Statement($resourceSI, $predicateStartTime, $SIStartTime));
129
130        $SIEndTime = new Literal($this->endtime->getTimestamp());
131        $predicateEndTime = new Resource(ENDTIME);
132        $model->add(new Statement($resourceSI, $predicateEndTime, $SIEndTime));
133
134        $SIOpen = new Literal($this->open);
135        $predicateOpen = new Resource(OPEN);
136        $model->add(new Statement($resourceSI, $predicateOpen, $SIOpen));
137
138        if(isset($this->presetanswers))
139        {
140                foreach($this->presetanswers as $answer)
141                {
142                        $answerId = new Literal($answer->uid);
143                        $predicateAnswer = new Resource(PRESET_ANSWER);
144                        $model->add(new Statement($resourceSI, $predicateAnswer, $answerId));
145                }
146        }
147
148        if(isset($this->answersets))
149        {
150                foreach($this->answersets as $answer)
151                {
152                        $answerSetId = new Literal($answer->uid);
153                        $predicateAnswerSet = new Resource(HAS_ANSWERSET);
154                        $model->add(new Statement($resourceSI, $predicateAnswerSet, $answerSetId));
155                }
156        }
157        $model->saveAs(SurveyInstance::$filename, 'rdf');
158        return true;
159    }
160   /**
161        * function get($arguments)
162        * Gets the array of SurveyInstance objects belonging tothe arguments supplied.
163        * @param type $arguments: An array containing zero or more of the following keys:
164        *                                                 'uid', 'of_survey', 'starttime', 'endtime', 'open', 'preset_answers', 'has_answerset'
165        */
166        public static function get($arguments)
167        {
168                $model = ResearchToolObject::load(SurveyInstance::$filename);
169
170                //Build the query string
171                $querystring = '
172                        PREFIX predicates: <' . SURVEYTOOL_PREDICATES_NAMESPACE . '>
173                        PREFIX resources: <' . SURVEYTOOL_RESOURCES_NAMESPACE . '>
174                        SELECT DISTINCT ?uid, ?of_survey, ?starttime, ?endtime, ?open
175                        WHERE
176                        {
177                                _surveyinstance         predicates:resource_type        resources:surveyinstance;
178                                predicates:uid ?uid ;
179                                predicates:of_survey ?of_survey ;
180                                predicates:starttime ?starttime ;
181                                predicates:endtime ?endtime ;
182                                predicates:open ?open ;
183                                ' . ResearchToolObject::createArguments($arguments) . '
184                        }';
185                //Query the model
186                $results = $model->sparqlQuery($querystring);
187                //Create the corresponding SurveyInstance objects
188                $sInstances = array();
189                if(!empty($results))
190                {
191                        foreach($results as $result)
192                        {
193                                $startTime = new DateTime();
194                                $startTime->setTimestamp(intval($result['?starttime']->label));
195                                $endTime = new DateTime();
196                                $endTime->setTimestamp(intval($result['?endtime']->label));
197                                $open = false;
198                                if ($result['?open'] == 'true')
199                                        $open = true;
200                                $presetAnswers = SurveyInstance::getPresetAnswers($model, $result['?uid']->label);
201                                $answerSets = SurveyInstance::getAnswerSets($model, $result['?uid']->label);
202                                $sInstances[] = new SurveyInstance($result['?uid']->label, $result['?of_survey']->label, $startTime, $endTime, $open, $presetAnswers, $answerSets);
203                        }
204                }
205                return $sInstances;
206        }
207
208        /**
209         * function getPresetAnswers()
210         * @param type $model : The RDF model to query against.
211         * @param type $uid : The UID of the SurveyInstance for which the preset answers should be retrieved.
212         */
213        private static function getPresetAnswers($model, $uid)
214        {
215                $result = $model->findRegex("[(".$uid.")]", "[(preset_answer)]", null);
216                $iterator = $result->getStatementIterator();
217                $answers = array();
218                while($iterator->hasNext())
219                {
220                        $element = $iterator->next();
221                        $answers[] = $element->getLabelObject();
222                }
223                return $answers;
224        }
225
226        /**
227         * function getAnswerSets()
228         * @param type $model : The RDF model to query against.
229         * @param type $uid : The UID of the SurveyInstance for which the preset answers should be retrieved.
230         */
231        private static function getAnswerSets($model, $uid)
232        {
233                $result = $model->findRegex("[(".$uid.")]", "[(has_answerset)]", null);
234                $iterator = $result->getStatementIterator();
235                $answersets = array();
236                while($iterator->hasNext())
237                {
238                        $element = $iterator->next();
239                        $answersets[] = $element->getLabelObject();
240                }
241                return $answersets;
242        }
243
244}
245
246?>
Note: See TracBrowser for help on using the repository browser.