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.
- 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
|