Author: natalia
Date: Tue Jul 24 19:24:26 2007
New Revision: 559286
URL: http://svn.apache.org/viewvc?view=rev&rev=559286
Log:
Fix for search over wildcard index
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/NameIndexer.java
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/NameIndexer.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/NameIndexer.java?view=diff&rev=559286&r1=559285&r2=559286
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/NameIndexer.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/NameIndexer.java Tue Jul 24 19:24:26 2007
@@ -109,7 +109,7 @@
public void remove(String value, Key key, int pos, int len, short elemID, short attrID) throws DBException {
try {
- removeValue(key);
+ removeValue(getCombinedValue(key, pos, len, elemID, attrID));
} catch (IOException e) {
throw new BTreeCorruptException("Corruption detected on remove", e);
}
@@ -117,12 +117,62 @@
public void add(String value, Key key, int pos, int len, short elemID, short attrID) throws DBException {
try {
- addValue(key, 0);
+ addValue(getCombinedValue(key, pos, len, elemID, attrID), 0);
} catch (IOException e) {
throw new BTreeCorruptException("Corruption detected on add", e);
}
}
+ private Value getCombinedValue(Key key, int pos, int len, short elemID, short attrID) {
+ Value result;
+ try {
+ int l = key.getLength();
+ byte[] b = new byte[l + 13];
+
+ // Write the key
+ key.copyTo(b, 0, l);
+ b[l] = 0;
+
+ // Write the pos
+ b[l + 1] = (byte) ((pos >>> 24) & 0xFF);
+ b[l + 2] = (byte) ((pos >>> 16) & 0xFF);
+ b[l + 3] = (byte) ((pos >>> 8) & 0xFF);
+ b[l + 4] = (byte) ( pos & 0xFF);
+
+ // Write the len
+ b[l + 5] = (byte) ((len >>> 24) & 0xFF);
+ b[l + 6] = (byte) ((len >>> 16) & 0xFF);
+ b[l + 7] = (byte) ((len >>> 8) & 0xFF);
+ b[l + 8] = (byte) ( len & 0xFF);
+
+ // Write the elemID
+ b[l + 9] = (byte) ((elemID >>> 8) & 0xFF);
+ b[l + 10] = (byte) ( elemID & 0xFF);
+
+ // Write the attrID
+ b[l + 11] = (byte) ((attrID >>> 8) & 0xFF);
+ b[l + 12] = (byte) ( attrID & 0xFF);
+
+ result = new Value(b);
+ } catch (Exception e) {
+ result = null; // This will never happen
+ }
+ return result;
+ }
+
+ private IndexMatch getIndexMatch(Value v) {
+ byte[] b = v.getData();
+ int l = b.length - 13;
+ Key key = new Key(b, 0, b.length - 13);
+
+ int pos = ((b[l + 1] << 24) | (b[l + 2] << 16) | (b[l + 3] << 8) | b[l + 4]);
+ int len = ((b[l + 5] << 24) | (b[l + 6] << 16) | (b[l + 7] << 8) | b[l + 8]);
+ short elemID = (short) ((b[l + 9] << 8) | b[l + 10]);
+ short attrID = (short) ((b[l + 11] << 8) | b[l + 12]);
+
+ return new IndexMatch(key, pos, len, elemID, attrID);
+ }
+
public IndexMatch[] queryMatches(final IndexQuery query) throws DBException {
final List results = new ArrayList();
final IndexPattern pattern = query.getPattern();
@@ -130,7 +180,15 @@
try {
query(query, new BTreeCallback() {
public boolean indexInfo(Value value, long pos) {
- results.add(new IndexMatch(new Key(value), pattern));
+ IndexMatch match = getIndexMatch(value);
+ if (wildcard) {
+ IndexPattern pt = new IndexPattern(symbols, match.getElement(), match.getAttribute());
+ if (pt.getMatchLevel(pattern) > 0) {
+ results.add(match);
+ }
+ } else {
+ results.add(match);
+ }
return true;
}
});
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.