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