view full record if there is only one
[zcc.git] / lib / zcc / resultset.rb
blob527fa39a602a49f98048bdccb67e79b99bc39c5f
1 module ZCC  
2   class ResultSet
3     include Enumerable
4     
5     attr_accessor :query, :sort_by, :index_start, :index_pos, :records, :rank
6     
7     #All values of initialize are optional, though you'll want to supply it with a query object if you intend on getting records into your set through a z39.50 search. index_start and index_end will be used for the TUI display.
8     def initialize(query_object=nil, sort_by='title', index_start=0, index_pos=4 ) 
9       @query = query_object #query object
10       
11       @sort_by = sort_by
12       @index_start = index_start
13       @index_pos = index_pos
14       #puts self.sort_by
15       #puts self.index_start
16       @records = []
17       #puts self.records.class
18     end
19     
20     #Pretty prints the result set object. Nests pretty printed record objects within.
21     def to_s
22       full_string =  "-------RESULT SET--------------\n" + "Result set has #{self.records.size} records."
23       self.records.each do |record|
24         full_string << record.to_s
25       end
26       full_string += "-------RESULT SET--------------\n"
27     end
29     # Method to add records only to a result set.
30     def ingest record
31       self.records << record
32     end
33     
34     # appends a result set to another.
35     # Replaces the query and sort_by instance variables with the new ones.
36     
37     
38     #Removes unselected records from the result set. Uses the selected instance variable to check for true or false.
39     def remove_unselected!
40       self.records.each_index do |i|
41         if self.records[i].nil?
42         else
43           self.records[i] = nil unless self.records[i].selected
44         end
45       end
46       self.records.flatten!
47       self.records.compact!
48       self.records.uniq!
49     end
50     
51     #Number of records in the result set
52     def size
53       self.records.length
54     end 
55     
56     alias length size
58     #returns number of ZCC::Records with @selected set to true
59     def selected_size
60       selected_records = self.find_all{|record| record.selected unless record == nil}
61       #puts selected_records.length
62       selected_records.length
63     end 
64     
65     alias selected_length selected_size
66     
67     # This allows for Enumerable mixin.
68     def each 
69       for record in @records
70         yield record
71       end
72     end
73     
74     def sort_by_title!
75       self.records.compact!
76       self.records.flatten!
77       self.records = self.records.sort_by{|r| r.marc['245']['a']}
78     end
80     def sort_by_date!
81       self.remove_nil!
82       self.records = self.records.sort_by{ |r| r.year_260}         
83     end
85     def sort_by_subfield! sf
86       self.remove_nil!
87       field, subfield = sf[0,3], sf[3,10]
88       subfield = 'a' if subfield == ''
89       nil_subfields = []
90       self.records.each_index do |i| 
91               unless self.records[i].marc[field] && self.records[i].marc[field][subfield]
92           nil_subfields << self.records[i]
93           self.records[i] = nil
94               end
95       end
96       self.records.compact!
97       begin
98         self.records = self.records.sort_by{ |r| r.marc[field][subfield]}
99       rescue Exception => e
100         puts e
101         say_help("There was an error.\nYour records have not been sorted.")
102       end
103       self.records << nil_subfields
104       self.remove_nil!
105     end
107     def sort_by_standard!
108       self.remove_nil!
109       self.records = self.records.sort_by{|r| r.marc.leader[18]}
110       self.records.reverse
111     end
113     # Very simple relevancy ranking for title searches
114     def rank_by_relevance!
115       rank = 0
116       #raise NotImplementedError
117       #unless self.query.type == 'title'
118       #  raise "Relevancy ranking only works with titles (and not even them yet)"
119       #end
120       self.rank
121       term = self.query.term
122       re_term = Regexp.new("#{term}", true)
123       re_term2 = Regexp.new("\^#{term}", true)
124       self.records.each do |rec|
125         #puts re_term
126         #puts rec.marc['245']['a'] =~ re_term
127         rec.rank += 5 if rec.marc['245']['a'] =~ re_term
128         rec.rank += 10 if rec.marc['245']['a'] =~  re_term2
129       end
130       self.records = self.records.sort_by{|record| record.rank}
131       self.records.reverse!
132     end
134     def remove_nil!
135       self.records.compact!
136       self.records.flatten!
137     end
138     
139     def hits_per_source 
140     end #=> hash{zurl=>[rec, rec],zurl=>[rec, rec]
141     
142     def []
143       
144     
145     end # Record at that position
146     
147     def empty?
148       if self.records.size == 0
149         return true
150       elsif self.records.size > 0
151         return false
152       end
153     end #returns true if the @ZCCRecords array is empty or only nil values
154     
155     #def find_all
156       #self.find_all {|record| record.selected}
157     #end
159     def <<(result_set)
160       #puts record
161       self.records << result_set.records
162       self.query = result_set.query
163       self.sort_by = result_set.sort_by      
164       self.records.flatten!
165       #puts self.records.inspect
166     end
168     
169   end