hutch-xamplr 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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