Queries for task management

Tasks past either scheduled or deadline date

#+BEGIN_QUERY
{:title [:h3 "🔥 Tasks past due"]
 :query [:find (pull ?b [*])
 :in $ ?day
 :where
   [?b :block/marker ?m]
   (not [(contains? #{"DONE" "CANCELED"} ?m)])
   (or
     [?b :block/scheduled ?d]  ; Either the scheduled value
     [?b :block/deadline ?d] ; or the deadline value
    )
    [(< ?d ?day)] ; the value is in the past
 ]
 :inputs [:today]
 :table-view? false
}
#+END_QUERY
3 Likes

it works! thanks a lot. I it also helped me realise to pay more attention on how to use scheduled and deadline too.

By the way, the default query NEXT shows what ? I do not see upcoming deadlines either.
I am not sure what that query does.

Again, thank you so much for all your help,
Being a non-coder it is very helpful, and also interesting

figured out my own question. The default queries are:

NOW - Show me only tasks that are “NOW” or “DOING” that were created on a journal page with a date in the last two weeks.

NEXT - Show me only tasks that are “NOW” or “LATER” or “TODO” that were created on a journal page with a date in the next week. (makes no sense, as it does not look at DEADLINE or SCHEDULE, but at tasks in a future journal day)

Built in Scheduled & Deadline - Show me tasks which have a “scheduled” or “deadline” date of today.

2 Likes

Recursively search for tasks that are tagged or have their parent tagged with current page.

Combining “Tasks by current page & it’s aliases” with the recursive search from “Tasks that don’t reference a page regardless of nesting”

#+BEGIN_QUERY
{:title ["Query by page & alias"]
 :query [:find (pull ?b [*])
   :in $ ?page %
   :where
     [?b :block/marker "TODO"]
     [?p :block/name ?page]
     (or-join [?b ?p]
       (check-ref ?p ?b) 
       (and 
          [?p :block/alias ?a]
          (check-ref ?a ?b)
       )
     )
 ]
 :rules [
   [(check-ref ?p ?b)
     [?b :block/refs ?p]
   ]
   [(check-ref ?p ?b)
     [?b :block/parent ?t]
     (check-ref ?p ?t)
   ]
 ]
 :table-view? false
 :inputs [:current-page]
}
#+END_QUERY

Sample result:

4 Likes

hi,
since I have one query for all tasks for today, how can I adapt this query to exclude the tasks scheduled or deadline today:

Hi,
How can I modify this query to exclude deadline or schedule is not today:

{:title "📅 WITHIN NEXT 3 DAYS"
    :query [:find (pull ?h [*])
            :in $ ?next
            :where
            [?h :block/marker ?m]
            [(contains? #{"LATER" "TODO"} ?m)]
            (or-join [?h ?d]
              (and
                [?h :block/ref-pages ?p]
                [?p :block/journal? true]
                [?p :block/journal-day ?d])
              [?h :block/scheduled ?d]
              [?h :block/deadline ?d])
            [(< ?d ?next)]]
    :inputs [:3d-after] 
    :table-view? false
    :collapsed? true}
1 Like

You add :today as input. (:inputs [:3d-after :today] and :in $ ?next ?today)
Then an extra line with [(> ?d ?today)].

2 Likes

thanks a lot, it worked!!!

Sharing my newly complex today query :smiling_face_with_three_hearts:

Tasks for today based on scheduled or deadline

What I wanted was the ability to move a task forward in time through scheduled, but without moving the deadline. However I didn’t want to see these in my tasks for today query anymore. (tasks for today are all those with scheduled or deadline in the past or on today)

#+BEGIN_QUERY
{:title [:h3 " ⚡ Vandaag"]
 :query [:find (pull ?b [*])
   :in $ ?day
   :where
     [?b :block/marker ?m]
     [(contains? #{"TODO" "DOING"} ?m)]
     [?b :block/page ?p]
     (or-join [?b ?d]
       [?b :block/scheduled ?d] ; scheduled on ?d
       (and 
         [?b :block/deadline ?d] ; or deadline on ?d
         (not [?b :block/scheduled]) ; and not scheduled
       )
       (and
         [?b :block/deadline ?d] ; or deadline on ?d
         [?b :block/scheduled ?t] ; and scheduled on ?t
         [(<= ?t ?d)] ; and ?t is less or equal to ?d
       )
     )
     [(<= ?d ?day)] ; ?d is less or equal to ?day, which is set to today.
     [?b :block/parent ?pb] ; the parent of the task
     (not [?pb :block/marker "TODO"]) ; the parent is not a task. I.e. filter out subtasks.
 ]
 :result-transform (fn [result] (sort-by 
   (juxt 
     (fn [r] (get r :block/scheduled 99999999)) ; sort by scheduled, which is substituted by 99999999 when it doesn't exist, meaning unscheduled tasks end up at the bottom instead of the top.
     (fn [r] (get r :block/deadline)) ; and then sort by deadline.
   ) 
   (map 
     (fn [m] (assoc m :block/collapsed? true)) ; collapse the result blocks
     result
   )
 ) )
 :table-view? false
 :breadcrumb-show? false
 :inputs [:today]
}
#+END_QUERY
1 Like

hi again,

actually it still shows a task with deadline today.
I tried to see how to exclude but I don’t get it.
Could you help me out?

{:title "📅  NEXT 3 DAYS, NOT TODAY"
    :query [:find (pull ?h [*])
            :in $ ?next ?today
            :where
            [?h :block/marker ?m]
            [(contains? #{"LATER" "TODO"} ?m)]
            (or-join [?h ?d]
              (and
                [?h :block/ref-pages ?p]
                [?p :block/journal? true]
                [?p :block/journal-day ?d])
              [?h :block/scheduled ?d]
              [?h :block/deadline ?d])
            [(and
              [(< ?d ?next)]
              [(> ?d ?today)])]]
    :inputs [:3d-after :today] 
    :table-view? false
    :breadcrumb-show? false
    :collapsed? true}
1 Like

Idk why you made such a weird query :joy:
Here’s the query as per my instructions and it works perfectly well.

{:title "📅  NEXT 3 DAYS, NOT TODAY"
    :query [:find (pull ?h [*])
            :in $ ?next ?today
            :where
            [?h :block/marker ?m]
            [(contains? #{"LATER" "TODO"} ?m)]
            (or-join [?h ?d]
              (and
                [?h :block/ref-pages ?p]
                [?p :block/journal? true]
                [?p :block/journal-day ?d]
              )
              [?h :block/scheduled ?d]
              [?h :block/deadline ?d]
            )
            [(< ?d ?next)]
            [(> ?d ?today)]
    ]
    :inputs [:3d-after :today]
    :table-view? false
    :breadcrumb-show? false
    :collapsed? true
}

Here it is a little bit more optimized, but shouldn’t change anything.

{:title "📅  NEXT 3 DAYS, NOT TODAY"
    :query [:find (pull ?h [*])
            :in $ ?next ?today
            :where
            [?h :block/marker ?m]
            [(contains? #{"LATER" "TODO"} ?m)]
            (or-join [?h ?d]
              (and
                [?h :block/refs ?p]
                [?p :block/journal-day ?d]
              )
              [?h :block/scheduled ?d]
              [?h :block/deadline ?d]
            )
            [(< ?d ?next)]
            [(> ?d ?today)]
    ]
    :inputs [:3d-after :today]
    :table-view? false
    :breadcrumb-show? false
    :collapsed? false
}

Both worked in my test environment on iPad version 0.8.16

1 Like

Tasks linked to pages with common tag.

1 Like

similar to Tasks for today based on scheduled or deadline, but without the deadline and just either tasks scheduled today or not scheduled at all on the current page:

1 Like

Hi, is it possible to for any of the queries in your OP to generate a table view of all my tasks with columns for project, deadline, priority, etc? Then can I filter and sort this table by the column values? Thanks in advance!

This is partially possible and depends on what you are looking for exactly.
For example the query under the header

Generates a table. See the :view part of the query.

Please post some example data and desired result and I’ll have a look!
Do be aware that you will not be able to filter and sort the table by the column names though. The query will just give you a static result.

Coming to simply queries:

Hi, this has been such a useful resource. Thank you!

I am starting with your “Tasks without a specific page link” and modified it a bit. I have breadcrumbs as false but I still end up getting the references for the tasks that I am pulling. Here is the code that I have

#+BEGIN_QUERY
{:title [:h3 "Tasks without page reference" ]
 :query [:find (pull ?b [*])
   :where
     [?p :block/name "habit-tracker"] ; name is always lowercase
     [?b :block/marker "TODO"]
     (not [?b :block/scheduled])
     (not [?b :block/deadline])
     (not [?b :block/refs ?p]) ; we cannot use not until we have specified the variables used in it
 ]
   :table-view? false
   :breadcrumb-show? false
}
#+END_QUERY

Can you please help to avoid having all these references, so that I can just a list of things?

You need to add

:result-transform (fn [result] (sort-by (fn [r] (get-in r [:block/created-at])) result))

Just after

:table-view? False

2 Likes

To add to @Federico_Frosini answer, any :result-transform works for this.
So something as simple as :result-transform (fn [result] result) also works.

3 Likes

Here’s the example I have in mind - I am wondering if I can get columns for project, priority, deadline, and scheduled?

Query:

#+BEGIN_QUERY
   {:title "🟠 SLIPPING"
  :query [:find (pull ?b [*])
          :in $ ?start ?today
          :where
          (task ?b #{"NOW" "LATER" "TODO" "DOING"})
          (between ?b ?start ?today)]
  :inputs [:-7d :today]
  :result-transform (fn [result]
                      (sort-by (fn [h]
                                 (get h :block/created-at)) result))
  :collapsed? true}
#+END_QUERY