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

Reply via email to