hutch-xamplr 1.0.5 → 1.1.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 (76) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION.yml +2 -2
  3. data/examples/random-people-shared-addresses/Makefile +2 -2
  4. data/examples/random-people-shared-addresses/batch-load-users.rb +2 -5
  5. data/examples/random-people-shared-addresses/find-mentions.rb +1 -4
  6. data/examples/random-people-shared-addresses/find-people-by-address.rb +1 -4
  7. data/examples/random-people-shared-addresses/optimise.rb +1 -4
  8. data/examples/random-people-shared-addresses/people.rb +0 -15
  9. data/examples/random-people-shared-addresses/query.rb +1 -4
  10. data/examples/random-people-shared-addresses/query2.rb +1 -4
  11. data/examples/random-people-shared-addresses/results.write.BASELINE +298 -0
  12. data/examples/random-people-shared-addresses/results.write.NEW_ATTR_ENCODING +294 -0
  13. data/examples/random-people-shared-addresses/settings.rb +3 -0
  14. data/examples/random-people/batch-load-users.rb +1 -4
  15. data/examples/random-people/optimise.rb +1 -4
  16. data/examples/random-people/people.rb +0 -3
  17. data/examples/random-people/query.rb +1 -5
  18. data/examples/random-people/query2.rb +1 -4
  19. data/examples/random-people/settings.rb +3 -0
  20. data/examples/random-people/what-to-query-on.rb +1 -3
  21. data/examples/read-testing/Makefile +10 -0
  22. data/examples/read-testing/load.rb +65 -0
  23. data/examples/read-testing/read.rb +51 -0
  24. data/examples/read-testing/results.read.BASELINE +6 -0
  25. data/examples/read-testing/results.read.FAST +5 -0
  26. data/examples/read-testing/rrr.rb +87 -0
  27. data/examples/read-testing/settings.rb +2 -0
  28. data/examples/read-testing/xampl-gen.rb +36 -0
  29. data/examples/read-testing/xml/text.xml +8 -0
  30. data/lib/xamplr.rb +10 -1
  31. data/lib/xamplr/exceptions.rb +97 -0
  32. data/lib/xamplr/from-xml-orig.rb +350 -0
  33. data/lib/xamplr/from-xml.rb +272 -183
  34. data/lib/xamplr/handwritten/example.rb +0 -58
  35. data/lib/xamplr/handwritten/hand-example.rb +0 -27
  36. data/lib/xamplr/handwritten/test-handwritten.rb +0 -37
  37. data/lib/xamplr/mixins.rb +10 -48
  38. data/lib/xamplr/persist-to-xml.rb +249 -0
  39. data/lib/xamplr/persistence.rb +44 -412
  40. data/lib/xamplr/persistence.rb.more_thread_safe +0 -13
  41. data/lib/xamplr/persistence.rb.partially_thread_safe +0 -13
  42. data/lib/xamplr/persister.rb +298 -0
  43. data/lib/xamplr/{persister → persisters}/caches.rb +0 -0
  44. data/lib/xamplr/{persister → persisters}/caching.rb +1 -1
  45. data/lib/xamplr/{persister → persisters}/filesystem.rb +4 -5
  46. data/lib/xamplr/{persister → persisters}/in-memory.rb +1 -1
  47. data/lib/xamplr/{persister → persisters}/simple.rb +0 -0
  48. data/lib/xamplr/{persister → persisters}/tokyo-cabinet.rb +53 -15
  49. data/lib/xamplr/simpleTemplate/{input-c.r4 → obsolete/input-c.r4} +0 -0
  50. data/lib/xamplr/simpleTemplate/{play.r6.txt → obsolete/play.r6.txt} +0 -0
  51. data/lib/xamplr/simpleTemplate/{play_more.r6.txt → obsolete/play_more.r6.txt} +0 -0
  52. data/lib/xamplr/simpleTemplate/{test001.r5 → obsolete/test001.r5} +0 -0
  53. data/lib/xamplr/simpleTemplate/{test002.r5 → obsolete/test002.r5} +0 -0
  54. data/lib/xamplr/simpleTemplate/{test003.r5 → obsolete/test003.r5} +0 -0
  55. data/lib/xamplr/templates/child_indexed.template +1 -1
  56. data/lib/xamplr/templates/element_classes.template +1 -1
  57. data/lib/xamplr/templates/element_data.template +0 -39
  58. data/lib/xamplr/templates/element_empty.template +0 -40
  59. data/lib/xamplr/templates/element_mixed.template +0 -41
  60. data/lib/xamplr/templates/element_simple.template +0 -40
  61. data/lib/xamplr/test-support/bench.rb +6 -26
  62. data/lib/xamplr/test-support/test.rb +1 -89
  63. data/lib/xamplr/visitor.rb +0 -778
  64. data/lib/xamplr/visitors.rb +573 -0
  65. data/lib/xamplr/xampl-generator.rb +1 -1
  66. data/lib/xamplr/xampl-hand-generated.rb +0 -85
  67. data/lib/xamplr/xampl-module.rb +36 -0
  68. data/lib/xamplr/xampl-object-internals.rb +6 -0
  69. data/lib/xamplr/xampl-object.rb +10 -341
  70. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  71. data/lib/xamplr/xml-text.rb +117 -0
  72. metadata +53 -18
  73. data/lib/xamplr/persister/subversion.rb +0 -61
  74. data/lib/xamplr/rac.sh +0 -6
  75. data/lib/xamplr/rac_gen.sh +0 -1
  76. data/lib/xamplr/templates/child_indexed.template.000 +0 -87
@@ -0,0 +1,3 @@
1
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
2
+ Xampl.set_default_persister_format(:xml_format)
3
+ #Xampl.set_default_persister_format(:ruby_format)
@@ -3,10 +3,7 @@ $LOAD_PATH.unshift("xampl_generated_code")
3
3
  require 'fastercsv'
4
4
  require 'RandomPeople'
5
5
  require 'people'
6
-
7
- Xampl.set_default_persister_kind(:tokyo_cabinet)
8
- Xampl.set_default_persister_format(:xml_format)
9
- #Xampl.set_default_persister_format(:ruby_format)
6
+ require 'settings'
10
7
 
11
8
  module RandomPeople
12
9
 
@@ -2,10 +2,7 @@ $LOAD_PATH.unshift("xampl_generated_code")
2
2
 
3
3
  require 'RandomPeople'
4
4
  require 'people'
5
-
6
- Xampl.set_default_persister_kind(:tokyo_cabinet)
7
- Xampl.set_default_persister_format(:xml_format)
8
- #Xampl.set_default_persister_format(:ruby_format)
5
+ require 'settings'
9
6
 
10
7
  module RandomPeople
11
8
 
@@ -2,9 +2,6 @@ $LOAD_PATH.unshift("xampl_generated_code")
2
2
 
3
3
  require 'RandomPeople'
4
4
 
5
- #Xampl.set_default_persister_kind(:tokyo_cabinet)
6
- #Xampl.set_default_persister_format(:xml_format)
7
-
8
5
  module RandomPeople
9
6
 
10
7
  class Person
@@ -2,10 +2,7 @@ $LOAD_PATH.unshift("xampl_generated_code")
2
2
 
3
3
  require 'RandomPeople'
4
4
  require 'people'
5
-
6
- Xampl.set_default_persister_kind(:tokyo_cabinet)
7
- Xampl.set_default_persister_format(:xml_format)
8
- #Xampl.set_default_persister_format(:ruby_format)
5
+ require 'settings'
9
6
 
10
7
  module RandomPeople
11
8
 
@@ -50,7 +47,6 @@ module RandomPeople
50
47
  q.order_by('surname', :strasc)
51
48
  end
52
49
  end
53
-
54
50
  start_find_pids_at = Time.now
55
51
 
56
52
  found3 = Xampl.transaction("random-people") do
@@ -2,10 +2,7 @@ $LOAD_PATH.unshift("xampl_generated_code")
2
2
 
3
3
  require 'RandomPeople'
4
4
  require 'people'
5
-
6
- Xampl.set_default_persister_kind(:tokyo_cabinet)
7
- Xampl.set_default_persister_format(:xml_format)
8
- #Xampl.set_default_persister_format(:ruby_format)
5
+ require 'settings'
9
6
 
10
7
  module RandomPeople
11
8
 
@@ -0,0 +1,3 @@
1
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
2
+ Xampl.set_default_persister_format(:xml_format)
3
+ #Xampl.set_default_persister_format(:ruby_format)
@@ -4,9 +4,7 @@ require 'set'
4
4
  require 'fastercsv'
5
5
  require 'RandomPeople'
6
6
  require 'people'
7
-
8
- Xampl.set_default_persister_kind(:tokyo_cabinet)
9
- Xampl.set_default_persister_format(:xml_format)
7
+ require 'settings'
10
8
 
11
9
  module RandomPeople
12
10
  arr_of_arrs = FasterCSV.read("random-names.csv")
@@ -0,0 +1,10 @@
1
+
2
+ nope:
3
+
4
+ read:
5
+ time ruby read.rb
6
+
7
+ load:
8
+ rm -rf repo
9
+ time ruby load.rb
10
+
@@ -0,0 +1,65 @@
1
+ $LOAD_PATH.unshift("xampl_generated_code")
2
+
3
+ require 'rubygems'
4
+ require 'Perf'
5
+ require 'settings'
6
+
7
+ module Perf
8
+
9
+ count = 0
10
+ root = nil
11
+ $total_lines = 0
12
+
13
+ srand( 12345 )
14
+
15
+ def Perf.make_text(count)
16
+ lines = 1 + rand(10)
17
+ $total_lines += lines
18
+
19
+ s = ""
20
+ lines.times do | i |
21
+ s << "this is a line for count: #{ count }, #{ i } of #{ lines } with scary stuff: <>&'\" ..."
22
+ end
23
+ return s
24
+ end
25
+
26
+
27
+ #<root pid=''
28
+ # xmlns="http://xampl.com/performance">
29
+ # <text pid=''
30
+ # size=''
31
+ # stuff=''>
32
+ # actual text
33
+ # </text>
34
+ #</root>
35
+
36
+ start_at = Time.now
37
+
38
+ 1.times do | outer |
39
+ Xampl.transaction("random-people") do
40
+ unless root then
41
+ root = Root.new('root')
42
+ end
43
+
44
+ 10000.times do | iter |
45
+
46
+ count += 1
47
+
48
+ text = root.new_text("text-#{ count }")
49
+ text.stuff = "---<>&\"'---"
50
+ text.content = make_text(count)
51
+
52
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} #{ text.pp_xml }"
53
+
54
+ end
55
+ end
56
+
57
+ puts "transaction #{ outer } ending... #{ Time.now - start_at } seconds"
58
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} #{ root.pp_xml }"
59
+ end
60
+
61
+ done_at = Time.now
62
+
63
+ p "loaded #{ count }, total lines: #{ $total_lines }, in #{ done_at - start_at }"
64
+
65
+ end
@@ -0,0 +1,51 @@
1
+ require 'rubygems'
2
+ require 'xampl_generated_code/Perf'
3
+ require 'settings'
4
+
5
+ module Perf
6
+
7
+ count = 0
8
+ root = nil
9
+ $total_lines = 0
10
+
11
+ #<root pid=''
12
+ # xmlns="http://xampl.com/performance">
13
+ # <text pid=''
14
+ # size=''
15
+ # stuff=''>
16
+ # actual text
17
+ # </text>
18
+ #</root>
19
+
20
+ start_at = Time.now
21
+
22
+ Xampl.transaction("random-people") do
23
+ root = Root['root']
24
+ end
25
+ root_at = Time.now
26
+ puts "#{File.basename(__FILE__)}:#{__LINE__} Root read in #{ root_at - start_at}"
27
+
28
+ root.text.each do | text |
29
+ count += 1
30
+ end
31
+
32
+ #puts root.pp_xml
33
+
34
+ looped_at = Time.now
35
+ puts "#{File.basename(__FILE__)}:#{__LINE__} looped over #{ count } text in #{ looped_at - root_at } NO LOADING"
36
+
37
+ count = 0
38
+ total_lines = 0
39
+
40
+ root.text.each do | text |
41
+ content = text.content
42
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} content: [[#{ content }]]"
43
+ total_lines += content.length() if content
44
+ count += 1
45
+ end
46
+
47
+ done_at = Time.now
48
+
49
+ puts "loaded #{ count }, total lines: #{ total_lines }, in #{ done_at - looped_at } seconds, total time: #{ done_at - start_at } seconds"
50
+
51
+ end
@@ -0,0 +1,6 @@
1
+ time ruby read.rb
2
+ read.rb:26 Root read in 55.800525
3
+ read.rb:35 looped over 10000 text in 0.007164 NO LOADING
4
+ loaded 10000, total lines: 3632427, in 15.826613 seconds, total time: 71.634302 seconds
5
+ 72.37 real 70.43 user 0.63 sys
6
+
@@ -0,0 +1,5 @@
1
+ time ruby read.rb
2
+ read.rb:26 Root read in 3.317672
3
+ read.rb:35 looped over 10000 text in 0.007039 NO LOADING
4
+ loaded 10000, total lines: 3632427, in 2.897625 seconds, total time: 6.222336 seconds
5
+ 6.73 real 6.37 user 0.26 sys
@@ -0,0 +1,87 @@
1
+ require 'rubygems'
2
+ require 'libxml'
3
+
4
+ xml = %Q{
5
+ <root pid='aaaaa'
6
+ xmlns:x="http://xampl.com/extra"
7
+ xmlns="http://xampl.com/performance">
8
+ <text pid='bbbb'
9
+ x:size='ccccc'
10
+ stuff='ddddd'>
11
+ actual text &quot; well?
12
+ actual text &quot; well?
13
+ actual text &quot; well?
14
+ actual text &quot; well?
15
+ xxxxx <![CDATA[ <>"'& ]]> xxxxx
16
+ </text>
17
+ <nothing/>
18
+ <x:blob v='blob value'/>
19
+ </root>
20
+ }
21
+
22
+ reader = LibXML::XML::Reader.string(xml,
23
+ :options => LibXML::XML::Parser::Options::NOENT |
24
+ LibXML::XML::Parser::Options::NONET |
25
+ LibXML::XML::Parser::Options::NOCDATA |
26
+ LibXML::XML::Parser::Options::DTDATTR |
27
+ LibXML::XML::Parser::Options::NSCLEAN |
28
+ LibXML::XML::Parser::Options::COMPACT)
29
+
30
+ while reader.read do
31
+ # puts reader.node_type
32
+ # puts "line: #{ reader.line_number }, column: #{ reader.column_number }"
33
+
34
+ case reader.node_type
35
+ # when LibXML::XML::Reader::TYPE_ATTRIBUTE
36
+ # puts "attribute"
37
+ when LibXML::XML::Reader::TYPE_DOCUMENT
38
+ puts "DOCUMENT"
39
+ when LibXML::XML::Reader::TYPE_ELEMENT
40
+ attribute_count = reader.attribute_count
41
+ puts "element #{ reader.local_name }, ns: #{ reader.namespace_uri }, #attributes: #{ attribute_count }, depth: #{ reader.depth }"
42
+ if reader.has_attributes? then
43
+ reader.move_to_first_attribute
44
+ attribute_count.times do | i |
45
+ next if reader.namespace_declaration?
46
+ puts " attr[#{ i }]:: lname: #{ reader.local_name }, ns: #{ reader.namespace_uri } ---> #{ reader.value }"
47
+ reader.move_to_next_attribute
48
+ end
49
+ end
50
+
51
+ when LibXML::XML::Reader::TYPE_END_ELEMENT
52
+ puts "END ELEMENT"
53
+ when LibXML::XML::Reader::TYPE_TEXT
54
+ puts "TEXT [[#{ reader.read_string }]]"
55
+ when LibXML::XML::Reader::TYPE_CDATA
56
+ puts "CDATA [[#{ reader.read_string }]]"
57
+ when LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE
58
+ puts "SIGNIFICANT white space [[#{ reader.read_string }]]"
59
+ when LibXML::XML::Reader::TYPE_ENTITY_REFERENCE
60
+ puts "entity ref"
61
+ when LibXML::XML::Reader::TYPE_WHITESPACE
62
+ puts "whitespace"
63
+ when LibXML::XML::Reader::TYPE_PROCESSING_INSTRUCTION
64
+ puts "processing instruction"
65
+ when LibXML::XML::Reader::TYPE_COMMENT
66
+ puts "comment"
67
+ when LibXML::XML::Reader::TYPE_DOCUMENT_TYPE
68
+ puts "doc type"
69
+
70
+ when LibXML::XML::Reader::TYPE_XML_DECLARATION
71
+ puts "xml decl"
72
+ when LibXML::XML::Reader::TYPE_NONE
73
+ puts "NONE!!"
74
+ when LibXML::XML::Reader::TYPE_NOTATION
75
+ puts "notifiation"
76
+ when LibXML::XML::Reader::TYPE_DOCUMENT_FRAGMENT
77
+ puts "doc fragment"
78
+ when LibXML::XML::Reader::TYPE_ENTITY
79
+ puts "entity"
80
+ when LibXML::XML::Reader::TYPE_END_ENTITY
81
+ puts "
82
+ end entity"
83
+ else
84
+ puts "UNKNOWN: #{reader.node_type}"
85
+ end
86
+
87
+ end
@@ -0,0 +1,2 @@
1
+ Xampl.set_default_persister_kind(:tokyo_cabinet)
2
+ Xampl.set_default_persister_format(:xml_format)
@@ -0,0 +1,36 @@
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
+ require 'xamplr-generator'
12
+
13
+ include XamplGenerator
14
+ include Xampl
15
+
16
+ Xampl.transaction("setup", :in_memory) do
17
+ directory = File.sjoin(".", "xampl_generated_code")
18
+
19
+ options = Xampl.make(Options) do |options|
20
+ options.new_index_attribute("pid").persisted = true
21
+ options.new_index_attribute("id")
22
+
23
+ options.resolve("http://xampl.com/performance", "Perf", "p")
24
+ end
25
+
26
+ filenames = Dir.glob("./xml/**/*.xml")
27
+
28
+ generator = Generator.new
29
+ generator.go(:options => options,
30
+ :filenames => filenames,
31
+ :directory => directory)
32
+
33
+ #puts generator.print_elements("./generated-elements.xml")
34
+ exit!
35
+ end
36
+ end
@@ -0,0 +1,8 @@
1
+ <root pid=''
2
+ xmlns="http://xampl.com/performance">
3
+ <text pid=''
4
+ size=''
5
+ stuff=''>
6
+ actual text
7
+ </text>
8
+ </root>
@@ -14,14 +14,23 @@ module Xampl
14
14
  return @@logger
15
15
  end
16
16
 
17
+ require "xamplr/xampl-module"
18
+ require "xamplr/xampl-object-internals"
17
19
  require "xamplr/xampl-object"
18
- require "xamplr/persistence"
20
+ require "xamplr/xampl-persisted-object"
21
+
22
+ require "xamplr/exceptions"
23
+ require "xamplr/xml-text"
19
24
  require "xamplr/notifications"
20
25
  require "xamplr/mixins"
26
+
21
27
  require "xamplr/from-xml"
22
28
  require "xamplr/to-xml"
23
29
  require "xamplr/to-ruby"
30
+
24
31
  require "xamplr/visitor"
32
+ require "xamplr/persist-to-xml"
33
+ require "xamplr/visitors"
25
34
 
26
35
  end
27
36
 
@@ -0,0 +1,97 @@
1
+
2
+ module Xampl
3
+
4
+ class XamplIsInvalid < Exception
5
+ attr_reader :msg, :xampl
6
+
7
+ def initialize(xampl)
8
+ @xampl = xampl
9
+ @msg = "Invalid Xampl:: #{xampl}"
10
+ end
11
+
12
+ def message
13
+ @msg
14
+ end
15
+ end
16
+
17
+ class AlreadyKnownToPersister < Exception
18
+ attr_reader :msg, :xampl
19
+
20
+ def initialize(xampl, persister)
21
+ @xampl = xampl
22
+ @msg = "#{xampl} #{xampl.get_the_index} is already known by a persister: #{xampl.persister.name}, so cannot use persister #{persister.name}"
23
+ end
24
+
25
+ def message
26
+ @msg
27
+ end
28
+ end
29
+
30
+ class XamplException < Exception
31
+ attr_reader :name, :msg
32
+
33
+ def initialize(name, message=nil)
34
+ @name = name
35
+ @msg = message ? message : ""
36
+ end
37
+
38
+ def message
39
+ "XamplException #{@name} #{@msg}"
40
+ end
41
+ end
42
+
43
+ class NoActivePersister < Exception
44
+ def message
45
+ "No Persister is active"
46
+ end
47
+ end
48
+
49
+ class BlockedChange < Exception
50
+ attr_reader :xampl
51
+
52
+ def initialize(xampl=nil)
53
+ @xampl = xampl
54
+ end
55
+
56
+ def message
57
+ "attempt to change #{@xampl}, pid: #{@xampl.get_the_index}, oid: #{@xampl.object_id} when changes are blocked"
58
+ end
59
+ end
60
+
61
+ class UnmanagedChange < Exception
62
+ attr_reader :xampl
63
+
64
+ def initialize(xampl=nil)
65
+ @xampl = xampl
66
+ end
67
+
68
+ def message
69
+ "attempt to change #{@xampl}, pid: #{@xampl.get_the_index}, oid: #{@xampl.object_id} outside of its persister's management"
70
+ end
71
+ end
72
+
73
+ class IncompatiblePersisterRequest < Exception
74
+ attr_reader :msg
75
+
76
+ def initialize(persister, feature_name, requested_feature_value, actual_feature_value)
77
+ @msg = "persister #{persister.name}:: requested feature: #{feature_name} #{requested_feature_value}, actual: #{actual_feature_value}"
78
+ end
79
+
80
+ def message
81
+ @msg
82
+ end
83
+ end
84
+
85
+ class MixedPersisters < Exception
86
+ attr_reader :msg
87
+
88
+ def initialize(active, local)
89
+ @msg = "mixed persisters:: active #{active.name}, local: #{local.name}"
90
+ end
91
+
92
+ def message
93
+ @msg
94
+ end
95
+ end
96
+
97
+ end