working on RPN generation
This commit is contained in:
parent
23b2188159
commit
155f0adcd4
8 changed files with 98 additions and 18 deletions
|
@ -1,5 +1,5 @@
|
|||
group = org.xbib
|
||||
name = z3950
|
||||
version = 5.0.2
|
||||
version = 5.0.3
|
||||
|
||||
org.gradle.warning.mode = ALL
|
||||
|
|
|
@ -79,9 +79,7 @@ public class SearchOperation extends AbstractOperation<SearchResponse, SearchReq
|
|||
dbs[n].value.value = new ASN1GeneralString(databases.get(n));
|
||||
}
|
||||
search.databaseNames = dbs;
|
||||
if (logger.isLoggable(Level.FINE)) {
|
||||
logger.log(Level.FINE, search.toString());
|
||||
}
|
||||
logger.log(Level.FINER, search.toString());
|
||||
write(search);
|
||||
SearchResponse response = read();
|
||||
if (response != null) {
|
||||
|
|
|
@ -7,24 +7,37 @@ public class Expression extends Node {
|
|||
|
||||
private final String op;
|
||||
|
||||
private final Query q1;
|
||||
private final Query query1;
|
||||
|
||||
private final Query q2;
|
||||
private final Query query2;
|
||||
|
||||
public Expression(String op, Query q1, Query q2) {
|
||||
public Expression(String op, Query query1, Query query2) {
|
||||
this.op = op;
|
||||
this.q1 = q1;
|
||||
this.q2 = q2;
|
||||
this.query1 = query1;
|
||||
this.query2 = query2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(Visitor visitor) {
|
||||
q2.accept(visitor);
|
||||
q1.accept(visitor);
|
||||
query2.accept(visitor);
|
||||
query1.accept(visitor);
|
||||
visitor.visit(this);
|
||||
}
|
||||
|
||||
public String getOperator() {
|
||||
return op;
|
||||
}
|
||||
|
||||
public Query getQuery1() {
|
||||
return query1;
|
||||
}
|
||||
|
||||
public Query getQuery2() {
|
||||
return query2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[Expression: op=" + op + ",query1=" + query1 + ",query2=" + query2 + "]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ public class PQFRPNGenerator implements Visitor {
|
|||
if (any instanceof RPNStructure) {
|
||||
rpnQuery.rpn = (RPNStructure) any;
|
||||
} else if (any instanceof ASN1OctetString) {
|
||||
// TODO
|
||||
logger.log(Level.INFO, "found ASN1OctetString = " + ((ASN1OctetString) any).get());
|
||||
}
|
||||
if (pqf.getAttrSet() == null) {
|
||||
|
@ -64,7 +65,13 @@ public class PQFRPNGenerator implements Visitor {
|
|||
Operand operand = new Operand();
|
||||
operand.attrTerm = new AttributesPlusTerm();
|
||||
operand.attrTerm.term = new org.xbib.z3950.common.v3.Term();
|
||||
operand.attrTerm.term.c_general = new ASN1OctetString(query.getTerm().getValue());
|
||||
Term term = query.getTerm();
|
||||
if (term != null) {
|
||||
Logger.getLogger("").log(Level.INFO, "query = " + query + " term = " + term + " value = " + term.getValue());
|
||||
operand.attrTerm.term.c_general = new ASN1OctetString(term.getValue());
|
||||
} else {
|
||||
operand.attrTerm.term.c_null = new ASN1Null();
|
||||
}
|
||||
Stack<AttributeElement> attrs = new Stack<>();
|
||||
ASN1Any any = !result.isEmpty() && result.peek() instanceof AttributeElement ? result.pop() : null;
|
||||
while (any != null) {
|
||||
|
@ -75,10 +82,9 @@ public class PQFRPNGenerator implements Visitor {
|
|||
operand.attrTerm.attributes.value = attrs.toArray(new AttributeElement[0]);
|
||||
RPNStructure rpn = new RPNStructure();
|
||||
rpn.c_op = operand;
|
||||
if (attrs.size() > 0) {
|
||||
Logger.getLogger("").log(Level.INFO, "push rpn = " + rpn);
|
||||
result.push(rpn);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visit(Expression expr) {
|
||||
|
@ -95,8 +101,21 @@ public class PQFRPNGenerator implements Visitor {
|
|||
if ("@not".equals(op)) {
|
||||
rpn.c_rpnRpnOp.s_op.andNotOp = new ASN1Null();
|
||||
}
|
||||
rpn.c_rpnRpnOp.s_rpn1 = (RPNStructure) result.pop();
|
||||
rpn.c_rpnRpnOp.s_rpn2 = (RPNStructure) result.pop();
|
||||
ASN1Any rpn1 = result.pop();
|
||||
if (rpn1 instanceof RPNStructure) {
|
||||
Logger.getLogger("test").log(Level.INFO, "rpn1 = " + rpn1);
|
||||
rpn.c_rpnRpnOp.s_rpn1 = (RPNStructure) rpn1;
|
||||
} else {
|
||||
Logger.getLogger("test").log(Level.INFO, "debug rpn1: " + rpn1);
|
||||
}
|
||||
ASN1Any rpn2 = result.pop();
|
||||
if (rpn2 instanceof RPNStructure) {
|
||||
Logger.getLogger("test").log(Level.INFO, "rpn2 = " + rpn2);
|
||||
rpn.c_rpnRpnOp.s_rpn2 = (RPNStructure) rpn2;
|
||||
} else {
|
||||
Logger.getLogger("test").log(Level.INFO, "debug rpn2: " + rpn2);
|
||||
}
|
||||
Logger.getLogger("test").log(Level.INFO, "visit expr: rpn = " + rpn);
|
||||
result.push(rpn);
|
||||
}
|
||||
|
||||
|
@ -111,6 +130,7 @@ public class PQFRPNGenerator implements Visitor {
|
|||
|
||||
@Override
|
||||
public void visit(Term term) {
|
||||
Logger.getLogger("test").log(Level.INFO, "push term = " + term);
|
||||
result.push(new ASN1OctetString(term.getValue()));
|
||||
}
|
||||
|
||||
|
|
|
@ -8,11 +8,17 @@ import java.util.LinkedList;
|
|||
public class Query extends Node {
|
||||
|
||||
private String attrschema;
|
||||
|
||||
private final LinkedList<AttrStr> attrspec = new LinkedList<>();
|
||||
|
||||
private Query querystruct;
|
||||
|
||||
private Setname setname;
|
||||
|
||||
private Term term;
|
||||
|
||||
private Expression expr;
|
||||
|
||||
private PQF pqf;
|
||||
|
||||
// ATTR CHARSTRING1 attrstr querystruct
|
||||
|
@ -91,6 +97,9 @@ public class Query extends Node {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (expr != null) {
|
||||
return "[Query: expr=" + expr + "]";
|
||||
}
|
||||
return "[Query: term=" + term + " attrschema=" + attrschema + " setname=" + setname +
|
||||
" querystruct=" + querystruct + "]";
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ class PQFParserTest {
|
|||
}
|
||||
}
|
||||
assertEquals(errors, 0);
|
||||
assertEquals(ok, 19);
|
||||
assertEquals(ok, 20);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
package org.xbib.z3950.common.pqf;
|
||||
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.xbib.z3950.common.v3.RPNQuery;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
class PQFTest {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(PQFTest.class.getName());
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
void testParser() throws SyntaxException {
|
||||
String q = "@and @attr 1=4 linux @attr 1=2 sybex";
|
||||
PQFParser parser = new PQFParser(new StringReader(q));
|
||||
parser.parse();
|
||||
PQF pqf = parser.getResult();
|
||||
logger.log(Level.INFO, "pqf = " + pqf.toString());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testRPN() {
|
||||
String q = "@and @attr 1=4 linux @attr 1=2 sybex";
|
||||
logger.log(Level.INFO, "rpn = " + createRPNQueryFromPQF(q));
|
||||
}
|
||||
|
||||
private RPNQuery createRPNQueryFromPQF(String query) {
|
||||
PQFRPNGenerator generator = new PQFRPNGenerator();
|
||||
org.xbib.z3950.common.pqf.PQFParser parser = new org.xbib.z3950.common.pqf.PQFParser(new StringReader(query));
|
||||
parser.parse();
|
||||
parser.getResult().accept(generator);
|
||||
return generator.getResult();
|
||||
}
|
||||
}
|
|
@ -17,3 +17,4 @@ dylan
|
|||
@or @and bob dylan @set Result-1
|
||||
@attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
|
||||
@and @attr 2=4 @attr gils 1=2038 -114 @attr 2=2 @attr gils 1=2039 -109
|
||||
@and @attr 1=4 @attr 2=3 @attr 3=3 @attr 4=1 @attr 5=1 @attr 6=1 "linux" @attr 1=2 @attr 2=3 @attr 3=3 @attr 4=1 @attr 5=1 @attr 6=1 "sybex"
|
||||
|
|
Loading…
Reference in a new issue