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