                    :lesson/title       "title"
                    :lesson/description "description"
                    :lesson/keywords    "keywords"}}})
+
+      ; Course
       (row-getter :course/topics
         #(has-many % :topic :topic/course-id {:sort ["sortorder"]}))
       (row-getter :course/lessons
         #(has-many % :lesson :lesson/course-id {:sort ["lessonno"]}))
+
+      ; Topic
       (row-getter :topic/course
         #(has-one % :course :topic/course-id))
       (row-getter :topic/lessons
         #(has-many % :lesson :lesson/topic-id {:sort ["lessonno"]}))
+
+      ; Lesson
       (row-getter :lesson/course
         #(has-one % :course :lesson/course-id))
       (row-getter :lesson/topic


(defn row-get [{:keys [table] :as env} row attr]
  (read-from (assoc env :row row :ast {:key attr :dispatch-key attr})
    (:fields-getters table)))

(defn parse-row [{:keys [table ast ::union-selector] :as env} row]
  (let [row' {:db/table (:key table) :db/id (row-get env row :db/id)}
        readers [(:fields-getters table) placeholder-node]
        ast (if (union-children? ast)
              (some-> ast :query (get (row-get env row union-selector)) (om/query->ast))
              ast)]
    (-> (reduce (fn [row' {:keys [key] :as ast}]
                  (assoc row' key (read-from (assoc env :ast ast :row row) readers)))
                row'
                (:children ast))
        (read-chan-values))))

  (zipmap (keys schema)
          (map #(let [m (:fields %)]
                 (assoc %
                   ::reader-map
                   (zipmap (keys m)
                           (map
                             (fn [field]
