Author: vgritsenko
Date: Fri Oct 27 20:18:08 2006
New Revision: 468625
URL: http://svn.apache.org/viewvc?view=rev&rev=468625
Log:
<action dev="VG" type="fix" fixes-bug="31159">
Add pagecount configuration parameter to Paged based
filers: HashFiler, BTreeFiler.
</action>
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java
xml/xindice/trunk/java/tests/src/org/apache/xindice/core/filer/FilerTestBase.java
xml/xindice/trunk/status.xml
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java Fri Oct 27
20:18:08 2006
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*
- * CVS $Id$
+ * $Id$
*/
package org.apache.xindice.core.data;
@@ -21,7 +21,7 @@
/**
* Key extends Value by providing a hash value for the Key.
*
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
*/
public final class Key extends Value {
private int hash = 0;
@@ -63,11 +63,10 @@
public boolean equals(Value value) {
if (value instanceof Key) {
Key key = (Key) value;
- return getHash() == key.getHash() ? compareTo(key) == 0
- : false;
- } else {
- return super.equals(value);
+ return getHash() == key.getHash() && compareTo(key) == 0;
}
+
+ return super.equals(value);
}
public int hashCode() {
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java Fri Oct
27 20:18:08 2006
@@ -88,6 +88,7 @@
private BTreeRootInfo rootInfo;
private BTreeNode rootNode;
+
public BTree() {
super();
fileHeader = (BTreeFileHeader) getFileHeader();
@@ -958,10 +959,7 @@
////////////////////////////////////////////////////////////////////
public FileHeader createFileHeader() {
- BTreeFileHeader header = new BTreeFileHeader();
- header.setPageCount(1);
- header.setTotalCount(1);
- return header;
+ return new BTreeFileHeader();
}
public FileHeader createFileHeader(boolean read) throws IOException {
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
Fri Oct 27 20:18:08 2006
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*
- * CVS $Id$
+ * $Id$
*/
package org.apache.xindice.core.filer;
@@ -40,9 +40,10 @@
/**
* BTreeFiler is a Filer implementation based on the BTree class.
*
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
*/
-public final class BTreeFiler extends BTree implements Filer {
+public final class BTreeFiler extends BTree
+ implements Filer {
private static final Log log = LogFactory.getLog(BTreeFiler.class);
@@ -174,14 +175,9 @@
return new BTreeFilerRecordSet();
}
- public void flush() throws DBException {
- super.flush();
- }
-
/**
* BTreeFilerRecordSet
*/
-
private class BTreeFilerRecordSet implements RecordSet, BTreeCallback {
private List keys = new ArrayList();
private Iterator iter;
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java Fri
Oct 27 20:18:08 2006
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*
- * CVS $Id$
+ * $Id$
*/
package org.apache.xindice.core.filer;
@@ -26,6 +26,7 @@
import org.apache.xindice.core.data.Record;
import org.apache.xindice.core.data.RecordSet;
import org.apache.xindice.core.data.Value;
+import org.apache.xindice.util.Configuration;
import java.io.DataInput;
import java.io.DataOutput;
@@ -45,9 +46,10 @@
* data and allocate Record space.
*
* @deprecated This class has been temporarily deprecated by BTreeFiler.
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
*/
-public final class HashFiler extends Paged implements Filer {
+public final class HashFiler extends Paged
+ implements Filer {
private static final Log log = LogFactory.getLog(HashFiler.class);
@@ -56,12 +58,6 @@
*/
protected static final byte RECORD = 1;
- /**
- * Name of the configuration attribute pagecount
- */
- private static final String PAGECOUNT = "pagecount";
-
-
private HashFileHeader fileHeader;
@@ -78,11 +74,11 @@
return "HashFiler";
}
- public boolean create() throws DBException {
- fileHeader.setPageCount(getConfig().getLongAttribute(PAGECOUNT,
-
fileHeader.getPageCount()));
+ public void setConfig(Configuration config) {
+ super.setConfig(config);
+ // Since pageCount is used as a hash table size, all pageCount pages
+ // are considered used; so set totalCount to pageCount.
fileHeader.setTotalCount(fileHeader.getPageCount());
- return super.create();
}
private Page seekRecordPage(Key key) throws IOException {
@@ -290,13 +286,24 @@
try {
long pageNum = 0;
- while (pageNum < fileHeader.getTotalCount()) {
+ // Iterate over main hash table...
+ while (pageNum < fileHeader.getPageCount()) {
Page p = getPage(pageNum);
HashPageHeader ph = (HashPageHeader) p.getPageHeader();
if (ph.getStatus() == RECORD) {
keys.add(p.getKey());
}
+ // ... and over collision chains
+ while (ph.getNextCollision() != NO_PAGE) {
+ long pn = ph.getNextCollision();
+ p = getPage(pn);
+ ph = (HashPageHeader) p.getPageHeader();
+ if (ph.getStatus() == RECORD) {
+ keys.add(p.getKey());
+ }
+ }
+
pageNum++;
}
@@ -351,21 +358,27 @@
* HashFileHeader
*/
private final class HashFileHeader extends FileHeader {
- private long totalBytes = 0;
+ private long totalBytes;
public HashFileHeader() {
+ super();
+ // For hash filer, totalCount >= pageCount. See setConfig().
+ setTotalCount(getPageCount());
}
public HashFileHeader(long pageCount) {
super(pageCount);
+ setTotalCount(getPageCount());
}
public HashFileHeader(long pageCount, int pageSize) {
super(pageCount, pageSize);
+ setTotalCount(getPageCount());
}
public HashFileHeader(boolean read) throws IOException {
super(read);
+ setTotalCount(getPageCount());
}
public synchronized void read(RandomAccessFile raf) throws IOException
{
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java Fri Oct
27 20:18:08 2006
@@ -87,17 +87,22 @@
/**
* Name of the configuration attribute "pagesize"
*/
- private static final String CONFIG_PAGESIZE = "pagesize";
+ protected static final String CONFIG_PAGESIZE = "pagesize";
+
+ /**
+ * Name of the configuration attribute "pagecount"
+ */
+ protected static final String CONFIG_PAGECOUNT = "pagecount";
/**
* Name of the configuration attribute "maxkeysize"
*/
- private static final String CONFIG_KEYSIZE_MAX = "maxkeysize";
+ protected static final String CONFIG_KEYSIZE_MAX = "maxkeysize";
/**
* Name of the configuration attribute "max-descriptors"
*/
- private static final String CONFIG_DESCRIPTORS_MAX = "max-descriptors";
+ protected static final String CONFIG_DESCRIPTORS_MAX = "max-descriptors";
/**
* Default value of the "pagesize".
@@ -105,6 +110,16 @@
private static final int DEFAULT_PAGESIZE = 4096;
/**
+ * Default value of the "pagecount".
+ */
+ private static final int DEFAULT_PAGECOUNT = 1024;
+
+ /**
+ * File header size
+ */
+ private static final int FILE_HEADER_SIZE = 4096;
+
+ /**
* Default value of the "maxkeysize".
*/
private static final int DEFAULT_KEYSIZE_MAX = 256;
@@ -209,6 +224,15 @@
public void setConfig(Configuration config) {
this.config = config;
+ // Read paged config
+ fileHeader.setPageSize(config.getIntAttribute(CONFIG_PAGESIZE,
+
fileHeader.getPageSize()));
+ fileHeader.setPageCount(config.getLongAttribute(CONFIG_PAGECOUNT,
+
fileHeader.getPageCount()));
+ fileHeader.setMaxKeySize(config.getShortAttribute(CONFIG_KEYSIZE_MAX,
+
fileHeader.getMaxKeySize()));
+ descriptorsMax = getConfig().getIntAttribute(CONFIG_DESCRIPTORS_MAX,
+ descriptorsMax);
}
public Configuration getConfig() {
@@ -567,10 +591,6 @@
}
public boolean create() throws DBException {
- fileHeader.setPageSize(config.getIntAttribute(CONFIG_PAGESIZE,
-
fileHeader.getPageSize()));
- fileHeader.setMaxKeySize(config.getShortAttribute(CONFIG_KEYSIZE_MAX,
-
fileHeader.getMaxKeySize()));
try {
createFile();
fileHeader.write();
@@ -597,15 +617,11 @@
public synchronized boolean open() throws DBException {
RandomAccessFile raf = null;
try {
- // Initialize configurable parameters
- descriptorsMax =
getConfig().getIntAttribute(CONFIG_DESCRIPTORS_MAX,
- descriptorsMax);
-
if (exists()) {
raf = getDescriptor();
fileHeader.read();
- // These are the only properties that can be changed after
creation
+ // This is the only property that can be changed after creation
fileHeader.setMaxKeySize(config.getShortAttribute(CONFIG_KEYSIZE_MAX,
fileHeader.getMaxKeySize()));
@@ -879,22 +895,38 @@
/**
* Paged file's header
*/
- public abstract class FileHeader {
- private boolean dirty = false;
+ protected abstract class FileHeader {
+ private boolean dirty;
private int workSize;
private short headerSize;
+
+ /**
+ * Size of the page in bytes.
+ */
private int pageSize;
+
+ /**
+ * Number of pages initially allocated for the file.
+ * Has a special (historical) meaning for HashFiler.
+ */
private long pageCount;
+
+ /**
+ * Number of pages used by the filer. Initially set to 0.
+ * Has somewhat different (historical) meaning for HashFiler.
+ */
private long totalCount;
+
private long firstFreePage = -1;
private long lastFreePage = -1;
private byte pageHeaderSize = 64;
private short maxKeySize = DEFAULT_KEYSIZE_MAX;
private long recordCount;
+
public FileHeader() {
- this(1024);
+ this(DEFAULT_PAGECOUNT);
}
public FileHeader(long pageCount) {
@@ -904,8 +936,7 @@
public FileHeader(long pageCount, int pageSize) {
this.pageSize = pageSize;
this.pageCount = pageCount;
- this.totalCount = 0;
- this.headerSize = (short) 4096;
+ this.headerSize = (short) FILE_HEADER_SIZE;
calculateWorkSize();
}
@@ -1127,7 +1158,7 @@
/**
* Paged file page's header
*/
- public abstract static class PageHeader implements Streamable {
+ protected abstract static class PageHeader implements Streamable {
private boolean dirty;
private byte status = UNUSED;
private short keyLen;
@@ -1254,7 +1285,7 @@
/**
* Paged file's page
*/
- public final class Page implements Comparable {
+ protected final class Page implements Comparable {
/**
* This page number
*/
Modified:
xml/xindice/trunk/java/tests/src/org/apache/xindice/core/filer/FilerTestBase.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/core/filer/FilerTestBase.java?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
---
xml/xindice/trunk/java/tests/src/org/apache/xindice/core/filer/FilerTestBase.java
(original)
+++
xml/xindice/trunk/java/tests/src/org/apache/xindice/core/filer/FilerTestBase.java
Fri Oct 27 20:18:08 2006
@@ -41,31 +41,35 @@
*/
public class FilerTestBase extends TestCase {
- static public final String TEST_COLLECTION_NAME = "tests";
- static public final Key TEST_KEY = new Key("test.xml");
- static public final Value TEST_VALUE = new
Value("<test><test></test><test>Just a test</test></test>");
- static public final Value TEST_VALUE_2 = new
Value("<test><test></test><test>Just a test 2</test></test>");
- static public final Value TEST_VALUE_3 = new
Value("<test><test></test><test>Just a test 3</test></test>");
+ public static final String TEST_COLLECTION_NAME = "tests";
+ public static final Key TEST_KEY = new Key("test.xml");
+ public static final Value TEST_VALUE = new
Value("<test><test></test><test>Just a test</test></test>");
+ public static final Value TEST_VALUE_2 = new
Value("<test><test></test><test>Just a test 2</test></test>");
+ public static final Value TEST_VALUE_3 = new
Value("<test><test></test><test>Just a test 3</test></test>");
+
+ private static final File ROOT = new File(TEST_COLLECTION_NAME);
/**
- * Key size for the testLargeKey. FSFiler will set smaller value for its
test.
+ * Key size for the testLargeKey. FSFiler and HashFiler will set smaller
value
+ * for their tests.
*/
protected int LARGE_KEY_SIZE = 8192 + 32;
-
- private static final File root = new File(TEST_COLLECTION_NAME);
private Filer filer;
+
public FilerTestBase(String name, Filer filer) {
super(name);
this.filer = filer;
}
public void setUp() throws Exception {
- root.mkdir();
- filer.setLocation(root, TEST_COLLECTION_NAME);
+ ROOT.mkdir();
+ filer.setLocation(ROOT, TEST_COLLECTION_NAME);
// FSFiler needs location attribute
- filer.setConfig(new Configuration(DOMParser.toDocument("<filer
location=\"" + TEST_COLLECTION_NAME + "\" />")));
+ String config = "<filer location='" + TEST_COLLECTION_NAME + "' " +
+ "pagecount='128' pagesize='4096'/>";
+ filer.setConfig(new Configuration(DOMParser.toDocument(config)));
if (!filer.exists()) {
filer.create();
}
@@ -84,11 +88,11 @@
filer.close();
}
- String[] files = root.list();
+ String[] files = ROOT.list();
for (int i = 0; i < files.length; i++) {
- new File(root, files[i]).delete();
+ new File(ROOT, files[i]).delete();
}
- root.delete();
+ ROOT.delete();
super.tearDown();
}
@@ -105,7 +109,7 @@
RecordSet set = filer.getRecordSet();
assertEquals(result.getValue(), set.getNextRecord().getValue());
- assertTrue(set.hasMoreRecords() == false);
+ assertFalse(set.hasMoreRecords());
filer.deleteRecord(TEST_KEY);
assertEquals(0, filer.getRecordCount());
@@ -195,7 +199,7 @@
assertEquals(1, filer.getRecordCount());
// These should all just fail silently.
- assertTrue(false == filer.deleteRecord(null));
+ assertFalse(filer.deleteRecord(null));
assertEquals(1, filer.getRecordCount());
}
@@ -204,7 +208,7 @@
assertEquals(1, filer.getRecordCount());
// These should all just fail silently.
- assertTrue(false == filer.deleteRecord(new Key("")));
+ assertFalse(filer.deleteRecord(new Key("")));
assertEquals(1, filer.getRecordCount());
}
@@ -213,7 +217,7 @@
assertEquals(1, filer.getRecordCount());
// These should all just fail silently.
- assertTrue(false == filer.deleteRecord(new Key("non-existant-key")));
+ assertFalse(filer.deleteRecord(new Key("non-existant-key")));
assertEquals(1, filer.getRecordCount());
}
@@ -276,6 +280,8 @@
}
assertTrue(filer.getRecordCount() == 0);
+ RecordSet result = filer.getRecordSet();
+ assertTrue(!result.hasMoreRecords());
}
public void testConcurrentInsert() throws Exception {
Modified: xml/xindice/trunk/status.xml
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/status.xml?view=diff&rev=468625&r1=468624&r2=468625
==============================================================================
--- xml/xindice/trunk/status.xml (original)
+++ xml/xindice/trunk/status.xml Fri Oct 27 20:18:08 2006
@@ -73,7 +73,11 @@
</todo>
<changes>
- <release version="1.1b5-dev" date="Oct 24 2006">
+ <release version="1.1b5-dev" date="Oct 27 2006">
+ <action dev="VG" type="fix" fixes-bug="31159">
+ Add pagecount configuration parameter to Paged based
+ filers: HashFiler, BTreeFiler.
+ </action>
<action dev="VG" type="fix">
HashFiler did not allocate root page correctly.
</action>