add rec context to CQL->RPN converter
This commit is contained in:
parent
a66d7b039e
commit
312dc6f264
4 changed files with 35 additions and 16 deletions
|
@ -1,5 +1,5 @@
|
|||
group = org.xbib
|
||||
name = z3950
|
||||
version = 5.1.2
|
||||
version = 5.1.3
|
||||
|
||||
org.gradle.warning.mode = ALL
|
||||
|
|
|
@ -35,9 +35,9 @@ import org.xbib.z3950.common.v3.RPNStructureRpnRpnOp;
|
|||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Stack;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* This is a RPN (Type-1 query) generator for CQL queries.
|
||||
|
@ -49,16 +49,7 @@ public final class CQLRPNGenerator implements Visitor {
|
|||
/**
|
||||
* Context map.
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
private final Map<String, ResourceBundle> contexts = new HashMap<>() {
|
||||
{
|
||||
put("default", ResourceBundle.getBundle("org.xbib.z3950.common.cql.default"));
|
||||
put("cql", ResourceBundle.getBundle("org.xbib.z3950.common.cql.cql"));
|
||||
put("bib", ResourceBundle.getBundle("org.xbib.z3950.common.cql.bib-1"));
|
||||
put("dc", ResourceBundle.getBundle("org.xbib.z3950.common.cql.dc"));
|
||||
put("gbv", ResourceBundle.getBundle("org.xbib.z3950.common.cql.gbv"));
|
||||
}
|
||||
};
|
||||
private final Map<String, Map<String, String>> contexts;
|
||||
|
||||
private final Stack<AttributeElement> attributeElements;
|
||||
|
||||
|
@ -76,6 +67,23 @@ public final class CQLRPNGenerator implements Visitor {
|
|||
this.attributeElements.addAll(attributeElements);
|
||||
}
|
||||
this.result = new Stack<>();
|
||||
this.contexts = new HashMap<>();
|
||||
addContext("default", ResourceBundle.getBundle("org.xbib.z3950.common.cql.default"));
|
||||
addContext("cql", ResourceBundle.getBundle("org.xbib.z3950.common.cql.cql"));
|
||||
addContext("rec", ResourceBundle.getBundle("org.xbib.z3950.common.cql.rec"));
|
||||
addContext("bib", ResourceBundle.getBundle("org.xbib.z3950.common.cql.bib-1"));
|
||||
addContext("dc", ResourceBundle.getBundle("org.xbib.z3950.common.cql.dc"));
|
||||
addContext("gbv", ResourceBundle.getBundle("org.xbib.z3950.common.cql.gbv"));
|
||||
}
|
||||
|
||||
public void addContext(String context, ResourceBundle bundle) {
|
||||
addContext(context, bundle.keySet().stream()
|
||||
.map(k -> Map.entry(k, bundle.getString(k)))
|
||||
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
|
||||
}
|
||||
|
||||
public void addContext(String context, Map<String, String> map) {
|
||||
contexts.put(context, map);
|
||||
}
|
||||
|
||||
public RPNQuery getQueryResult() {
|
||||
|
@ -292,11 +300,10 @@ public final class CQLRPNGenerator implements Visitor {
|
|||
}
|
||||
|
||||
private int getUseAttr(String context, String attrName) {
|
||||
try {
|
||||
return Integer.parseInt(contexts.get(context).getString(attrName));
|
||||
} catch (MissingResourceException e) {
|
||||
throw new SyntaxException("unknown use attribute '" + attrName + "' for context " + context, e);
|
||||
if (!contexts.containsKey(context)) {
|
||||
throw new SyntaxException("unknown use attribute '" + attrName + "' for context " + context);
|
||||
}
|
||||
return Integer.parseInt(contexts.get(context).get(attrName));
|
||||
}
|
||||
|
||||
private ASN1OctetString transformTerm(Term term) {
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
id=12
|
|
@ -47,4 +47,15 @@ class CQL2RPNTest {
|
|||
// not really working, it adds, not override
|
||||
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 2, attributeValue {numeric 4}}{attributeType 2, attributeValue {numeric 3}}{attributeType 4, attributeValue {numeric 1}}{attributeType 5, attributeValue {numeric 100}}{attributeType 1, attributeValue {numeric 4}}}, term {general \"a phrase\"}}}}}", q);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRecContext() {
|
||||
String cql = "rec.id = 123";
|
||||
CQLParser parser = new CQLParser(cql);
|
||||
parser.parse();
|
||||
CQLRPNGenerator generator = new CQLRPNGenerator();
|
||||
parser.getCQLQuery().accept(generator);
|
||||
String q = generator.getQueryResult().toString();
|
||||
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 2, attributeValue {numeric 3}}{attributeType 3, attributeValue {numeric 3}}{attributeType 4, attributeValue {numeric 2}}{attributeType 5, attributeValue {numeric 100}}{attributeType 6, attributeValue {numeric 1}}{attributeType 1, attributeValue {numeric 12}}}, term {general \"123\"}}}}}", q);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue