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.
- data/Rakefile +1 -0
- data/VERSION.yml +2 -2
- data/examples/random-people-shared-addresses/Makefile +2 -2
- data/examples/random-people-shared-addresses/batch-load-users.rb +2 -5
- data/examples/random-people-shared-addresses/find-mentions.rb +1 -4
- data/examples/random-people-shared-addresses/find-people-by-address.rb +1 -4
- data/examples/random-people-shared-addresses/optimise.rb +1 -4
- data/examples/random-people-shared-addresses/people.rb +0 -15
- data/examples/random-people-shared-addresses/query.rb +1 -4
- data/examples/random-people-shared-addresses/query2.rb +1 -4
- data/examples/random-people-shared-addresses/results.write.BASELINE +298 -0
- data/examples/random-people-shared-addresses/results.write.NEW_ATTR_ENCODING +294 -0
- data/examples/random-people-shared-addresses/settings.rb +3 -0
- data/examples/random-people/batch-load-users.rb +1 -4
- data/examples/random-people/optimise.rb +1 -4
- data/examples/random-people/people.rb +0 -3
- data/examples/random-people/query.rb +1 -5
- data/examples/random-people/query2.rb +1 -4
- data/examples/random-people/settings.rb +3 -0
- data/examples/random-people/what-to-query-on.rb +1 -3
- data/examples/read-testing/Makefile +10 -0
- data/examples/read-testing/load.rb +65 -0
- data/examples/read-testing/read.rb +51 -0
- data/examples/read-testing/results.read.BASELINE +6 -0
- data/examples/read-testing/results.read.FAST +5 -0
- data/examples/read-testing/rrr.rb +87 -0
- data/examples/read-testing/settings.rb +2 -0
- data/examples/read-testing/xampl-gen.rb +36 -0
- data/examples/read-testing/xml/text.xml +8 -0
- data/lib/xamplr.rb +10 -1
- data/lib/xamplr/exceptions.rb +97 -0
- data/lib/xamplr/from-xml-orig.rb +350 -0
- data/lib/xamplr/from-xml.rb +272 -183
- data/lib/xamplr/handwritten/example.rb +0 -58
- data/lib/xamplr/handwritten/hand-example.rb +0 -27
- data/lib/xamplr/handwritten/test-handwritten.rb +0 -37
- data/lib/xamplr/mixins.rb +10 -48
- data/lib/xamplr/persist-to-xml.rb +249 -0
- data/lib/xamplr/persistence.rb +44 -412
- data/lib/xamplr/persistence.rb.more_thread_safe +0 -13
- data/lib/xamplr/persistence.rb.partially_thread_safe +0 -13
- data/lib/xamplr/persister.rb +298 -0
- data/lib/xamplr/{persister → persisters}/caches.rb +0 -0
- data/lib/xamplr/{persister → persisters}/caching.rb +1 -1
- data/lib/xamplr/{persister → persisters}/filesystem.rb +4 -5
- data/lib/xamplr/{persister → persisters}/in-memory.rb +1 -1
- data/lib/xamplr/{persister → persisters}/simple.rb +0 -0
- data/lib/xamplr/{persister → persisters}/tokyo-cabinet.rb +53 -15
- data/lib/xamplr/simpleTemplate/{input-c.r4 → obsolete/input-c.r4} +0 -0
- data/lib/xamplr/simpleTemplate/{play.r6.txt → obsolete/play.r6.txt} +0 -0
- data/lib/xamplr/simpleTemplate/{play_more.r6.txt → obsolete/play_more.r6.txt} +0 -0
- data/lib/xamplr/simpleTemplate/{test001.r5 → obsolete/test001.r5} +0 -0
- data/lib/xamplr/simpleTemplate/{test002.r5 → obsolete/test002.r5} +0 -0
- data/lib/xamplr/simpleTemplate/{test003.r5 → obsolete/test003.r5} +0 -0
- data/lib/xamplr/templates/child_indexed.template +1 -1
- data/lib/xamplr/templates/element_classes.template +1 -1
- data/lib/xamplr/templates/element_data.template +0 -39
- data/lib/xamplr/templates/element_empty.template +0 -40
- data/lib/xamplr/templates/element_mixed.template +0 -41
- data/lib/xamplr/templates/element_simple.template +0 -40
- data/lib/xamplr/test-support/bench.rb +6 -26
- data/lib/xamplr/test-support/test.rb +1 -89
- data/lib/xamplr/visitor.rb +0 -778
- data/lib/xamplr/visitors.rb +573 -0
- data/lib/xamplr/xampl-generator.rb +1 -1
- data/lib/xamplr/xampl-hand-generated.rb +0 -85
- data/lib/xamplr/xampl-module.rb +36 -0
- data/lib/xamplr/xampl-object-internals.rb +6 -0
- data/lib/xamplr/xampl-object.rb +10 -341
- data/lib/xamplr/xampl-persisted-object.rb +122 -0
- data/lib/xamplr/xml-text.rb +117 -0
- metadata +53 -18
- data/lib/xamplr/persister/subversion.rb +0 -61
- data/lib/xamplr/rac.sh +0 -6
- data/lib/xamplr/rac_gen.sh +0 -1
- data/lib/xamplr/templates/child_indexed.template.000 +0 -87
@@ -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,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
|
|
@@ -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,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,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 " well?
|
12
|
+
actual text " well?
|
13
|
+
actual text " well?
|
14
|
+
actual text " 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,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
|
data/lib/xamplr.rb
CHANGED
@@ -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/
|
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
|