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 >>> >>