diff options
-rw-r--r-- | src/guff/post-model.cr | 31 | ||||
-rw-r--r-- | src/guff/post.cr | 21 | ||||
-rw-r--r-- | src/guff/results.cr | 7 |
3 files changed, 38 insertions, 21 deletions
diff --git a/src/guff/post-model.cr b/src/guff/post-model.cr index 4a20db8..4788ba3 100644 --- a/src/guff/post-model.cr +++ b/src/guff/post-model.cr @@ -119,25 +119,21 @@ module Guff "site_id": (site_id || @models.site.get_default).to_s, } of String => String - # 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": COLUMNS[sort][:col], + "sort": get_sort_clause(sort), "dir": dir, "tags": get_tags_filter(tags), "cols": get_columns_clause(cols), - } of String => String + } # count number of matching rows num_rows = (one(:count_posts, sql_args, tmpl_args).to_s || 0).to_i # TODO: add Post class? - rows = [] of Hash(String, ::SQLite3::Value) + rows = [] of Post if num_rows > 0 all(:get_posts, sql_args.merge({ ":offset": ((page - 1) * limit).to_s, @@ -157,9 +153,22 @@ module Guff ) end - private def get_columns_clause(cols : Array(String)?) + private def get_sort_clause( + sort : String + ) : String + # verify sort column + raise "unknown sort column" unless COLUMNS.has_key?(sort) + raise "column is not sortable" unless COLUMNS[sort][:sortable] + + # return result + COLUMNS[sort][:clause] as String + end + + private def get_columns_clause( + cols : Array(String)? + ) : String (cols || COLUMNS.keys.select { |col| - COLUMNS[key][:default] + COLUMNS[col][:default] }).map { |col| "%s AS %s" % [COLUMNS[col][:clause], col] }.join(", ") @@ -171,7 +180,9 @@ module Guff LIMIT 0 " - private def get_tags_filter(tag_sets : Array(Array(String))) + private def get_tags_filter( + tag_sets : Array(Array(String)) + ) : String (tag_sets.size > 0) ? template(:tags, { "sql": tag_sets.map { |tags| template(:tags, { diff --git a/src/guff/post.cr b/src/guff/post.cr index 7247e15..735682c 100644 --- a/src/guff/post.cr +++ b/src/guff/post.cr @@ -1,10 +1,21 @@ -class Guff:Post +class Guff::Post def initialize(@row : Hash(String, ::SQLite3::Value)) end - def to_json - @row.merge({ - "tags": @row["tags"].split('|') - }).to_json + def to_json(io) + @row.reduce({} of String => String | Array(String)) do |r, k, v| + r[k] = v.to_s + r + end.merge({ + "tags": tags + }).to_json(io) + end + + private def tags : Array(String) + @tags ||= if @row.has_key?("tags") && (@row["tags"] as String).size > 0 + (@row["tags"] as String).split('|') + else + [] of String + end end end diff --git a/src/guff/results.cr b/src/guff/results.cr index 0dbc351..3fdc6e4 100644 --- a/src/guff/results.cr +++ b/src/guff/results.cr @@ -22,12 +22,7 @@ module Guff num_rows: @num_rows, }, - rows: @rows.map { |row| - row.reduce({} of String => String) do |r, k, v| - r[k] = v.to_s - r - end - }, + rows: @rows, }.to_json end end |