lib/feedcellar/groonga_searcher.rb in feedcellar-0.5.0 vs lib/feedcellar/groonga_searcher.rb in feedcellar-0.6.0
- old
+ new
@@ -1,8 +1,8 @@
# class Feedcellar::GroongaSearcher
#
-# Copyright (C) 2013-2014 Masafumi Yokoyama <myokoym@gmail.com>
+# Copyright (C) 2013-2015 Masafumi Yokoyama <myokoym@gmail.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
@@ -17,60 +17,19 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
module Feedcellar
class GroongaSearcher
class << self
- def search(database, words, options)
+ def search(database, words, options={})
feeds = database.feeds
+ selected_feeds = select_feeds(feeds, words, options)
- if (!words.nil? && !words.empty?) || options[:resource_id]
- feeds = feeds.select do |feed|
- expression = nil
- words.each do |word|
- sub_expression = (feed.title =~ word) |
- (feed.description =~ word)
- if expression.nil?
- expression = sub_expression
- else
- expression &= sub_expression
- end
- end
-
- if options[:mtime]
- base_date = (Time.now - (options[:mtime] * 60 * 60 * 24))
- mtime_expression = feed.date > base_date
- if expression.nil?
- expression = mtime_expression
- else
- expression &= mtime_expression
- end
- end
-
- if options[:resource]
- resource_expression = feed.resource =~ options[:resource]
- if expression.nil?
- expression = resource_expression
- else
- expression &= resource_expression
- end
- end
-
- if options[:resource_id]
- resource_expression = feed.resource._id == options[:resource_id]
- if expression.nil?
- expression = resource_expression
- else
- expression &= resource_expression
- end
- end
-
- expression
- end
- end
-
order = options[:reverse] ? "ascending" : "descending"
- sorted_feeds = feeds.sort([{:key => "date", :order => order}])
+ sorted_feeds = selected_feeds.sort([{
+ :key => "date",
+ :order => order,
+ }])
sorted_feeds
end
def latest(database)
@@ -83,9 +42,52 @@
next unless latest_feed.title
latest_feeds << latest_feed
end
latest_feeds
+ end
+
+ private
+ def select_feeds(feeds, words, options)
+ if (words.nil? || words.empty?) && options.empty?
+ return feeds
+ end
+
+ selected_feeds = feeds.select do |feed|
+ expression_builder = feed
+
+ if (!words.nil? && !words.empty?)
+ words.each do |word|
+ expression_builder &= (feed.title =~ word) |
+ (feed.description =~ word)
+ end
+ end
+
+ if options[:mtime]
+ base_date = (Time.now - (options[:mtime] * 60 * 60 * 24))
+ expression_builder &= feed.date > base_date
+ end
+
+ if options[:resource]
+ expression_builder &= feed.resource =~ options[:resource]
+ end
+
+ if options[:resource_id]
+ expression_builder &= feed.resource._id == options[:resource_id]
+ end
+
+ if options[:year] && feeds.have_column?(:year)
+ expression_builder &= feed.year == options[:year]
+ end
+
+ if options[:month] && feeds.have_column?(:month)
+ expression_builder &= feed.month == options[:month]
+ end
+
+ expression_builder
+ end
+
+ selected_feeds
end
end
end
end