[xquery-talk] How do different XQuery products implement modules?
Per Bothner
per at bothner.com
Wed Oct 15 19:53:53 PDT 2008
Answers for Qexo:
[I wrote the code a number of years ago, so in some cases my
memory might be off, so I am looking at teh code to refresh
my memory.]
Michael Kay wrote:
> 1. Is the module URI just an arbitrary character string, or does it have any
> semantics?
It can be be arbitrary string, but it is "mangled" to the name of a
"package" in the Java class hierarchy, similar to the JAXB mangling.
> 1a. In particular, is it the location of a resource on the web?
No.
> 2. Do you allow several different modules in the same query to have the same
> module URI?
Yes.
> 2a. if so, can different "import module" declarations import different
> subsets of these?
Possibly, but it isn't supported or recommended.
> 3. Can users import a module without specifying a location URI?
Yes, but the module has to either have been previously compiled
to a Java class (in the current class path), or the imported
module must have been "registered" with the module manager - which
happens when compiling multiple modules on the same "compilation line".
> If so, how is the module located?
It mangles the namespace to a package name. It then looks for a class
named $ModuleMap$ in that packages. This class contains a list of all
modules whose namespace mangle to this package name. The compiler
loads the $ModuleMap$ class, and selects the modules whose namespace
URIs match.
When a module is compiled, the compiler creates a class in the package
corresponding to the module's URI. The name of the class is a mangling
of the last component of the source file name, within the package
created by mangling the namespace URI. The compiler then updates the
$ModuleMap$ to include the compiled module(s). If $ModuleMap$ already
exists, then the class is first is loaded so the old contents can be
merged into the $ModuleMap$ that gets written out.
> 4. If import module specifies a location URI, is it used, and if so how?
A source file is looked for. It also mangles the source file name
and the namespace URI to yield a class name, and looks for that as well.
It will work if it finds either. If both are found, it will compre
time-stamps.
> 5. If import module specifies more than one location URI, how are they used?
Each location URI must map to a module; all are loaded.
> 5b. If multiple location URIs are allowed, what happens if
> import module specifies the same location URI more than once?
Hm. That should be an error, but I don't think I test that,
> 6. What happens when two modules A and B both import module URI M
>
> 6a. specifying the same location URI
Same module.
> 6b. specifying different location URIs
Not sure - it should be an error.
> 6c. without specifying a location URI
Same module, found using mangled class - see 3,
> 7. Is it possible (by means of multiple imports) to create two different
> "instances" of the same module in a query, with distinct values of global
> variables, or do all imports get the same instance with a common set of
> variables?
The latter. By default a module variables are compiled to static fields
of the module class, so they're inherently shared. There is a compiler
option to compile to instance variables. In that case a single "module
instance" will be allocated, global to the current "module context".
--
--Per Bothner
per at bothner.com http://per.bothner.com/
More information about the talk
mailing list