From c3510620ad0718d2ab1f856e3a838360a5ade314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Gomez?= Date: Sun, 11 Oct 2015 16:54:21 +0200 Subject: PoC of rule-based tagging --- src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php (limited to 'src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php') diff --git a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php new file mode 100644 index 00000000..012450b6 --- /dev/null +++ b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php @@ -0,0 +1,82 @@ +rulerz = $rulerz; + $this->tagRepository = $tagRepository; + } + + /** + * Add tags from rules defined by the user. + * + * @param Entry $entry Entry to tag. + */ + public function tag(Entry $entry) + { + $rules = $this->getRulesForUser($entry->getUser()); + + foreach ($rules as $rule) { + if (!$this->rulerz->satisfies($entry, $rule['rule'])) { + continue; + } + + foreach ($rule['tags'] as $label) { + $tag = $this->getTag($entry->getUser(), $label); + + $entry->addTag($tag); + } + } + } + + /** + * Fetch a tag for a user. + * + * @param User $user + * @param string $label The tag's label. + * + * @return Tag + */ + private function getTag(User $user, $label) + { + $tag = $this->tagRepository->findOneByLabelAndUserId($label, $user->getId()); + + if (!$tag) { + $tag = new Tag($user); + $tag->setLabel($label); + } + + return $tag; + } + + private function getRulesForUser(User $user) + { + return [ + [ + 'rule' => 'domainName = "github.com"', + 'tags' => ['github'], + ], + [ + 'rule' => 'readingTime >= 15', + 'tags' => ['long reading'], + ], + [ + 'rule' => 'readingTime <= 3 ', + 'tags' => ['short reading'], + ], + ]; + } +} -- cgit v1.2.3 From ac9fec610a6485b39c856d9cb7d263ce8c5f1223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Gomez?= Date: Sun, 11 Oct 2015 17:14:50 +0200 Subject: Add TaggingRule entity --- src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php | 26 +++++++++------------- 1 file changed, 10 insertions(+), 16 deletions(-) (limited to 'src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php') diff --git a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php index 012450b6..bb933779 100644 --- a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php +++ b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php @@ -30,11 +30,11 @@ class RuleBasedTagger $rules = $this->getRulesForUser($entry->getUser()); foreach ($rules as $rule) { - if (!$this->rulerz->satisfies($entry, $rule['rule'])) { + if (!$this->rulerz->satisfies($entry, $rule->getRule())) { continue; } - foreach ($rule['tags'] as $label) { + foreach ($rule->getTags() as $label) { $tag = $this->getTag($entry->getUser(), $label); $entry->addTag($tag); @@ -62,21 +62,15 @@ class RuleBasedTagger return $tag; } + /** + * Retrieves the tagging rules for a given user. + * + * @param User $user + * + * @return array + */ private function getRulesForUser(User $user) { - return [ - [ - 'rule' => 'domainName = "github.com"', - 'tags' => ['github'], - ], - [ - 'rule' => 'readingTime >= 15', - 'tags' => ['long reading'], - ], - [ - 'rule' => 'readingTime <= 3 ', - 'tags' => ['short reading'], - ], - ]; + return $user->getConfig()->getTaggingRules(); } } -- cgit v1.2.3 From 625acf335298186b4ff983f9321900d1238e854b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Gomez?= Date: Sat, 24 Oct 2015 15:11:06 +0200 Subject: Add a command to automatically tag all entries for a user --- src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php | 38 ++++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php') diff --git a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php index bb933779..3f9953c0 100644 --- a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php +++ b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php @@ -6,6 +6,7 @@ use RulerZ\RulerZ; use Wallabag\CoreBundle\Entity\Entry; use Wallabag\CoreBundle\Entity\Tag; +use Wallabag\CoreBundle\Repository\EntryRepository; use Wallabag\CoreBundle\Repository\TagRepository; use Wallabag\UserBundle\Entity\User; @@ -13,11 +14,13 @@ class RuleBasedTagger { private $rulerz; private $tagRepository; + private $entryRepository; - public function __construct(RulerZ $rulerz, TagRepository $tagRepository) + public function __construct(RulerZ $rulerz, TagRepository $tagRepository, EntryRepository $entryRepository) { - $this->rulerz = $rulerz; - $this->tagRepository = $tagRepository; + $this->rulerz = $rulerz; + $this->tagRepository = $tagRepository; + $this->entryRepository = $entryRepository; } /** @@ -42,6 +45,35 @@ class RuleBasedTagger } } + /** + * Apply all the tagging rules defined by a user on its entries. + * + * @param User $user + * + * @return array A list of modified entries. + */ + public function tagAllForUser(User $user) + { + $rules = $this->getRulesForUser($user); + $entries = array(); + + foreach ($rules as $rule) { + $qb = $this->entryRepository->getBuilderForAllByUser($user->getId()); + $entries = $this->rulerz->filter($qb, $rule->getRule()); + + foreach ($entries as $entry) { + foreach ($rule->getTags() as $label) { + $tag = $this->getTag($user, $label); + + $entry->addTag($tag); + $entries[] = $entry; + } + } + } + + return $entries; + } + /** * Fetch a tag for a user. * -- cgit v1.2.3