ContextTables contextInfo = env.getContextInfo();
if (context == null)
return new Query(env, nColumns, nHits, null);
else if (context.indexOf('|') != -1) { // alternatives
StringTokenizer alts = new StringTokenizer(context, " |");
IntegerArray codes = new IntegerArray();
while (alts.hasMoreTokens()) {
String alt = alts.nextToken();
int code = contextInfo.linkCode(alt);
if (code != -1)
codes.addNew(code);
else
System.err.println("invalid (in the collection) tag name: " + alt);
}
switch (codes.cardinality()) {
case 0:
return _emptyQueryInstance;
case 1:
return new Query1(env, nColumns, nHits, null, codes.at(0));
default:
return new Query4(env, nColumns, nHits, null,
codes.toIntArray());
}
}
else if (context.indexOf("//") != -1) { // ancestor
StringTokenizer elements = new StringTokenizer(context, " /");
int ancestor = contextInfo.linkCode(elements.nextToken());
int code = contextInfo.linkCode(elements.nextToken());
// ancestor
return new Query3(env, nColumns, nHits, null, code, ancestor);
}
else if (context.indexOf("/") != -1) { // parent (or path)
StringTokenizer elements = new StringTokenizer(context, " /");
int nTokens = elements.countTokens();
if (nTokens == 2) {
int parent = contextInfo.linkCode(elements.nextToken());
int code = contextInfo.linkCode(elements.nextToken());
// parent
return new Query2(env, nColumns, nHits, null, code, parent);
}
else if (nTokens > 2) {
IntegerArray codes = new IntegerArray();
while (elements.hasMoreTokens()) {
String parentStar = elements.nextToken();
int code = contextInfo.linkCode(parentStar);
if (code != -1)
codes.addNew(code);
else
System.err.println("invalid (in this collection) tag name: " +
parentStar);
}
return new Query5(env, nColumns, nHits, null,
codes.toIntArray());
}
else
return _emptyQueryInstance;
}
else if (context.indexOf("@") != -1) { // attribute