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; } });