jungle_path 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +22 -0
  6. data/README.md +5 -0
  7. data/jungle_path.gemspec +43 -0
  8. data/lib/jungle_path/api/helpers/auth.rb +45 -0
  9. data/lib/jungle_path/api/helpers/auth_local_user.rb +284 -0
  10. data/lib/jungle_path/api/helpers/auth_old.rb +232 -0
  11. data/lib/jungle_path/api/helpers/data_cache.rb +20 -0
  12. data/lib/jungle_path/api/helpers/defaults.rb +83 -0
  13. data/lib/jungle_path/api/helpers/logging.rb +36 -0
  14. data/lib/jungle_path/api/helpers/query_filters.rb +15 -0
  15. data/lib/jungle_path/api/helpers/rescues.rb +15 -0
  16. data/lib/jungle_path/api/helpers/result.rb +16 -0
  17. data/lib/jungle_path/api/helpers/standard_apis.rb +280 -0
  18. data/lib/jungle_path/api/helpers.rb +16 -0
  19. data/lib/jungle_path/api/template.erb +35 -0
  20. data/lib/jungle_path/api.rb +5 -0
  21. data/lib/jungle_path/app/a.gitignore +1 -0
  22. data/lib/jungle_path/app/api/server_base.rb +95 -0
  23. data/lib/jungle_path/app/api/server_custom.rb +121 -0
  24. data/lib/jungle_path/app/api/server_gen.rb +11 -0
  25. data/lib/jungle_path/app/auth/authorization.rb +96 -0
  26. data/lib/jungle_path/app/config/a.gitignore +1 -0
  27. data/lib/jungle_path/app/config/config.rb +240 -0
  28. data/lib/jungle_path/app/config/override.rb +3 -0
  29. data/lib/jungle_path/app/config.ru +28 -0
  30. data/lib/jungle_path/app/logs/log_files_go_here +0 -0
  31. data/lib/jungle_path/app/run.sh +4 -0
  32. data/lib/jungle_path/app/schemas/schema.rb +21 -0
  33. data/lib/jungle_path/app/schemas/schema_all_in_one.rb +181 -0
  34. data/lib/jungle_path/app.rb +8 -0
  35. data/lib/jungle_path/authentication/auth_provider/default.rb +83 -0
  36. data/lib/jungle_path/authentication/auth_provider.rb +7 -0
  37. data/lib/jungle_path/authentication/data_provider/default.rb +144 -0
  38. data/lib/jungle_path/authentication/data_provider.rb +7 -0
  39. data/lib/jungle_path/authentication/helpers.rb +19 -0
  40. data/lib/jungle_path/authentication/identity.rb +30 -0
  41. data/lib/jungle_path/authentication/password_hash.rb +124 -0
  42. data/lib/jungle_path/authentication.rb +9 -0
  43. data/lib/jungle_path/authorization/filter.rb +106 -0
  44. data/lib/jungle_path/authorization/paths.rb +71 -0
  45. data/lib/jungle_path/authorization.rb +5 -0
  46. data/lib/jungle_path/cache.rb +36 -0
  47. data/lib/jungle_path/config.rb +65 -0
  48. data/lib/jungle_path/controller/authentication.rb +129 -0
  49. data/lib/jungle_path/controller/base.rb +193 -0
  50. data/lib/jungle_path/controller/helpers.rb +47 -0
  51. data/lib/jungle_path/controller/template.erb +14 -0
  52. data/lib/jungle_path/controller.rb +7 -0
  53. data/lib/jungle_path/db_access/import/db_dir.rb +74 -0
  54. data/lib/jungle_path/db_access/import/delete.rb +30 -0
  55. data/lib/jungle_path/db_access/import/insert.rb +168 -0
  56. data/lib/jungle_path/db_access/import/schema.rb +34 -0
  57. data/lib/jungle_path/db_access/import/select.rb +68 -0
  58. data/lib/jungle_path/db_access/import.rb +15 -0
  59. data/lib/jungle_path/db_access/io/chunked_file_reader.rb +62 -0
  60. data/lib/jungle_path/db_access/io/config.rb +19 -0
  61. data/lib/jungle_path/db_access/io/copy.rb +73 -0
  62. data/lib/jungle_path/db_access/io/db.rb +82 -0
  63. data/lib/jungle_path/db_access/io/delete.rb +23 -0
  64. data/lib/jungle_path/db_access/io/init_db.rb +39 -0
  65. data/lib/jungle_path/db_access/io/insert.rb +24 -0
  66. data/lib/jungle_path/db_access/io/schema.rb +21 -0
  67. data/lib/jungle_path/db_access/io/select.rb +44 -0
  68. data/lib/jungle_path/db_access/io/update.rb +36 -0
  69. data/lib/jungle_path/db_access/io.rb +104 -0
  70. data/lib/jungle_path/db_model/column.rb +186 -0
  71. data/lib/jungle_path/db_model/params.rb +60 -0
  72. data/lib/jungle_path/db_model/schema.rb +100 -0
  73. data/lib/jungle_path/db_model/string.rb +9 -0
  74. data/lib/jungle_path/db_model/table.rb +307 -0
  75. data/lib/jungle_path/db_model.rb +34 -0
  76. data/lib/jungle_path/exceptions.rb +10 -0
  77. data/lib/jungle_path/gen/api.rb +52 -0
  78. data/lib/jungle_path/gen/controller.rb +0 -0
  79. data/lib/jungle_path/gen/db.rb +0 -0
  80. data/lib/jungle_path/gen/schema.rb +47 -0
  81. data/lib/jungle_path/gen/schema_tree/filter.rb +33 -0
  82. data/lib/jungle_path/gen/schema_tree/match_columns.rb +54 -0
  83. data/lib/jungle_path/gen/schema_tree/match_table_data.rb +22 -0
  84. data/lib/jungle_path/gen/schema_tree/match_tables.rb +70 -0
  85. data/lib/jungle_path/gen/schema_tree/node.rb +39 -0
  86. data/lib/jungle_path/gen/schema_tree.rb +105 -0
  87. data/lib/jungle_path/gen.rb +9 -0
  88. data/lib/jungle_path/json/base.rb +29 -0
  89. data/lib/jungle_path/json/time.rb +8 -0
  90. data/lib/jungle_path/json.rb +6 -0
  91. data/lib/jungle_path/logging.rb +23 -0
  92. data/lib/jungle_path/query/alias_info.rb +16 -0
  93. data/lib/jungle_path/query/engine.rb +878 -0
  94. data/lib/jungle_path/query/entity.rb +141 -0
  95. data/lib/jungle_path/query/field.rb +28 -0
  96. data/lib/jungle_path/query/field_primary_key.rb +27 -0
  97. data/lib/jungle_path/query/filter.rb +34 -0
  98. data/lib/jungle_path/query/float_value.rb +16 -0
  99. data/lib/jungle_path/query/from.rb +33 -0
  100. data/lib/jungle_path/query/int_value.rb +16 -0
  101. data/lib/jungle_path/query/limit.rb +19 -0
  102. data/lib/jungle_path/query/nested_hash_sorter.rb +94 -0
  103. data/lib/jungle_path/query/operator.rb +17 -0
  104. data/lib/jungle_path/query/query.rb +23 -0
  105. data/lib/jungle_path/query/sort_field.rb +34 -0
  106. data/lib/jungle_path/query/sql_string.rb +145 -0
  107. data/lib/jungle_path/query/string_value.rb +16 -0
  108. data/lib/jungle_path/query.rb +19 -0
  109. data/lib/jungle_path/rack/basic_credentials.rb +70 -0
  110. data/lib/jungle_path/rack/json_body_parser.rb +41 -0
  111. data/lib/jungle_path/rack.rb +6 -0
  112. data/lib/jungle_path/schema/auth.rb +83 -0
  113. data/lib/jungle_path/schema/base.rb +6 -0
  114. data/lib/jungle_path/schema/db.rb +10 -0
  115. data/lib/jungle_path/schema/version.rb +19 -0
  116. data/lib/jungle_path/schema.rb +8 -0
  117. data/lib/jungle_path/sql/auth_local_user.rb +5 -0
  118. data/lib/jungle_path/sql/general.rb +10 -0
  119. data/lib/jungle_path/sql/helpers.rb +11 -0
  120. data/lib/jungle_path/sql/key.rb +107 -0
  121. data/lib/jungle_path/sql/query_filter.rb +5 -0
  122. data/lib/jungle_path/sql/role.rb +5 -0
  123. data/lib/jungle_path/sql/user.rb +35 -0
  124. data/lib/jungle_path/sql/user_role.rb +5 -0
  125. data/lib/jungle_path/sql.rb +12 -0
  126. data/lib/jungle_path.rb +13 -0
  127. data/test.rb +33 -0
  128. data/test2.rb +15 -0
  129. metadata +200 -0
@@ -0,0 +1,307 @@
1
+ require 'set'
2
+ require 'jungle_path/json'
3
+ require 'jungle_path/db_model'
4
+
5
+ module JunglePath
6
+ module DBModel
7
+ class Table
8
+ @models = {}
9
+ def self.set_columns
10
+ @columns = {}
11
+ @non_audit_columns = {}
12
+ @primary_key_columns = {}
13
+ @alternate_key_columns = {}
14
+ @foreign_key_columns = {}
15
+ @foreign_key_columns_by_table_name = {}
16
+ @references = Set.new
17
+ @secure_columns = {}
18
+ @unique_indexes = []
19
+ @indexes = []
20
+ @table_name = self.name.split('::').last.underscore.to_sym
21
+ @tagged_columns = {}
22
+ @sequence = 0
23
+ end
24
+
25
+ def self.columns
26
+ @columns
27
+ end
28
+
29
+ def self.columns_alphabetical_order
30
+ @columns.values.clone.sort { |a,b| a.name <=> b.name }
31
+ end
32
+
33
+ def self.columns_sequence_order
34
+ @columns.values.clone.sort { |a,b| a.sequence <=> b.sequence }
35
+ end
36
+
37
+ def self.non_audit_columns
38
+ @non_audit_columns
39
+ end
40
+
41
+ def self.primary_key_columns
42
+ @primary_key_columns
43
+ end
44
+
45
+ def self.alternate_key_columns
46
+ @alternate_key_columns
47
+ end
48
+
49
+ def self.foreign_key_columns
50
+ @foreign_key_columns
51
+ end
52
+
53
+ def self.foreign_key_columns_by_table_name
54
+ @foreign_key_columns_by_table_name
55
+ end
56
+
57
+ def self.tagged_columns
58
+ #call like: TableClass.tagged_columns[:my_tag] to return set of columns having given tag.
59
+ @tagged_columns
60
+ end
61
+
62
+ def self.references
63
+ @references
64
+ end
65
+
66
+ def self.has_reference_to?(table)
67
+ @references.member?(table.table_name)
68
+ end
69
+
70
+ def self.has_references?
71
+ !@references.empty?
72
+ end
73
+
74
+ def self.has_no_references?
75
+ !self.has_references?
76
+ end
77
+
78
+ def self.secure_columns
79
+ @secure_columns
80
+ end
81
+
82
+ def self.table_name
83
+ @table_name
84
+ end
85
+
86
+ def self.plural_table_name
87
+ "#{@table_name}s"
88
+ end
89
+
90
+ def self.description
91
+ @description
92
+ end
93
+
94
+ def self.description=(value)
95
+ @description = value
96
+ end
97
+
98
+ def self.inherited(sub_class)
99
+ sub_class.set_columns #setup subclass with particular class instance vars.
100
+ @models = {} unless @models
101
+ @models[sub_class.table_name] = sub_class #keep a list of all subclasses.
102
+ end
103
+
104
+ def self.models
105
+ @models
106
+ end
107
+
108
+ def self.models_alphabetical_order
109
+ @models.values.clone.sort { |a,b| a.table_name <=> b.table_name }
110
+ end
111
+
112
+ def self.models_dependent_order
113
+ result = self.model_sort(@models.values.clone)
114
+ # map array of table names into an array of table (model) classes.
115
+ result.map {|key| @models[key]}
116
+ end
117
+
118
+ def self.model_sort(list, result=Set.new, level=0)
119
+ # return array of table names sorted in dependency order (not alphabetical order).
120
+ puts "level: #{level}."
121
+ remaining = []
122
+ list.each do |value|
123
+ puts "\tvalue: #{value.table_name}. references: #{value.references.to_a}."
124
+ if value.has_no_references?
125
+ puts "\tadding: #{value.table_name}."
126
+ result << value.table_name
127
+ elsif value.references.subset? result
128
+ puts "\tadding: #{value.table_name}."
129
+ result << value.table_name
130
+ else
131
+ remaining << value
132
+ end
133
+ end
134
+ puts "\tresult: #{result.length}: #{result.to_a}."
135
+ puts "\tremaining: #{remaining.length}: #{remaining}."
136
+ return [] if level > 10 #something is wrong!!!
137
+ result = self.model_sort(remaining, result, level + 1) if remaining.length > 0
138
+ result
139
+ end
140
+
141
+ def self.define(*column_defs)
142
+ set_columns
143
+
144
+ column_defs.each do |column_def|
145
+ # one column_def may produce multiple actual columns:
146
+ columns = Column.get_column_def_columns(column_def, @sequence)
147
+ columns.each do |column|
148
+ @sequence = column.sequence + 1
149
+ self.columns[column.name] = column
150
+ self.primary_key_columns[column.name] = column if column.primary_key?
151
+ self.alternate_key_columns[column.name] = column if column.alternate_key?
152
+ self.foreign_key_columns[column.name] = column if column.foreign_key?
153
+
154
+ if column.foreign_key?
155
+ hash = self.foreign_key_columns_by_table_name
156
+ sub_hash = hash[column.foreign_key_table_name]
157
+ sub_hash = {} unless sub_hash
158
+ sub_hash[column.name] = column
159
+ hash[column.foreign_key_table_name] = sub_hash
160
+ end
161
+
162
+ if column.tags
163
+ column.tags.each do |tag|
164
+ tagged_columns = @tagged_columns[tag] || Set.new
165
+ tagged_columns.add(column)
166
+ @tagged_columns[tag] = tagged_columns
167
+ end
168
+ end
169
+
170
+ self.references << column.foreign_key_table_name if column.foreign_key? and column.foreign_key_table_name != self.table_name
171
+ self.secure_columns[column.name] = column if column.secure?
172
+ self.non_audit_columns[column.name] = column unless column.is_audit_column?
173
+ #attr_accessor column.name
174
+ define_method(column.name) do
175
+ @values[column.name]
176
+ end
177
+ define_method("#{column.name}=") do |value|
178
+ if value != @values[column.name]
179
+ @values[column.name] = value
180
+ @modified.add(column.name)
181
+ end
182
+ end
183
+ end
184
+ self.primary_key_columns.values[0].calculated = true if self.primary_key_columns.length == 1
185
+ end
186
+
187
+ define_method("_values") do
188
+ @values
189
+ end
190
+
191
+ define_method("_modified") do
192
+ @modified
193
+ end
194
+
195
+ define_method("_modified_hash") do
196
+ hash = {}
197
+ @modified.each do |key|
198
+ hash[key] = @values[key]
199
+ end
200
+ hash
201
+ end
202
+
203
+ define_method("_has_value_hash") do
204
+ hash = {}
205
+ @values.each do |key, value|
206
+ hash[key] = value unless value == nil
207
+ end
208
+ hash
209
+ end
210
+
211
+ define_method("_primary_key") do
212
+ primary_key = {}
213
+ _primary_key_columns.keys.each do |key|
214
+ primary_key[key] = @values[key]
215
+ end
216
+ primary_key
217
+ end
218
+
219
+ define_method("_alternate_key") do
220
+ alternate_key = {}
221
+ _alternate_key_columns.keys.each do |key|
222
+ alternate_key[key] = @values[key]
223
+ end
224
+ alternate_key
225
+ end
226
+
227
+ define_method("_consume_hash") do |hash, mark_as_modified_if_changed=true|
228
+ @values.each do |key, value|
229
+ if hash.has_key?(key) and @values[key] != hash[key]
230
+ @values[key] = hash[key]
231
+ @modified.add(key) if mark_as_modified_if_changed
232
+ end
233
+ end
234
+ end
235
+
236
+ define_method("_columns") do
237
+ self.class.columns
238
+ end
239
+
240
+ define_method("_primary_key_columns") do
241
+ self.class.primary_key_columns
242
+ end
243
+
244
+ define_method("_alternate_key_columns") do
245
+ self.class.alternate_key_columns
246
+ end
247
+
248
+ define_method("_foreign_key_columns") do
249
+ self.class.foreign_key_columns
250
+ end
251
+
252
+ define_method("_secure_columns") do
253
+ self.class.secure_columns
254
+ end
255
+
256
+ define_method("_tagged_columns") do
257
+ self.class.tagged_columns
258
+ end
259
+
260
+ define_method("_table_name") do
261
+ self.class.table_name
262
+ end
263
+
264
+ define_method("_secure?") do
265
+ @secure
266
+ end
267
+
268
+ define_method("_secure=") do |value|
269
+ @secure = value
270
+ end
271
+
272
+ define_method("to_hash") do
273
+ #puts "#{_table_name} to_hash."
274
+ return @values.clone if _secure_columns.length == 0 or !_secure?
275
+ hash = {}
276
+ puts "stripping secure columns!"
277
+ @values.each do |key, value|
278
+ hash[key] = value unless _secure_columns.has_key?(key)
279
+ end
280
+ hash
281
+ end
282
+
283
+ define_method("to_h") do
284
+ # ruby way :)
285
+ to_hash
286
+ end
287
+
288
+ define_method("to_json") do |arg=nil|
289
+ #puts "#{_table_name} to_json."
290
+ #puts "to_json - arg: #{arg.class}" if arg
291
+ json = JsonWrap.dump self
292
+ #puts json
293
+ json
294
+ end
295
+ end
296
+
297
+ def initialize(hash=nil, mark_as_modified_if_changed=true, transform_params=false)
298
+ @values = {}
299
+ @secure = true
300
+ _columns.keys.each do |key| @values[key] = nil end
301
+ @modified = Set.new # holds hash keys of modified values.
302
+ hash = DBModel::Params.transform(hash, _columns) if transform_params
303
+ _consume_hash(hash, mark_as_modified_if_changed) if hash
304
+ end
305
+ end
306
+ end
307
+ end
@@ -0,0 +1,34 @@
1
+ # db_model.rb
2
+ # db_model
3
+ # Create ruby classes (models) based on database table definitions.
4
+ # Schema class (using the Sequel gem) can generate database tables from your models.
5
+ #
6
+ # Example from gbwho app's schema.rb file:
7
+ #
8
+ # require_relative '../lib/db_model'
9
+ #
10
+ # module Schema
11
+ # class User < DBModel::Table
12
+ # define(
13
+ # [:id, :primary_key],
14
+ # [:user_name, :string, :unique, :not_null, :alternate_key],
15
+ # [:hash, :string, :not_null, :secure, :calculated, :desc, "See password_hash.rb for details."],
16
+ # [:name, :string, :not_null, :desc, "Your human name! :)"],
17
+ # [:email, :string, :not_null],
18
+ # [:audit])
19
+ # end
20
+ # end
21
+
22
+ require 'set'
23
+ #require_relative 'json_wrap'
24
+ require 'jungle_path/json'
25
+
26
+ module JunglePath
27
+ module DBModel
28
+ require 'jungle_path/db_model/string'
29
+ require 'jungle_path/db_model/column'
30
+ require 'jungle_path/db_model/table'
31
+ require 'jungle_path/db_model/schema'
32
+ require 'jungle_path/db_model/params'
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module JunglePath
2
+ module Exceptions
3
+ # Exception classes:
4
+ class InvalidAPIKeyException < RuntimeError; end
5
+ class InvalidPassword < RuntimeError; end
6
+ class MissingRequiredFields < RuntimeError; end
7
+ class NotFoundException < RuntimeError; end
8
+ class TestException < RuntimeError; end
9
+ end
10
+ end
@@ -0,0 +1,52 @@
1
+ require 'erb'
2
+ require 'jungle_path/db_model/table'
3
+
4
+ module JunglePath
5
+ module DBModel
6
+ class Table
7
+ # Adds useful methods to Table class for use when generating API and Model code:
8
+
9
+ def self.template_new
10
+ "#{self.name}.new"
11
+ end
12
+
13
+ def self.template_pk_url
14
+ pk = self.primary_key_columns.keys.map {|key| "/:#{key}"}
15
+ pk.join
16
+ end
17
+
18
+ def self.template_model_name
19
+ "Model::#{self.name.split('::').last}"
20
+ end
21
+
22
+ def self.template_params_pk_hash
23
+ #{id: p[:id]}
24
+ array = []
25
+ self.primary_key_columns.keys.each do |key|
26
+ array << "#{key}: p[:#{key}]"
27
+ end
28
+ "{#{array.join(',')}}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ module JunglePath
35
+ module Gen
36
+ def self.api(app_root_path, tables, output_file='./api/api_gen.rb', name_space='ServerAPI', controller_name_space='Controller', template_file=nil)
37
+ if template_file
38
+ template_file = ::File.expand_path(template_file, app_root_path)
39
+ else
40
+ template_file = ::File.expand_path('./api_template.erb', ::File.dirname(__FILE__))
41
+ end
42
+
43
+ # template uses name_space and controller_name_space vars:``
44
+ template = ERB.new(File.read(template_file))
45
+
46
+ output_file = ::File.expand_path(output_file, app_root_path)
47
+ result = template.result(binding)
48
+ #puts result
49
+ File.write(output_file, result)
50
+ end
51
+ end
52
+ end
File without changes
File without changes
@@ -0,0 +1,47 @@
1
+ # gen_schema.rb -- creates a database schema from a set of DBModel::Table (sub)classes.
2
+ require 'logger'
3
+ require 'sequel'
4
+ require 'jungle_path/db_model'
5
+ require 'jungle_path/db_access'
6
+
7
+ # todo: fix ! vs "" vs ? method calls...
8
+ module JunglePath
9
+ module Gen
10
+ module Schema
11
+ def self.create(table_subclasses, db_config, logger=$stdout)
12
+ puts "Gen::Schema.create..."
13
+ db = JunglePath::DBAccess.connection_from_config(db_config)
14
+ db.loggers << Logger.new(logger)
15
+ schema = JunglePath::DBModel::Schema.new(db)
16
+ table_subclasses.each do |table|
17
+ puts "create table: #{table.table_name}"
18
+ schema.create_table table
19
+ end
20
+ end
21
+
22
+ def self.set_version schema_info_class, db_config, schema_initial_version
23
+ # set starting version numnber
24
+ db = JunglePath::DBAccess::DB.new(db_config)
25
+ db.schema.create_table schema_info_class
26
+ if schema_initial_version
27
+ schema_info = schema_info_class.new({version: schema_initial_version})
28
+ db.insert._model(schema_info)
29
+ end
30
+ end
31
+
32
+ def self.set_version_to_latest schema_info_class, db_config, migrations_path
33
+ version = 0
34
+ migration_files = Dir.glob(File.join(migrations_path, "*.rb"))
35
+ migration_files.each do |file_name|
36
+ puts file_name
37
+ parts = File.basename(file_name).split('_')
38
+ if parts.length > 0
39
+ value = parts[0].to_i
40
+ version = value if value > version
41
+ end
42
+ end
43
+ set_version schema_info_class, db_config, version
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ module JunglePath
2
+ module Gen
3
+ module SchemaTree
4
+ class Filter
5
+ def initialize hash=nil
6
+ throw "Invalid data parameter: expected a hash, but got this: #{hash}" unless hash.class == Hash or hash == nil
7
+ allow = hash[:allow] if hash
8
+ deny = hash[:deny] if hash
9
+ @match_tables_allow = MatchTables.new allow
10
+ @match_tables_deny = MatchTables.new deny
11
+ end
12
+ def allow? table_name, column_name=nil
13
+ if @match_tables_allow.matched?(table_name, column_name)
14
+ if column_name and @match_tables_deny.matched?(table_name, column_name)
15
+ return false
16
+ end
17
+ if column_name and !@match_tables_deny.matched?(table_name, column_name)
18
+ return true
19
+ end
20
+ if !column_name and @match_tables_deny.matched?(table_name) and !@match_tables_deny.includes_columns?(table_name)
21
+ return false
22
+ end
23
+ if !column_name and @match_tables_deny.includes_columns?(table_name)
24
+ return true
25
+ end
26
+ return true
27
+ end
28
+ false
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,54 @@
1
+ module JunglePath
2
+ module Gen
3
+ module SchemaTree
4
+ class MatchColumns
5
+ attr_reader :is_nil
6
+ def initialize columns
7
+ @is_nil = false
8
+ @hash = {}
9
+ @regexes = []
10
+ if columns
11
+ if columns.class == Symbol
12
+ @hash[columns] = true
13
+ elsif columns.class == String
14
+ @hash[columns.to_sym] = true
15
+ elsif columns.class == Regexp
16
+ @regexes << columns
17
+ elsif columns.class == Array and columns.length > 0
18
+ columns.each do |col|
19
+ if col.class == Symbol
20
+ @hash[col] = true
21
+ elsif columns.class == String
22
+ @hash[col.to_sym] = true
23
+ elsif col.class == Regexp
24
+ @regexes << col
25
+ else
26
+ throw "Invalid type for col array item: #{col.class}, value: #{col}."
27
+ end
28
+ end
29
+ elsif columns.class == Array
30
+ @is_nil = true
31
+ else
32
+ throw "Invalid type for columns parameter: #{columns.class}, value: #{columns}."
33
+ end
34
+ else
35
+ @is_nil = true
36
+ end
37
+ end
38
+
39
+ def matched? column_name
40
+ return true if @is_nil
41
+ return true if @hash[column_name.to_sym]
42
+ @regexes.each do |regx|
43
+ return true if regx =~ column_name.to_s
44
+ end
45
+ false
46
+ end
47
+
48
+ def to_s
49
+ "is_nil: #{@is_nil}, hash: #{@hash}, regexes: #{@regexes}."
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,22 @@
1
+ module JunglePath
2
+ module Gen
3
+ module SchemaTree
4
+ class MatchTableData
5
+ attr_reader :name, :columns, :regexp
6
+ def initialize name, columns
7
+ @name = name
8
+ @columns = MatchColumns.new(columns)
9
+ @regexp = @name if @name and @name.class == Regexp
10
+ end
11
+
12
+ def nil_columns?
13
+ @columns.is_nil
14
+ end
15
+
16
+ def to_s
17
+ "name: #{@name}, columns: #{@columns}, regexp: #{@regexp}."
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,70 @@
1
+ module JunglePath
2
+ module Gen
3
+ module SchemaTree
4
+ class MatchTables
5
+ def initialize data
6
+ @hash = {}
7
+ @match_data = []
8
+ throw "Invalid data parameter: expected an array, but got this: #{data}" unless data.class == Array or data == nil
9
+ if data
10
+ data.each do |h|
11
+ if h.class == Hash
12
+ table = h[:table]
13
+ puts "table: #{table}."
14
+ columns = h[:columns]
15
+ puts "columns: #{columns}."
16
+ if table
17
+ mtd = MatchTableData.new(table, columns)
18
+ puts "mtd: #{mtd}."
19
+ @hash[mtd.name] = mtd
20
+ @match_data << mtd if mtd.regexp
21
+ else
22
+ throw "Invalid hash -- missing key :table. Got this: #{h}."
23
+ end
24
+ else
25
+ throw "Invalid data item. Expected hash got this: #{h}."
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ def matched? table_name, column_name=nil
32
+ if table_name
33
+ match_table_data = get_match_table_data(table_name)
34
+ if match_table_data
35
+ if column_name
36
+ return match_table_data.columns.matched?(column_name)
37
+ else
38
+ return true
39
+ end
40
+ end
41
+ end
42
+ false
43
+ end
44
+
45
+ def includes_columns? table_name
46
+ if table_name
47
+ match_table_data = get_match_table_data(table_name)
48
+ return !match_table_data.nil_columns? if match_table_data
49
+ end
50
+ false
51
+ end
52
+
53
+ def to_s
54
+ "@hash: #{@hash}\n@match_data: #{@match_data}."
55
+ end
56
+
57
+ private
58
+
59
+ def get_match_table_data table_name
60
+ match_table_data = @hash[table_name.to_sym]
61
+ return match_table_data if match_table_data
62
+ @match_data.each do |mtd|
63
+ return mtd if mtd.regexp =~ table_name.to_s
64
+ end
65
+ nil
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,39 @@
1
+ module JunglePath
2
+ module Gen
3
+ module SchemaTree
4
+ class Node
5
+ attr_accessor :name, :symbol, :child_table_name, :child_table_join_column_name, :parent_table_join_column_name, :nodes, :tables_hash
6
+
7
+ def initialize(name, symbol=nil, child_table_name=nil, child_table_join_column_name=nil, parent_table_join_column_name=nil)
8
+ @name = name
9
+ @symbol = symbol
10
+ @child_table_name = child_table_name
11
+ @child_table_join_column_name = child_table_join_column_name
12
+ @parent_table_join_column_name = parent_table_join_column_name
13
+ @nodes = {}
14
+ end
15
+
16
+ def str_name
17
+ return "#{name} #{symbol} #{child_table_name}.#{child_table_join_column_name.to_s[0..-4]}" if (child_table_join_column_name and (symbol == "<=" or symbol == "<-"))
18
+ return "#{name} #{symbol} #{child_table_name}" if symbol
19
+ "#{name}"
20
+ end
21
+
22
+ def to_str(level=0)
23
+ indent = " " * level
24
+ result = ["#{indent}#{str_name}"]
25
+ nodes.each do |k, v|
26
+ if v.class == ::Array
27
+ v.each do |item|
28
+ result << item.to_str(level + 1)
29
+ end
30
+ else
31
+ result << v.to_str(level + 1)
32
+ end
33
+ end
34
+ result.join("\n")
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end