diff options
Diffstat (limited to 'src/guff/post-model.cr')
-rw-r--r-- | src/guff/post-model.cr | 98 |
1 files changed, 76 insertions, 22 deletions
diff --git a/src/guff/post-model.cr b/src/guff/post-model.cr index 4a3f406..46e2dca 100644 --- a/src/guff/post-model.cr +++ b/src/guff/post-model.cr @@ -30,19 +30,7 @@ module Guff ", get_posts: " - SELECT a.post_id, - a.site_id, - a.name, - a.body, - a.html, - - (SELECT group_agg(d.name, '|') - - FROM post_tags c - JOIN tags d - ON (d.tag_id = c.tag_id) - - WHERE d.post_id = a.post_id) AS tags + SELECT %{cols} FROM posts a JOIN (%{tags}) b @@ -60,11 +48,64 @@ module Guff super(models, SQL) end - SORTS = { - "posted_at": "a.posted_at", + COLUMNS = { + "post_id": { + default: true, + sortable: true, + clause: "a.post_id", + }, + + "name": { + default: true, + sortable: true, + clause: "a.name", + }, + + "body": { + default: false, + sortable: true, + clause: "a.body", + }, + + "html": { + default: true, + sortable: true, + clause: "a.html", + }, + + "posted_at": { + default: true, + sortable: true, + clause: "a.posted_at", + }, + + "created_at": { + default: true, + sortable: true, + clause: "a.created_at", + }, + + "tags": { + default: true, + sortable: false, + clause: " + (SELECT group_agg(d.name, '|') + + FROM post_tags c + JOIN tags d + ON (d.tag_id = c.tag_id) + + WHERE d.post_id = a.post_id) + ", + }, } + ##################### + # get_posts methods # + ##################### + def get_posts( + cols = nil : Array(String)?, site_id = nil : Int?, q = "" : String, tags = [] of Array(String) : Array(Array(String)), @@ -78,15 +119,18 @@ module Guff "site_id": (site_id || @models.site.get_default).to_s, } of String => String - p tags + # verify sort column + raise "unknown sort column" unless COLUMNS.has_key?(sort) + raise "column is not sortable" unless COLUMNS[sort][:sortable] # build tmpl args tmpl_args = { # TODO "filter": "1 = 1", # true - "sort": SORTS[sort], + "sort": COLUMNS[sort][:col], "dir": dir, "tags": get_tags_filter(tags), + "cols": get_columns_clause(cols), } of String => String # count number of matching rows @@ -113,6 +157,20 @@ module Guff ) end + private def get_columns_clause(cols : Array(String)?) + (cols || COLUMNS.keys.select { |col| + COLUMNS[key][:default] + }).map { |col| + "%s AS %s" % [COLUMNS[col][:clause], col] + }.join(", ") + end + + NO_POSTS = " + SELECT post_id + FROM posts + LIMIT 0 + " + private def get_tags_filter(tag_sets : Array(Array(String))) p tag_sets (tag_sets.size > 0) ? template(:tags, { @@ -125,11 +183,7 @@ module Guff }.join(" INTERSECTS "), }) }.join(" UNION "), - }) : " - SELECT post_id - FROM posts - LIMIT 0 - " + }) : NO_POSTS end def add_post(req) |