-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpolimapper.rb
86 lines (74 loc) · 1.78 KB
/
polimapper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
require 'pg'
require 'yaml'
class PoliMapper
def self.conn
@connection = @connection || PG::Connection.new(YAML.load_file('./db.yml'))
return @connection
end
def self.fill_model(table, model, fields, where=nil)
mapped_objects = Array.new
# assume we're not evil
query = "SELECT "
not_first = false
fields.each do |field|
query = query + "\"#{field[:name]}\", "
end
query = query.slice(0, query.length - 2)
query = query + " FROM \"#{table}\" "
unless where.nil?
query = query + " WHERE #{where}"
end
# run this puppy
puts query
results = conn.exec(query)
results.each do |row|
complete = true
fields.each do |field|
if(row[field].nil? && (field.has_key? :required && field[:required]))
complete = false
puts "skipped row"
break
end
end
if(complete)
mapped_objects.push(map(model, row))
end
end
return mapped_objects
end
def self.map(model, data)
res = nil
if(model.nil?)
res = nil
elsif(model.kind_of? Array)
res = map_arr(model, data)
elsif(model.kind_of? Hash)
res = map_hash(model, data)
elsif(model.kind_of? String)
res = map_string(model, data)
elsif(model.kind_of? Symbol)
res = map_symbol(model, data)
end
return res
end
def self.map_arr(model, data)
res = Array.new
model.each do |part|
res.push map(part, data)
end
return res
end
def self.map_hash(model, data)
res = Hash.new
model.keys.each do |key|
res.store(key, map(model[key], data))
end
return res
end
def self.map_string(model, data)
return data[model].to_s
end
def self.map_symbol(model, data)
return model
end
end