-// $Id: CQLTermNode.java,v 1.13 2002-12-06 12:35:42 mike Exp $
+// $Id: CQLTermNode.java,v 1.17 2002-12-11 17:14:20 mike Exp $
package org.z3950.zing.cql;
import java.util.Properties;
* these must be provided - you can't have a qualifier without a
* relation or vice versa.
*
- * @version $Id: CQLTermNode.java,v 1.13 2002-12-06 12:35:42 mike Exp $
+ * @version $Id: CQLTermNode.java,v 1.17 2002-12-11 17:14:20 mike Exp $
*/
public class CQLTermNode extends CQLNode {
private String qualifier;
String pos = "any";
String text = term;
if (text.length() > 0 && text.substring(0, 1).equals("^")) {
- text = text.substring(1);
+ text = text.substring(1); // ### change not seen by caller
pos = "first";
}
- // ### add back the last-in-field stuff
+ int len = text.length();
+ if (len > 0 && text.substring(len-1, len).equals("^")) {
+ text = text.substring(0, len-1); // ### change not seen by caller
+ pos = pos.equals("first") ? "firstAndLast" : "last";
+ // ### in the firstAndLast case, the standard
+ // pqf.properties file specifies that we generate a
+ // completeness=whole-field attributem, which means that
+ // we don't generate a position attribute at all. Do we
+ // care? Does it matter?
+ }
+
attr = config.getProperty("position." + pos);
if (attr == null)
throw new UnknownPositionException(pos);
}
public String toPQF(Properties config) throws PQFTranslationException {
+ if (qualifier.equals("srw.resultSet")) {
+ // Special case: ignore relation, modifiers, wildcards, etc.
+ // There's parallel code in toType1BER()
+ return "@set " + maybeQuote(term);
+ }
+
Vector attrs = getAttrs(config);
String attr, s = "";
String text = term;
if (text.length() > 0 && text.substring(0, 1).equals("^"))
text = text.substring(1);
+ int len = text.length();
+ if (len > 0 && text.substring(len-1, len).equals("^"))
+ text = text.substring(0, len-1);
+
return s + maybeQuote(text);
}
return str;
}
- /**
- * ### Document this!
- */
- public byte[] toType1(Properties config) throws PQFTranslationException {
+ public byte[] toType1BER(Properties config) throws PQFTranslationException {
+ if (qualifier.equals("srw.resultSet")) {
+ // Special case: ignore relation, modifiers, wildcards, etc.
+ // There's parallel code in toPQF()
+ byte[] operand = new byte[term.length()+100];
+ int offset;
+ offset = putTag(CONTEXT, 0, CONSTRUCTED, operand, 0); // op
+ operand[offset++] = (byte)(0x80&0xff); // indefinite length
+ offset = putTag(CONTEXT, 31, PRIMITIVE, operand, offset); // ResultSetId
+ byte[] t = term.getBytes();
+ offset = putLen(t.length, operand, offset);
+ System.arraycopy(t, 0, operand, offset, t.length);
+ offset += t.length;
+ operand[offset++] = 0x00; // end of Operand
+ operand[offset++] = 0x00;
+ byte[] o = new byte[offset];
+ System.arraycopy(operand, 0, o, 0, offset);
+ return o;
+ }
+
String text = term;
if (text.length() > 0 && text.substring(0, 1).equals("^"))
text = text.substring(1);
+ int len = text.length();
+ if (len > 0 && text.substring(len-1, len).equals("^"))
+ text = text.substring(0, len-1);
+
String attr, attrList, term = maybeQuote(text);
- System.out.println("in CQLTermNode.toType101(): PQF=" + toPQF(config));
+ System.out.println("in CQLTermNode.toType1BER(): PQF=" + toPQF(config));
byte[] operand = new byte[text.length()+100];
int i, j, offset, type, value;
offset = putTag(CONTEXT, 0, CONSTRUCTED, operand, 0); // op