Okay - I've got the answer to the second question as well. I am not sure of the efficiency though - I essentially collect all items that have the tag RED and then collect all the items that have the BLUE and then do "sect" on the output lists. Is this reasonable?
(setq L1 (mapcar '( (I) (get I 'itm)) (collect 'nm '+Tag "BLUE"))) (setq L2 (mapcar '( (I) (get I 'itm)) (collect 'nm '+Tag "RED"))) (for I (sect L1 L2) (print-item I)) Regards, Kashyap On Thu, Nov 21, 2019 at 9:49 AM C K Kashyap <ckkash...@gmail.com> wrote: > Hi Alex, > I think I have a workaround for my question 1 :) - if I use the status as > an inline relation instead of a link that is. I can use use "filter" in the > select to get only items of a given state. I was wondering if there is a > way to filter based on a Link relation though. My question 2 is still open > :( > Regards, > Kashyap > > On Wed, Nov 20, 2019 at 4:03 PM C K Kashyap <ckkash...@gmail.com> wrote: > >> Hi Alex, >> I have a couple of follow up Pilog questions.I've been doing some trial >> and error and I don't see it converging :) >> >> I have written a statndalone script for this so that you can easily tell >> me how to do it in it. In the script below, the entity relation defines >> three types - Item, Status and Tag. An Item can have a title, status and 0 >> or more tags. I am able to query "all items", "all open/closed items", "all >> items where one of the tags match" >> >> The parts where I am struggling with are the following - >> 1. Query all open items that have the given tags >> 2. Query all items that have "ALL" the given tags - for example all >> items tagged with RED and GREEN -> this should only generate ITEM3 >> >> Also, I'd love some feedback for the appropriateness of the ER model that >> I've defined. >> >> Regards, >> Kashyap >> >> >> >> (pool "test.db") >> >> (class +Item +Entity) >> (rel ttl (+IdxFold +String)) >> (rel tgs (+List +Joint) itm (+Tag)) >> (rel sts (+Ref +Link) NIL (+Satus)) >> >> (class +Tag +Entity) >> (rel itm (+Joint) tgs (+Item)) >> (rel nm (+IdxFold +String)) >> >> (class +Status +Entity) >> (rel nm (+IdxFold +String)) >> >> (de new-status (Nm) >> (new! '(+Status) 'nm Nm) >> ) >> >> (de new-item (Ttl Sts Tgs) >> (let N (new '(+Item) 'ttl Ttl 'sts Sts) >> (for Tg Tgs >> (put> N 'tgs (new! '(+Tag) 'nm Tg 'itm N)) >> ) >> (commit) >> ) >> ) >> >> (de print-header (H) >> (prinl) >> (prinl H) >> (prinl (pack (mapcar '( (I) "-") (range 1 (length H)))) ) >> ) >> >> (de print-item (I) >> (prinl (get I 'ttl) ": " (get (get I 'sts) 'nm) " [" (glue ", " >> (mapcar '( (O) (get O 'nm)) (get I 'tgs) ) ) "]" ) >> ) >> >> (unless (seq *DB) >> (prinl "Initializing DB") >> >> (let ( SO (new-status "OPEN") >> SC (new-status "CLOSED") >> RED "RED" >> BLUE "BLUE" >> GREEN "GREEN") >> >> (new-item "ITEM1" SO (list RED BLUE)) >> (new-item "ITEM2" SC (list RED)) >> (new-item "ITEM3" SC (list GREEN RED)) >> (new-item "ITEM4" SC (list RED)) >> (new-item "ITEM5" SO (list BLUE)) >> ) >> ) >> >> (de all-items () >> (for I (collect 'ttl '+Item) >> (print-item I) >> ) >> ) >> >> (print-header "All Items") >> (all-items) >> >> (de open-items () >> (let R (make >> (pilog >> (quote >> @St "Open" >> (select (@Item) >> ( >> (nm +Status @St (sts +Item)) >> ) >> ) >> ) >> (link @Item) >> ) >> ) >> R >> ) >> ) >> >> (print-header "Open Items") >> (for I (open-items) >> (print-item I)) >> >> (de blue-or-green-items () >> (let R (make >> (pilog >> (quote >> @BLUE "BLUE" >> @GREEN "GREEN" >> (select (@Item) >> ( >> (nm +Tag @BLUE itm) >> (nm +Tag @GREEN itm) >> ) >> ) >> ) >> (link @Item) >> ) >> ) >> R >> ) >> ) >> >> (print-header "Blue Or Green Items") >> (for I (blue-or-green-items) >> (print-item I)) >> >> >> On Tue, Nov 5, 2019 at 6:06 AM C K Kashyap <ckkash...@gmail.com> wrote: >> >>> Thanks Alex, >>> The concatenation of multiple collects is just what I need :) >>> Regards, >>> Kashyap >>> >>> On Tue, Nov 5, 2019 at 4:59 AM Alexander Burger <a...@software-lab.de> >>> wrote: >>> >>>> Hi Kashyap, >>>> >>>> > My ER model looks like this - >>>> > (class +Task +Entity) >>>> > (rel ttl (+IdxFold +String)) >>>> > ... >>>> > (rel upds (+List +Joint) tsk (+Update)) >>>> > ... >>>> > (class +Update +Entity) >>>> > (rel tsk (+Joint) upds (+Task) ) >>>> > (rel dsc (+Sn +IdxFold +String)) >>>> > ... >>>> > How can I select all the Tasks that have a given text that either >>>> matches >>>> > the title of the +Task (ttl) or the description of an +Update (dsc)? >>>> >>>> Normal usage of two 'select' generators will not do this, as they imply >>>> an AND. >>>> A combined generator is not usable, I think, due to the different >>>> structure. >>>> >>>> So you could use nested queries (see doc/select.html) if you need >>>> 'select' (e.g. >>>> because you want to make a more general search over other keys too), or >>>> simply >>>> traverse both trees one after the other (i.e. an OR). >>>> >>>> The latter one is the simplest: >>>> >>>> (let Text (...) >>>> (uniq >>>> (conc >>>> (collect 'ttl '+Task Text) >>>> (collect 'dsc '+Update Text Text 'tsk) ) ) ) >>>> >>>> (Not tested) >>>> >>>> ☺/ A!ex >>>> >>>> -- >>>> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe >>>> >>>