From df4444afabaca7dbd8b65bfd4edafa515c0a9324 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sat, 9 Jul 2011 13:05:48 -0500 Subject: [PATCH] Store Array and Hash, fixes issue #10 --- lib/xapian_fu/xapian_doc_value_accessor.rb | 21 +++++++++++++++++++++ spec/xapian_doc_value_accessor_spec.rb | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/xapian_fu/xapian_doc_value_accessor.rb b/lib/xapian_fu/xapian_doc_value_accessor.rb index 6b7f176..3927e2e 100644 --- a/lib/xapian_fu/xapian_doc_value_accessor.rb +++ b/lib/xapian_fu/xapian_doc_value_accessor.rb @@ -1,4 +1,5 @@ require 'zlib' +require 'yaml' class Integer #:nodoc: def self.to_xapian_fu_storage_value(value) @@ -63,6 +64,26 @@ def self.from_xapian_fu_storage_value(value) end end +class Array #:nodoc: + def self.to_xapian_fu_storage_value(value) + YAML::dump(value) + end + + def self.from_xapian_fu_storage_value(value) + YAML::load(value) rescue nil + end +end + +class Hash #:nodoc: + def self.to_xapian_fu_storage_value(value) + YAML::dump(value) + end + + def self.from_xapian_fu_storage_value(value) + YAML::load(value) rescue nil + end +end + module XapianFu #:nodoc: class ValueOutOfBounds < XapianFuError diff --git a/spec/xapian_doc_value_accessor_spec.rb b/spec/xapian_doc_value_accessor_spec.rb index 813b8fa..bebd584 100644 --- a/spec/xapian_doc_value_accessor_spec.rb +++ b/spec/xapian_doc_value_accessor_spec.rb @@ -94,6 +94,22 @@ doc.to_xapian_document.values.first.value.should == date.to_s end + it "should store fields defined as Array" do + xdb = XapianDb.new(:fields => { :list => { :type => Array, :store => true }}) + list = [1,2,3] + doc = xdb.documents.new(:list => list) + doc.values.store(:list, list).should == list + doc.values.fetch(:list).should == list + end + + it "should store fields defined as Hash" do + xdb = XapianDb.new(:fields => { :h => { :type => Hash, :store => true }}) + h = {:a => 1, :b => 2} + doc = xdb.documents.new(:h => h) + doc.values.store(:h, h).should == h + doc.values.fetch(:h).should == h + end + it "should count the stored values when size is called" do doc = XapianDoc.new(nil) lambda { doc.values[:city] = "London" }.should change(doc.values, :size).by(1)