diff -r b403086580f7 -r 0e57c730bb18 Entity/TagRepository.php --- a/Entity/TagRepository.php Fri Nov 18 17:54:30 2011 +0100 +++ b/Entity/TagRepository.php Fri Nov 25 18:55:42 2011 +0100 @@ -3,6 +3,8 @@ namespace IRI\Bundle\WikiTagBundle\Entity; use Doctrine\ORM\EntityRepository; +use IRI\Bundle\WikiTagBundle\Utils\WikiTagUtils; +use IRI\Bundle\WikiTagBundle\Entity\Tag; /** * TagRepository @@ -41,4 +43,90 @@ return $query->getResult(); } + + /** + * Get or create tag. Returns an array(tag:WikiTagTag, revision_id=int, created:Boolean) + * @param $tag_label + * @param $doctrine + * @return multitype:boolean Ambigous Ambigous (array(\IRI\Bundle\WikiTagBundle\Model\TagInterface, revision_id=int, created:Boolean)) + */ + public function getOrCreateTag($tag_label) + { + $tag_label_normalized = WikiTagUtils::normalizeTag($tag_label); + // We get the wikipedia references for the tag_label + // We get or create the tag object + $tags = $this->findBy(array('normalizedLabel' => $tag_label_normalized)); + $tag = null; + foreach ($tags as $t) { + if($tag==null || $t->getUrlStatus()!=Tag::$TAG_URL_STATUS_DICT['null_result']) { + $tag = $t; + if($t->getUrlStatus()!=Tag::$TAG_URL_STATUS_DICT['null_result']) { + break; + } + } + } + $wp_request_done = false; + if($tag==null) { + $tag = new Tag(); + $tag->setLabel($tag_label_normalized); + $tag->setOriginalLabel($tag_label); + $tag->setNormalizedLabel($tag_label_normalized); + $created = true; + } + else { + $created = false; + $match_exists = false; + // Even if a tag with the normalised label exists, IF this tag is not wikipedia semantised, + // we search if a wikipedia semantised version exists in the base + foreach ($tags as $t) { + if($t->getUrlStatus()==Tag::$TAG_URL_STATUS_DICT['match']) { + $tag = $t; + $match_exists = true; + break; + } + } + if($match_exists==false) { + $wp_response = WikiTagUtils::getWikipediaInfo($tag_label_normalized); + $status = $wp_response['status']; + if($status==Tag::$TAG_URL_STATUS_DICT['match']) { + $tag = new Tag(); + $tag->setLabel($tag_label_normalized); + $tag->setOriginalLabel($tag_label); + $tag->setNormalizedLabel($tag_label_normalized); + $created = true; + $wp_request_done = true; + } + } + } + + // We request Wikipedia if the tag is created + if($created==true) { + + if($wp_request_done==false) { + $wp_response = WikiTagUtils::getWikipediaInfo($tag_label_normalized); + } + + $tag->setWikipediaInfo($wp_response); + + // Save datas. + $em = $this->getEntityManager(); + $em->persist($tag); + $em->flush(); + + $wikipedia_revision_id = $wp_response['revision_id']; + + } + else if($tag!=null && $tag->getWikipediaPageId()!=null) { + + $wp_response = WikiTagUtils::getWikipediaInfo(null, $tag->getWikipediaPageId()); + $wikipedia_revision_id = $wp_response['revision_id']; + } + else { + $wikipedia_revision_id = null; + } + + return array($tag, $wikipedia_revision_id, $created);//, $wpReponse); + } + + } \ No newline at end of file