xamplr 1.2.0 → 1.3.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.document +5 -0
  2. data/.gitignore +12 -0
  3. data/CHANGES.txt +37 -0
  4. data/COPYING +661 -0
  5. data/Makefile +13 -0
  6. data/README.rdoc +24 -4
  7. data/Rakefile +2 -2
  8. data/VERSION.yml +3 -2
  9. data/bin/xampl-gen +17 -0
  10. data/docs/intro/.gitignore +1 -0
  11. data/docs/intro/example1/example1.rb +6 -0
  12. data/docs/intro/example1/xml/hello.xml +1 -0
  13. data/docs/intro/example2/example2.rb +38 -0
  14. data/docs/intro/example2/project-generator.rb +22 -0
  15. data/docs/intro/example2/xml/hello.xml +2 -0
  16. data/docs/intro/example3/example3.rb +30 -0
  17. data/docs/intro/example3/example3a.rb +16 -0
  18. data/docs/intro/example3/generated.png +0 -0
  19. data/docs/intro/example3/grab-yuml.rb +10 -0
  20. data/docs/intro/example3/greeter.rb +15 -0
  21. data/docs/intro/example3/greeting.rb +9 -0
  22. data/docs/intro/example3/project-generator.rb +25 -0
  23. data/docs/intro/example3/xml/greeter.xml +6 -0
  24. data/docs/intro/example4/example4.rb +27 -0
  25. data/docs/intro/example4/example4a.rb +19 -0
  26. data/docs/intro/example4/grab-yuml.rb +10 -0
  27. data/docs/intro/example4/greeter.rb +15 -0
  28. data/docs/intro/example4/greeting.rb +9 -0
  29. data/docs/intro/example4/project-generator.rb +25 -0
  30. data/docs/intro/example4/xml/greeter.xml +6 -0
  31. data/docs/intro/grab-yuml.rb +10 -0
  32. data/docs/intro/project-generator.rb +51 -0
  33. data/docs/intro/xampl.lyx +1494 -0
  34. data/docs/intro/xampl.pdf +0 -0
  35. data/examples/employees/final/xampl-gen.rb +38 -0
  36. data/examples/employees/final/xml/ddd-final.xml +86 -0
  37. data/examples/employees/final-xampl/xampl-gen.rb +38 -0
  38. data/examples/employees/final-xampl/xml/ddd-final-xampl.xml +86 -0
  39. data/examples/employees/first/xampl-gen.rb +38 -0
  40. data/examples/employees/first/xml/ddd-first.xml +48 -0
  41. data/examples/employees/twist/twist.graphml +333 -0
  42. data/examples/employees/twist/xampl-gen.rb +38 -0
  43. data/examples/employees/twist/xml/twist.xml +90 -0
  44. data/examples/employees/xamplr-twist.xml +2 -0
  45. data/examples/employees/yuml-diagrams/DDD-final-approach.graphml +393 -0
  46. data/examples/employees/yuml-diagrams/DDD-final-xampl-approach.graphml +265 -0
  47. data/examples/employees/yuml-diagrams/DDD-ideal-final-approach.graphml +357 -0
  48. data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
  49. data/examples/employees/yuml-diagrams/ddd-final.yuml +8 -0
  50. data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
  51. data/examples/employees/yuml-diagrams/ddd-first.yuml +7 -0
  52. data/examples/employees/yuml-diagrams/final-yed.png +0 -0
  53. data/examples/employees/yuml-diagrams/first-yed.png +0 -0
  54. data/examples/employees/yuml-diagrams/twist.png +0 -0
  55. data/examples/employees/yuml-diagrams/twist.yuml +12 -0
  56. data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
  57. data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
  58. data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
  59. data/examples/employees/yuml-diagrams/yuml-simplified.txt +19 -0
  60. data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +53 -0
  61. data/examples/employees/yuml-diagrams/yuml.txt +27 -0
  62. data/examples/hobbies/Makefile +5 -0
  63. data/examples/hobbies/hobbies.rb +193 -0
  64. data/examples/hobbies/project-generator.rb +25 -0
  65. data/examples/hobbies/xampl-gen.rb +38 -0
  66. data/examples/hobbies/xml/hobby.xml +3 -0
  67. data/examples/hobbies/xml/people.xml +5 -0
  68. data/examples/random-people/.gitignore +2 -0
  69. data/examples/random-people/Makefile +5 -1
  70. data/examples/random-people/xampl-gen.rb +5 -2
  71. data/examples/random-people-shared-addresses/.gitignore +2 -0
  72. data/examples/random-people-shared-addresses/Makefile +8 -9
  73. data/examples/random-people-shared-addresses/batch-load-users-profiled.rb +91 -0
  74. data/examples/random-people-shared-addresses/batch-load-users-safe.rb +81 -0
  75. data/examples/random-people-shared-addresses/batch-load-users.rb +59 -63
  76. data/examples/random-people-shared-addresses/xampl-gen.rb +2 -0
  77. data/examples/read-testing/.gitignore +2 -0
  78. data/examples/read-testing/rrr.rb +2 -1
  79. data/examples/read-testing/xampl-gen.rb +2 -0
  80. data/examples/tokyo-cabinet-experimental/.gitignore +2 -0
  81. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +2 -0
  82. data/examples/write-testing/README +4 -0
  83. data/examples/write-testing/RESULTS.home +33 -0
  84. data/examples/write-testing/RESULTS.raconteur +33 -0
  85. data/examples/write-testing/write-speed-test.rb +40 -0
  86. data/lib/xamplr/.cvsignore +1 -0
  87. data/lib/xamplr/TODO +2 -1
  88. data/lib/xamplr/exceptions.rb +24 -1
  89. data/lib/xamplr/from-xml.rb +13 -5
  90. data/lib/xamplr/graphml-out.rb +6 -25
  91. data/lib/xamplr/indexed-array.rb +10 -2
  92. data/lib/xamplr/persist-to-xml.rb +6 -7
  93. data/lib/xamplr/persistence.rb +132 -48
  94. data/lib/xamplr/persister.rb +48 -25
  95. data/lib/xamplr/persisters/filesystem.rb +8 -2
  96. data/lib/xamplr/persisters/tokyo-cabinet.rb +243 -63
  97. data/lib/xamplr/persisters/tokyo-cabinet.rb.1-DB +694 -0
  98. data/lib/xamplr/persisters/tokyo-cabinet.rb.N-DB +692 -0
  99. data/lib/xamplr/persisters/tokyo-cabinet.rb.NICE-TRY +807 -0
  100. data/lib/xamplr/templates/.cvsignore +3 -0
  101. data/lib/xamplr/templates/child_indexed.template +6 -6
  102. data/lib/xamplr/templates/element_data.template +2 -1
  103. data/lib/xamplr/templates/element_empty.template +2 -10
  104. data/lib/xamplr/templates/element_mixed.template +2 -1
  105. data/lib/xamplr/templates/element_simple.template +2 -1
  106. data/lib/xamplr/templates/package.template +13 -1
  107. data/lib/xamplr/visitor.rb +7 -6
  108. data/lib/xamplr/visitors.rb +2 -1
  109. data/lib/xamplr/xampl-cl-gen.rb +89 -0
  110. data/lib/xamplr/xampl-generator.rb +86 -50
  111. data/lib/xamplr/xampl-object.rb +51 -0
  112. data/lib/xamplr/xampl-persisted-object.rb +13 -4
  113. data/lib/xamplr/yuml-out.rb +129 -0
  114. data/lib/xamplr-generator.rb +0 -1
  115. data/lib/xamplr.rb +18 -18
  116. data/regression/tc-indexes-crossing-pid-boundaries/Makefile +14 -0
  117. data/regression/tc-indexes-crossing-pid-boundaries/bad-idea.rb +40 -0
  118. data/regression/tc-indexes-crossing-pid-boundaries/fail-badly.rb +17 -0
  119. data/regression/tc-indexes-crossing-pid-boundaries/fail.rb +11 -0
  120. data/regression/tc-indexes-crossing-pid-boundaries/fucking-bad-idea.rb +44 -0
  121. data/regression/tc-indexes-crossing-pid-boundaries/setup.rb +15 -0
  122. data/regression/tc-indexes-crossing-pid-boundaries/xml/bad-idea.xml +4 -0
  123. data/regression/tightly-nested-mutual-mentions/Makefile +14 -0
  124. data/regression/tightly-nested-mutual-mentions/build.rb +31 -0
  125. data/regression/tightly-nested-mutual-mentions/load.rb +21 -0
  126. data/regression/tightly-nested-mutual-mentions/repo-keep.tgz +0 -0
  127. data/regression/tightly-nested-mutual-mentions/setup.rb +8 -0
  128. data/regression/tightly-nested-mutual-mentions/xampl-gen.rb +36 -0
  129. data/regression/tightly-nested-mutual-mentions/xml/stuff.xml +7 -0
  130. data/xamplr.gemspec +322 -0
  131. metadata +116 -13
  132. data/test/test_helper.rb +0 -10
  133. data/test/xamplr_test.rb +0 -7
@@ -0,0 +1,193 @@
1
+ require 'rubygems'
2
+ require 'xampl_generated_code/Hobbies'
3
+
4
+ #Xampl.set_default_persister_properties(kind: :tokyo_cabinet)
5
+ #Xampl.set_default_persister_properties(kind: :tokyo_cabinet, write_through: true)
6
+ Xampl.set_default_persister_properties(kind: :tokyo_cabinet, write_through: :sync)
7
+
8
+ module Hobbies
9
+
10
+ class Hobby
11
+ def Hobby.indexed_attributes
12
+ %w{ hobby-name }
13
+ end
14
+
15
+ Xampl.add_lexical_indexs(Hobby.indexed_attributes)
16
+
17
+ # puts "#{ __FILE__ }:#{ __LINE__ } lexical indexes: #{ Hobby.indexed_attributes.inspect }"
18
+
19
+ def describe_yourself
20
+ description = {
21
+ 'hobby-name' => self.name
22
+ }
23
+
24
+ # puts "#{ __FILE__ }:#{ __LINE__ } description: #{ description.inspect }"
25
+
26
+ return description
27
+ end
28
+ end
29
+
30
+ class Person
31
+ def Person.indexed_attributes
32
+ %w{ person-name person-hobby }
33
+ end
34
+
35
+ Xampl.add_lexical_indexs(Hobby.indexed_attributes)
36
+
37
+ # puts "#{ __FILE__ }:#{ __LINE__ } lexical indexes: #{ Person.indexed_attributes.inspect }"
38
+
39
+ def describe_yourself
40
+ description = {
41
+ 'person-name' => self.name
42
+ }
43
+
44
+ additional_descriptions = []
45
+
46
+ self.hobby.each do | hobby |
47
+ additional_descriptions << {
48
+ 'person-hobby' => hobby.name
49
+ }
50
+ end
51
+
52
+ # puts "#{ __FILE__ }:#{ __LINE__ } description: #{ description.inspect }, additional: #{ additional_descriptions.inspect }"
53
+
54
+ return description, additional_descriptions
55
+ end
56
+ end
57
+
58
+ start_at = Time.now.to_i
59
+
60
+ repo_name = "hobbies-#{ start_at }"
61
+
62
+ Xampl.transaction(repo_name) do
63
+
64
+ (reading = Hobby.new('reading')).name = 'reading'
65
+ (tv = Hobby.new('tv')).name = 'tv'
66
+ (birds = Hobby.new('birds')).name = 'birds'
67
+
68
+ (jack = Person.new('jack')).name = 'Jack'
69
+ (jill = Person.new('jill')).name = 'Jill'
70
+
71
+ jack << reading
72
+ jack << tv
73
+
74
+ jill << reading
75
+ jill << birds
76
+ end
77
+
78
+ # Xampl.transaction(repo_name) do
79
+ # jack = Person['jack']
80
+ # jill = Person['jill']
81
+ #
82
+ # puts jack.pp_xml
83
+ # puts jill.pp_xml
84
+ # end
85
+
86
+ Xampl.transaction(repo_name) do
87
+ people = Person.find_by_query do | q |
88
+ q.add_condition('person-name', :streq, 'Jill')
89
+ q.order_by('person-name')
90
+ end
91
+
92
+ puts "#{ __FILE__ }:#{ __LINE__ } found #{ people.size } people named Jill"
93
+ puts "#{ __FILE__ }:#{ __LINE__ } WRONG!! WRONG!! WRONG!! WRONG!! WRONG!! WRONG!! WRONG!! WRONG!!" unless 0 < people.size
94
+ end
95
+
96
+ #NOW... look for people with hobbies
97
+
98
+ Xampl.transaction(repo_name) do
99
+ people = Person.find_by_query do | q |
100
+ q.add_condition('person-hobby', :streq, 'reading')
101
+ q.order_by('person-name')
102
+ end
103
+
104
+ puts "#{ __FILE__ }:#{ __LINE__ } found #{ people.size } people with hobby 'reading'"
105
+ people.each { | person | puts "#{ __FILE__ }:#{ __LINE__ } #{ person.name }"}
106
+
107
+ people = Person.find_by_query do | q |
108
+ q.add_condition('person-hobby', :streq, 'birds')
109
+ q.order_by('person-name')
110
+ end
111
+
112
+ puts "#{ __FILE__ }:#{ __LINE__ } found #{ people.size } people with hobby 'birds'"
113
+ people.each { | person | puts "#{ __FILE__ }:#{ __LINE__ } #{ person.name }"}
114
+ end
115
+
116
+ #NOW... change hobby of someone and search again
117
+
118
+ Xampl.transaction(repo_name) do
119
+ jack = Person['jack']
120
+ # puts "#{ __FILE__ }:#{ __LINE__ } jack before: #{ jack.pp_xml }"
121
+ jack.remove_hobby('reading')
122
+
123
+ birds = Hobby['birds']
124
+ jack << birds if birds
125
+ end
126
+
127
+ #NOW... look for people with hobbies
128
+
129
+ Xampl.transaction(repo_name) do
130
+ people = Person.find_by_query do | q |
131
+ q.add_condition('person-name', :streq, 'Jack')
132
+ q.order_by('person-name')
133
+ end
134
+
135
+ puts "#{ __FILE__ }:#{ __LINE__ } found #{ people.size } people with name 'Jack'"
136
+ people.each { | person | puts "#{ __FILE__ }:#{ __LINE__ } #{ person.name }"}
137
+
138
+ people = Person.find_by_query do | q |
139
+ q.add_condition('person-hobby', :streq, 'reading')
140
+ q.order_by('person-name')
141
+ end
142
+
143
+ puts "#{ __FILE__ }:#{ __LINE__ } found #{ people.size } people with hobby 'reading'"
144
+ people.each { | person | puts "#{ __FILE__ }:#{ __LINE__ } #{ person.name }"}
145
+
146
+ people = Person.find_by_query do | q |
147
+ q.add_condition('person-hobby', :streq, 'birds')
148
+ q.order_by('person-name')
149
+ end
150
+
151
+ puts "#{ __FILE__ }:#{ __LINE__ } found #{ people.size } people with hobby 'birds'"
152
+ people.each { | person | puts "#{ __FILE__ }:#{ __LINE__ } #{ person.name }"}
153
+
154
+ found = Xampl.find_xampl do | q |
155
+ q.add_condition('person-hobby', :streq, 'birds')
156
+ q.order_by('person-name')
157
+ end
158
+ found.each_with_index do | xampl, i |
159
+ puts "#{ __FILE__ }:#{ __LINE__ } Xampl.find_xampl(#{ i }) -- #{ xampl.name }"
160
+ end
161
+
162
+ found = Xampl.find_xampl do | q |
163
+ q.add_condition('person-name', :streq, 'Jack')
164
+ q.order_by('person-name')
165
+ end
166
+ puts "#{ __FILE__ }:#{ __LINE__ } FOUND: #{ found.size }"
167
+ found.each_with_index do | xampl, i |
168
+ puts "#{ __FILE__ }:#{ __LINE__ } Xampl.find_xampl(#{ i }) -- #{ xampl.name }"
169
+ end
170
+
171
+ found = Xampl.find_pids do | q |
172
+ q.add_condition('person-hobby', :streq, 'birds')
173
+ q.order_by('person-name')
174
+ end
175
+ found.each_with_index do | xampl, i |
176
+ puts "#{ __FILE__ }:#{ __LINE__ } Xampl.find_pids(#{ i }) -- #{ xampl }"
177
+ end
178
+
179
+ found = Xampl.find_meta do | q |
180
+ q.add_condition('person-hobby', :streq, 'birds')
181
+ q.order_by('person-name')
182
+ end
183
+ found.each_with_index do | xampl, i |
184
+ puts "#{ __FILE__ }:#{ __LINE__ } Xampl.find_meta(#{ i }) -- #{ xampl.inspect }"
185
+ end
186
+
187
+ end
188
+
189
+ done_at = Time.now
190
+
191
+ p "#{ __FILE__ }:#{ __LINE__ } ran in #{ done_at - start_at }"
192
+
193
+ end
@@ -0,0 +1,25 @@
1
+ class ProjectGenerator
2
+
3
+ def print_options
4
+ # return an array containing any (or none) of:
5
+ # :schema -- a schema-like xml representation of the generated code
6
+ # :graphml -- a graphml file describing the class model (compatible with yEd)
7
+ # :yuml -- a yuml file that represents a simplified class model (compatible with yUML)
8
+
9
+ [ :yuml ]
10
+ end
11
+
12
+ def resolve_namespaces
13
+ # any array of arrays
14
+ # each sub-array:
15
+ # 0: a string or an array of strings, containing xml namespaces found
16
+ # in the example xml files an empty string is the default namespace
17
+ # 1: a ruby Module name (get the character cases right)
18
+ # 2: a namespace prefix used when writing xml, optional. A generated
19
+ # prefix will be used otherwise.
20
+
21
+ [
22
+ [ 'http://xampl.com/hobbies', 'Hobbies', 'h']
23
+ ]
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby -w -I..
2
+
3
+ if $0 == __FILE__ then
4
+
5
+ class File
6
+ def File.sjoin(*args)
7
+ File.join(args.select{ | o | o })
8
+ end
9
+ end
10
+
11
+ $LOAD_PATH.unshift('../../lib/')
12
+
13
+ require 'xamplr-generator'
14
+
15
+ include XamplGenerator
16
+ include Xampl
17
+
18
+ Xampl.transaction("setup", :in_memory) do
19
+ directory = File.sjoin(".", "xampl_generated_code")
20
+
21
+ options = Xampl.make(Options) do |options|
22
+ options.new_index_attribute("pid").persisted = true
23
+ options.new_index_attribute("id")
24
+
25
+ options.resolve("http://xampl.com/hobbies", "Hobbies", "h")
26
+ end
27
+
28
+ filenames = Dir.glob("./xml/**/*.xml")
29
+
30
+ generator = Generator.new
31
+ generator.go(:options => options,
32
+ :filenames => filenames,
33
+ :directory => directory)
34
+
35
+ puts generator.print_elements("./generated-elements.xml")
36
+ exit!
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ <hobby pid=''
2
+ name=''
3
+ xmlns="http://xampl.com/hobbies"/>
@@ -0,0 +1,5 @@
1
+ <person pid=''
2
+ name=''
3
+ xmlns="http://xampl.com/hobbies">
4
+ <hobby pid=''/>
5
+ </person>
@@ -0,0 +1,2 @@
1
+ xampl_generated_code
2
+ repo
@@ -12,5 +12,9 @@ raw:
12
12
 
13
13
  batch:
14
14
  rm -rf repo/random-people
15
- time ruby batch-load-users.rb
15
+ time ruby1.9 batch-load-users.rb
16
+
17
+ gen:
18
+ ruby xampl-gen.rb
19
+ ruby1.9 xampl-gen-191.rb
16
20
 
@@ -8,6 +8,8 @@ if $0 == __FILE__ then
8
8
  end
9
9
  end
10
10
 
11
+ $LOAD_PATH.unshift('../../lib/')
12
+
11
13
  require 'xamplr-generator'
12
14
 
13
15
  include XamplGenerator
@@ -25,12 +27,13 @@ if $0 == __FILE__ then
25
27
 
26
28
  filenames = Dir.glob("./xml/**/*.xml")
27
29
 
28
- generator = Generator.new
30
+ #generator = Generator.new
31
+ generator = Generator.new('generator')
29
32
  generator.go(:options => options,
30
33
  :filenames => filenames,
31
34
  :directory => directory)
32
35
 
33
36
  #puts generator.print_elements("./generated-elements.xml")
34
- exit!
37
+ #exit!
35
38
  end
36
39
  end
@@ -0,0 +1,2 @@
1
+ xampl_generated_code
2
+ repo
@@ -1,16 +1,15 @@
1
1
 
2
2
  nope:
3
3
 
4
- raw:
5
- rm -rf repo
6
- time ruby rawtc.rb
7
- #time ruby rawtc.rb
8
- #time ruby rawtc.rb
9
- #time ruby rawtc.rb
10
- #time ruby rawtc.rb
11
- #time ruby rawtc.rb
12
-
13
4
  batch:
14
5
  rm -rf repo
15
6
  time ruby batch-load-users.rb
16
7
 
8
+ safe:
9
+ rm -rf repo
10
+ time ruby batch-load-users-safe.rb
11
+
12
+ profile:
13
+ rm -rf repo
14
+ time ruby batch-load-users-profiled.rb
15
+
@@ -0,0 +1,91 @@
1
+ require 'fastercsv'
2
+ require 'xampl_generated_code/RandomPeople'
3
+ require 'people'
4
+ require 'settings'
5
+
6
+ require 'ruby-prof'
7
+
8
+ module RandomPeople
9
+
10
+ class BatchLoadUsersProfiled
11
+
12
+ attr_accessor :random_names, :created_addresses, :shared_addresses
13
+
14
+ def load_names(iter)
15
+ inner_start = Time.now
16
+ commit_start = 0
17
+ base = (1 + iter) * self.random_names.size
18
+
19
+ Xampl.transaction("random-people") do
20
+
21
+ random_names.each_with_index do | row, i |
22
+ person_pid = "person-#{ base + i }"
23
+ person = Person.new(person_pid)
24
+
25
+ person.given_name = row[0]
26
+ person.surname = row[1]
27
+ person.email = row[6]
28
+ person.phone = row[7]
29
+
30
+ addresses = Address.find_by_query do | q |
31
+ q.add_condition('street-address', :equals, row[2])
32
+ q.add_condition('postal-code', :equals, row[5])
33
+ end
34
+
35
+ address = addresses.first
36
+ if address then
37
+ person << address
38
+ self.shared_addresses += 1
39
+ else
40
+ address = person.new_address("address-#{ person_pid }")
41
+ address.street_address = row[2]
42
+ address.city = row[3]
43
+ address.state = row[4]
44
+ address.postal_code = row[5]
45
+ self.created_addresses += 1
46
+ end
47
+
48
+ end
49
+ puts "transaction ending..."
50
+ commit_start = Time.now
51
+ end
52
+ done_at = Time.now
53
+ puts "iter: #{ iter } in total: #{ done_at - inner_start }, insert: #{ commit_start - inner_start}, commit: #{done_at - commit_start}"
54
+ end
55
+
56
+ def run
57
+ start_at = Time.now
58
+
59
+ self.random_names = FasterCSV.read("random-names.csv")
60
+
61
+ parsed_at = Time.now
62
+
63
+ base = 0
64
+ self.created_addresses = 0
65
+ self.shared_addresses = 0
66
+
67
+ 2.times do | iter |
68
+ if 1 == iter then
69
+ RubyProf.start
70
+
71
+ load_names(iter)
72
+
73
+ result = RubyProf.stop
74
+ printer = RubyProf::FlatPrinter.new(result)
75
+ printer.print(STDOUT, 0)
76
+ else
77
+ load_names(iter)
78
+ end
79
+ end
80
+
81
+ processed_at = Time.now
82
+
83
+ puts "parsed in #{ parsed_at - start_at }, processed in: #{ processed_at - parsed_at }"
84
+ puts " created addresses: #{ created_addresses }, shared: #{ shared_addresses }"
85
+ end
86
+
87
+ end
88
+
89
+ BatchLoadUsersProfiled.new.run
90
+
91
+ end
@@ -0,0 +1,81 @@
1
+ require 'fastercsv'
2
+ require 'xampl_generated_code/RandomPeople'
3
+ require 'people'
4
+ require 'settings'
5
+
6
+ module RandomPeople
7
+
8
+ class BatchLoadUsers
9
+
10
+ attr_accessor :random_names, :created_addresses, :shared_addresses
11
+
12
+ def load_names(iter)
13
+ inner_start = Time.now
14
+ commit_total = 0
15
+ commit_start = 0
16
+ base = (1 + iter) * self.random_names.size
17
+
18
+ random_names.each_with_index do | row, i |
19
+ Xampl.transaction("random-people") do
20
+ person_pid = "person-#{ base + i }"
21
+ person = Person.new(person_pid)
22
+
23
+ person.given_name = row[0]
24
+ person.surname = row[1]
25
+ person.email = row[6]
26
+ person.phone = row[7]
27
+
28
+ addresses = Address.find_by_query do | q |
29
+ q.add_condition('street-address', :equals, row[2])
30
+ q.add_condition('postal-code', :equals, row[5])
31
+ end
32
+
33
+ address = addresses.first
34
+ if address then
35
+ person << address
36
+ self.shared_addresses += 1
37
+ else
38
+ address = person.new_address("address-#{ person_pid }")
39
+ address.street_address = row[2]
40
+ address.city = row[3]
41
+ address.state = row[4]
42
+ address.postal_code = row[5]
43
+ self.created_addresses += 1
44
+ end
45
+
46
+ commit_start = Time.now
47
+ end
48
+ commit_total += (Time.now - commit_start)
49
+ puts "total: #{ commit_total }, iter: #{ i } --> #{ i / commit_total }/s" if 0 == (i % 1000)
50
+ end
51
+ done_at = Time.now
52
+ total_time = done_at - inner_start
53
+ puts "iter: #{ iter } in total: #{ total_time }, insert: #{ total_time - commit_total }, commit: #{ commit_total }"
54
+ end
55
+
56
+ def run
57
+ start_at = Time.now
58
+
59
+ self.random_names = FasterCSV.read("random-names.csv")
60
+
61
+ parsed_at = Time.now
62
+
63
+ base = 0
64
+ self.created_addresses = 0
65
+ self.shared_addresses = 0
66
+
67
+ 10.times do | iter |
68
+ load_names(iter)
69
+ end
70
+
71
+ processed_at = Time.now
72
+
73
+ puts "parsed in #{ parsed_at - start_at }, processed in: #{ processed_at - parsed_at }"
74
+ puts " created addresses: #{ created_addresses }, shared: #{ shared_addresses }"
75
+ end
76
+
77
+ end
78
+
79
+ BatchLoadUsers.new.run
80
+
81
+ end
@@ -5,79 +5,75 @@ require 'settings'
5
5
 
6
6
  module RandomPeople
7
7
 
8
- start_at = Time.now
8
+ class BatchLoadUsers
9
+
10
+ attr_accessor :random_names, :created_addresses, :shared_addresses
11
+
12
+ def load_names(iter)
13
+ inner_start = Time.now
14
+ commit_start = 0
15
+ base = (1 + iter) * self.random_names.size
16
+
17
+ Xampl.transaction("random-people") do
18
+
19
+ random_names.each_with_index do | row, i |
20
+ person_pid = "person-#{ base + i }"
21
+ person = Person.new(person_pid)
22
+
23
+ person.given_name = row[0]
24
+ person.surname = row[1]
25
+ person.email = row[6]
26
+ person.phone = row[7]
27
+
28
+ addresses = Address.find_by_query do | q |
29
+ q.add_condition('street-address', :equals, row[2])
30
+ q.add_condition('postal-code', :equals, row[5])
31
+ end
32
+
33
+ address = addresses.first
34
+ if address then
35
+ person << address
36
+ self.shared_addresses += 1
37
+ else
38
+ address = person.new_address("address-#{ person_pid }")
39
+ address.street_address = row[2]
40
+ address.city = row[3]
41
+ address.state = row[4]
42
+ address.postal_code = row[5]
43
+ self.created_addresses += 1
44
+ end
9
45
 
10
- arr_of_arrs = FasterCSV.read("random-names.csv")
11
-
12
- parsed_at = Time.now
13
-
14
- #GivenName,Surname,StreetAddress,City,State,ZipCode,EmailAddress,TelephoneNumber
15
-
16
- #<people pid=''
17
- # xmlns="http://xampl.com/people">
18
- # <person pid=''
19
- # given-name=''
20
- # surname=''
21
- # email=''
22
- # phone=''>
23
- # <address pid=''
24
- # street-address=''
25
- # city=''
26
- # state=''
27
- # postal-code=''/>
28
- # </person>
29
- #</people>
30
-
31
- base = 0
32
-
33
- created_addresses = 0
34
- shared_addresses = 0
35
-
36
- 10.times do | iter |
37
- inner_start = Time.now
38
-
39
- Xampl.transaction("random-people") do
46
+ end
47
+ puts "transaction ending..."
48
+ commit_start = Time.now
49
+ end
50
+ done_at = Time.now
51
+ puts "iter: #{ iter } in total: #{ done_at - inner_start }, insert: #{ commit_start - inner_start}, commit: #{done_at - commit_start}"
52
+ end
40
53
 
41
- base += arr_of_arrs.size
54
+ def run
55
+ start_at = Time.now
42
56
 
43
- arr_of_arrs.each_with_index do | row, i |
44
- person_pid = "person-#{ base + i }"
45
- person = Person.new(person_pid)
57
+ self.random_names = FasterCSV.read("random-names.csv")
46
58
 
47
- person.given_name = row[0]
48
- person.surname = row[1]
49
- person.email = row[6]
50
- person.phone = row[7]
59
+ parsed_at = Time.now
51
60
 
52
- addresses = Xampl.find_xampl do | q |
53
- q.add_condition('class', :equals, Address.name)
61
+ base = 0
62
+ self.created_addresses = 0
63
+ self.shared_addresses = 0
54
64
 
55
- q.add_condition('street-address', :equals, row[2])
56
- q.add_condition('postal-code', :equals, row[5])
57
- end
65
+ 10.times do | iter |
66
+ load_names(iter)
67
+ end
58
68
 
59
- address = addresses.first
60
- if address then
61
- person << address
62
- shared_addresses += 1
63
- else
64
- address = person.new_address("address-#{ person_pid }")
65
- address.street_address = row[2]
66
- address.city = row[3]
67
- address.state = row[4]
68
- address.postal_code = row[5]
69
- created_addresses += 1
70
- end
69
+ processed_at = Time.now
71
70
 
72
- end
73
- puts "transaction ending..."
71
+ puts "parsed in #{ parsed_at - start_at }, processed in: #{ processed_at - parsed_at }"
72
+ puts " created addresses: #{ created_addresses }, shared: #{ shared_addresses }"
74
73
  end
75
- puts "iter: #{ iter } in #{ Time.now - inner_start }"
76
- end
77
74
 
78
- processed_at = Time.now
75
+ end
79
76
 
80
- p "parsed in #{ parsed_at - start_at }, processed in: #{ processed_at - parsed_at }"
81
- puts " created addresses: #{ created_addresses }, shared: #{ shared_addresses }"
77
+ BatchLoadUsers.new.run
82
78
 
83
79
  end
@@ -8,6 +8,8 @@ if $0 == __FILE__ then
8
8
  end
9
9
  end
10
10
 
11
+ $LOAD_PATH.unshift('../../lib/')
12
+
11
13
  require 'xamplr-generator'
12
14
 
13
15
  include XamplGenerator
@@ -0,0 +1,2 @@
1
+ xampl_generated_code
2
+ repo
@@ -25,7 +25,8 @@ reader = LibXML::XML::Reader.string(xml,
25
25
  LibXML::XML::Parser::Options::NOCDATA |
26
26
  LibXML::XML::Parser::Options::DTDATTR |
27
27
  LibXML::XML::Parser::Options::NSCLEAN |
28
- LibXML::XML::Parser::Options::COMPACT)
28
+ # LibXML::XML::Parser::Options::COMPACT |
29
+ 0)
29
30
 
30
31
  while reader.read do
31
32
  # puts reader.node_type
@@ -8,6 +8,8 @@ if $0 == __FILE__ then
8
8
  end
9
9
  end
10
10
 
11
+ $LOAD_PATH.unshift('../../lib/')
12
+
11
13
  require 'xamplr-generator'
12
14
 
13
15
  include XamplGenerator
@@ -0,0 +1,2 @@
1
+ repo
2
+ xampl_generated_code