-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.rb
130 lines (98 loc) · 2.99 KB
/
test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
=begin
zorba-ruby/test.rb
Copyright 2010 James Pharaoh <[email protected]>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
=end
require "pp"
require "zorba"
MAIN = <<EOF
import module namespace lib = "lib";
( lib:lala (lib:hoho (1)), lib:elem ());
EOF
LIB = <<EOF
module namespace lib = "lib";
declare function lib:lala ($in as xs:integer) as xs:integer {
$in + $in + $in;
};
declare function lib:hoho ($in as xs:integer) as xs:integer external;
declare function lib:elem () external;
EOF
class MyModuleUriResolverResult < Zorba::ModuleUriResolverResult
attr_accessor :module_source
attr_accessor :module_url
attr_accessor :component_uris
end
class MyModuleUriResolver < Zorba::ModuleUriResolver
def resolve_target_namespace target_namespace_uri
result = MyModuleUriResolverResult.new
result.component_uris = [ target_namespace_uri ]
return result
end
def resolve name
result = MyModuleUriResolverResult.new
case name
when "lib"
result.error = Zorba::UriResolverResult::UR_NOERROR
result.module_source = LIB
result.module_url = "lib"
else
result.error = Zorba::UriResolverResult::UR_XQST0046
end
return result
end
end
class MyModule < Zorba::ExternalModule
def uri
return "lib"
end
def external_function name
return case name
when "hoho"
return MyFunction.new
when "elem"
return MyElemFunc.new
else
nil
end
end
end
class MyFunction < Zorba::NonePureStatelessExternalFunction
def evaluate args, sctx, dctx
item = $item_factory.create_integer 123
return Zorba::SingletonItemSequence.new item
end
end
class MyElemFunc < Zorba::NonePureStatelessExternalFunction
def evaluate args, sctx, dctx
name = $item_factory.create_qname "", "hello-world"
type = $item_factory.create_qname "", "xsd:untyped"
elem = $item_factory.create_element_node nil, name, type, false, false, nil
name = $item_factory.create_qname "", "child"
type = $item_factory.create_qname "", "xsd:untyped"
elem1 = $item_factory.create_element_node elem, name, type, false, false, nil
return Zorba::SingletonItemSequence.new elem
end
end
$store = Zorba::StoreManager.get_store
$zorba = Zorba.get_instance $store
$data_manager = $zorba.xml_data_manager
$item_factory = $zorba.item_factory
sctx = $zorba.create_static_context
sctx.add_module_uri_resolver MyModuleUriResolver.new
sctx.register_module MyModule.new
(ARGV[0] ||= 1).to_i.times do
xquery = $zorba.compile_query MAIN, sctx
puts xquery.execute
xquery.close
end
$zorba.shutdown
Zorba::StoreManager.shutdown_store $store
exit