X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Forg%2Fz3950%2Fzing%2Fcql%2FCQLProxNode.java;h=d0ac772b58904456e4717a6b7255ab7e09f4d376;hb=ad441f7588070233573d763992e71fe8dc867a4d;hp=9546187421183a0bb641fd9fbe9a35d39437f087;hpb=d437bf5b5983b0c7e3a43ab5e5cb5d6b1670896c;p=cql-java-moved-to-github.git diff --git a/src/org/z3950/zing/cql/CQLProxNode.java b/src/org/z3950/zing/cql/CQLProxNode.java index 9546187..d0ac772 100644 --- a/src/org/z3950/zing/cql/CQLProxNode.java +++ b/src/org/z3950/zing/cql/CQLProxNode.java @@ -1,4 +1,4 @@ -// $Id: CQLProxNode.java,v 1.6 2002-11-20 17:56:22 mike Exp $ +// $Id: CQLProxNode.java,v 1.8 2007-06-27 17:02:01 mike Exp $ package org.z3950.zing.cql; import java.util.Vector; @@ -10,7 +10,7 @@ import java.util.Vector; * candidate records which are sufficiently close to each other, as * specified by a set of proximity parameters. * - * @version $Id: CQLProxNode.java,v 1.6 2002-11-20 17:56:22 mike Exp $ + * @version $Id: CQLProxNode.java,v 1.8 2007-06-27 17:02:01 mike Exp $ */ public class CQLProxNode extends CQLBooleanNode { ModifierSet ms; @@ -58,12 +58,9 @@ public class CQLProxNode extends CQLBooleanNode { * Returns an array of the modifiers associated with a proximity * node. * @return - * An array of modifiers, each represented by a two-element - * Vector, in which element 0 is the modifier type - * (e.g. distance or ordering) and element 1 is - * the associated value (e.g. 3 or unordered). + * An array of Modifier objects. */ - public Vector[] getModifiers() { + public Vector getModifiers() { return ms.getModifiers(); } @@ -85,42 +82,98 @@ public class CQLProxNode extends CQLBooleanNode { * unit-code ::= integer. */ String opPQF() { + int relCode = getRelCode(); + int unitCode = getProxUnitCode(); + + String res = "prox " + + "0 " + + ms.modifier("distance") + " " + + (ms.modifier("ordering").equals("ordered") ? 1 : 0) + " " + + relCode + " " + + "1 " + + unitCode; + + return res; + } + + private int getRelCode() { String rel = ms.modifier("relation"); - int relCode = 0; if (rel.equals("<")) { - relCode = 1; + return 1; } else if (rel.equals("<=")) { - relCode = 2; + return 2; } else if (rel.equals("=")) { - relCode = 3; + return 3; } else if (rel.equals(">=")) { - relCode = 4; + return 4; } else if (rel.equals(">")) { - relCode = 5; + return 5; } else if (rel.equals("<>")) { - relCode = 6; + return 6; } + return 0; + } + private int getProxUnitCode() { String unit = ms.modifier("unit"); - int unitCode = 0; if (unit.equals("word")) { - unitCode = 2; + return 2; } else if (unit.equals("sentence")) { - unitCode = 3; + return 3; } else if (unit.equals("paragraph")) { - unitCode = 4; + return 4; } else if (unit.equals("element")) { - unitCode = 8; + return 8; } + return 0; + } - String res = "prox " + - "0 " + - ms.modifier("distance") + " " + - (ms.modifier("ordering").equals("ordered") ? 1 : 0) + " " + - relCode + " " + - "1 " + - unitCode; - - return res; + + byte[] opType1() { + byte[] op = new byte[100]; + int offset, value; + offset = putTag(CONTEXT, 46, CONSTRUCTED, op, 0); // Operator + op[offset++] = (byte)(0x80&0xff); // indefinite length + + offset = putTag(CONTEXT, 3, CONSTRUCTED, op, offset); // prox + op[offset++] = (byte)(0x80&0xff); // indefinite length + + offset = putTag(CONTEXT, 1, PRIMITIVE, op, offset); // exclusion + value = 0; // false + offset = putLen(numLen(value), op, offset); + offset = putNum(value, op, offset); + + offset = putTag(CONTEXT, 2, PRIMITIVE, op, offset); // distance + value = Integer.parseInt(ms.modifier("distance")); + offset = putLen(numLen(value), op, offset); + offset = putNum(value, op, offset); + + offset = putTag(CONTEXT, 3, PRIMITIVE, op, offset); // ordered + value = ms.modifier("ordering").equals("ordered") ? 1 : 0; + offset = putLen(numLen(value), op, offset); + offset = putNum(value, op, offset); + + offset = putTag(CONTEXT, 4, PRIMITIVE, op, offset); // relationType + value = getRelCode(); + offset = putLen(numLen(value), op, offset); + offset = putNum(value, op, offset); + + offset = putTag(CONTEXT, 5, CONSTRUCTED, op, offset); // proximityUnitCode + op[offset++] = (byte)(0x80&0xff); // indefinite length + offset = putTag(CONTEXT, 1, PRIMITIVE, op, offset); // known + value = getProxUnitCode(); + offset = putLen(numLen(value), op, offset); + offset = putNum(value, op, offset); + op[offset++] = 0x00; // end of proximityUnitCode + op[offset++] = 0x00; + + op[offset++] = 0x00; // end of prox + op[offset++] = 0x00; + op[offset++] = 0x00; // end of Operator + op[offset++] = 0x00; + + byte[] o = new byte[offset]; + System.arraycopy(op, 0, o, 0, offset); + return o; } }