This looks like the one I need, I want all projects whose date range has any kind of overlap with the given date range.
Thanks, will try it! On Thu, Nov 17, 2016 at 4:10 PM, Alexander Burger <a...@software-lab.de> wrote: > Hi Henrik, > >> (class +Proj +Macropisobj) >> (rel id (+Key +Number)) >> (rel nm (+Ref +String)) >> (rel sDate (+Ref +String)) >> (rel eDate (+Ref +String)) >> >> (dm getCurrent> (Sdate Edate) >> (filter '((P) (or >> (< Sdate (; P sDate) Edate) >> (< Sdate (; P eDate) Edate) >> (< Sdate (; P sDate) (; P eDate) Edate) ) ) >> (collect 'id This) ) ) >> ... >> But how would the above problem be solved with Pilog and select if we have >> more than "a couple of hundred objects" in the database? > > If you know that the *result* will be within a few hundred hits (not the > total DB size), and the difference between start and end is less than > e.g. 100 days, then you could first restrict the collection a bit > > (collect 'sDate '+Proj Sdate (+ Edate 100)) > > (works of course only for +Date types), and then filter that further. > This is surely the most efficient way for a small set of results. > > > The same you can do in Pilog with the 'db' predicate for an larger > result set, and if you want to avoid a 'select' > > (? @Rng (cons Sdate (+ Edate 100)) > (db sDate +Proj @Rng @Proj) ) > > > But 'select' is the most general - and on big data sets perhaps the most > efficient - way. You could try > > (? > @Sdate (cons Sdate T) # Range with open end > @Edate (cons Edate NIL) # Reversed range with open start > (select (@Proj) > ((sDate +Proj @Sdate) (eDate +Proj @Edate)) # Search two indexes in > parallel > (range @Sdate @Proj sDate) # Check ranges > (range @Edate @Proj eDate) ) ) # Check ranges > > I haven't tested this ;) > > ♪♫ Alex > -- > UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe -- UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe