lib/milkode/cdweb/lib/database.rb in milkode-0.5.1 vs lib/milkode/cdweb/lib/database.rb in milkode-0.5.2

- old
+ new

@@ -50,11 +50,22 @@ def record(shortpath) table = @documents.select { |record| record.shortpath == shortpath } return table.records[0] end - def search(patterns, packages, fpaths, suffixs, offset = 0, limit = -1) + def search(patterns, packages, current_path, fpaths, suffixs, offset = 0, limit = -1) + # パッケージ名から絶対パスに変換 + unless packages.empty? + packages = convert_packages(packages) + + # キーワードがパッケージ名にマッチしなければ検索しない + return [], 0 if packages.empty? + else + # パッケージ名未指定の時は現在位置もfpathsに含める + fpaths << current_path + "/" unless current_path == "" + end + # @todo fpathを厳密に検索するには、検索結果からさらに先頭からのパスではないものを除外する records, total_records = searchMain(patterns, packages, fpaths, suffixs, offset, limit) end def selectAll(offset = 0, limit = -1) @@ -129,18 +140,17 @@ }.uniq paths end - # コンテンツの削除 - # @todo パッケージ名完全一致になっていないので直す - def remove(packages) + # 指定したfpathにマッチするレコードを削除する + def remove_fpath(fpath) # データベースを開き直す reopen_patch - # 削除したコンテンツをインデックスから削除 - records, total_records = search([], packages, [], []) + # 削除したいコンテンツを検索 + records, total_records = searchMain([], [], [fpath], [], 0, -1) # 検索結果はHashのレコードなので、これを直接deleteしても駄目 # 1. Record#record_idを使って主キー(Groonga#Arrayのレコード)を取り出し # 2. Record#delete で削除 records.each do |r| @@ -220,28 +230,20 @@ # 検索式 expression end # スコアとタイムスタンプでソート - records = table.sort([{:key => "_score", :order => "descending"}, - {:key => "timestamp", :order => "descending"}], - :offset => offset, - :limit => limit) - - # ファイル名でソート - # @todo 本当はこっちが望ましいが、パッケージ検索を正確にしないことには出来ない - # records = table.sort([{:key => "shortpath", :order => "ascending"}], + # records = table.sort([{:key => "_score", :order => "descending"}, + # {:key => "timestamp", :order => "descending"}], # :offset => offset, # :limit => limit) + + # ファイル名でソート + records = table.sort([{:key => "shortpath", :order => "ascending"}], + :offset => offset, + :limit => limit) - # パッケージの条件追加 - if (packages.size > 0) - records.delete_if do |record| - !packages.any?{|package| record.shortpath.split('/')[0] =~ /#{package}/ } - end - end - # マッチ数 total_records = table.size return records, total_records end @@ -279,7 +281,17 @@ sub end private :suffix_expression + def convert_packages(packages) + packages.inject([]) {|r, p| r += expand_packages(p)} + end + + def expand_packages(keyword) + @yaml.match_all(keyword).map{|p| p.directory} + end + + # --- error --- + class NotFoundPackage < RuntimeError ; end end end