je/test/standalone/RepTestData.java
2021-06-06 13:46:45 -04:00

158 lines
4.8 KiB
Java
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*-
* Copyright (C) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
import static com.sleepycat.persist.model.Relationship.MANY_TO_ONE;
import static com.sleepycat.persist.model.Relationship.ONE_TO_ONE;
import com.sleepycat.je.CursorConfig;
import com.sleepycat.persist.EntityCursor;
import com.sleepycat.persist.EntityStore;
import com.sleepycat.persist.PrimaryIndex;
import com.sleepycat.persist.SecondaryIndex;
import com.sleepycat.persist.model.Entity;
import com.sleepycat.persist.model.PrimaryKey;
import com.sleepycat.persist.model.SecondaryKey;
@Entity
class RepTestData {
@SuppressWarnings("unused")
@PrimaryKey(sequence="KEY")
private int key;
@SuppressWarnings("unused")
@SecondaryKey(relate=ONE_TO_ONE)
private int data;
@SuppressWarnings("unused")
@SecondaryKey(relate=MANY_TO_ONE)
private String name;
public void setKey(int key) {
this.key = key;
}
public void setData(int data) {
this.data = data;
}
public void setName(String name) {
this.name = name;
}
public int getKey() {
return key;
}
public int getData() {
return data;
}
public String getName() {
return name;
}
public boolean logicEquals(RepTestData object, int distance) {
if (object == null) {
return false;
}
if (key == (object.getKey() + distance) &&
data == (object.getData() + distance) &&
name.equals(object.getName())) {
return true;
}
return false;
}
public String toString() {
return "Instance: key = " + key + ", data = " + data +
", name = " + name;
}
/* Insert dbSize records to the specified EntityStore. */
public static void insertData(EntityStore dbStore, int dbSize)
throws Exception {
insertData(dbStore, dbSize, false);
}
/*
* Insert dbSize reocrds to the specified EntityStore.
*
* If useFixedName is true, the name field will be assigned a fixed string,
* to make the assertion in ReplicaReading works corrrectly.
*/
public static void insertData(EntityStore dbStore,
int dbSize,
boolean useFixedName)
throws Exception {
PrimaryIndex<Integer, RepTestData> primaryIndex =
dbStore.getPrimaryIndex(Integer.class, RepTestData.class);
for (int i = 1; i <= dbSize; i++) {
RepTestData data = new RepTestData();
data.setData(i);
data.setName(useFixedName ? "test" : generateNameField(i));
primaryIndex.put(data);
}
System.out.println("num unique keys in names field = " +
countUniqueNames(dbStore, primaryIndex));
dbStore.close();
}
/*
* Vary the name field has a many-one secondary key. We will manipulate
* this data in order to create a duplicates data base with both single
* keys, and keys that have duplicate trees, to create more stress.
*/
public static String generateNameField(int index) {
if ((index % 5) == 0) {
return "testSingle_" + index; // singleton keys
} else if ((index % 7) == 0) {
return "test_7"; // dup tree of key=test7
} else if ((index % 4) == 0) {
return "test_4"; // dup tree of key=test4
} else if ((index % 3) == 0) {
return "test_3"; // dup tree of key=test3
} else if ((index % 2) == 0) {
return "test_2"; // dup tree of key=test2
} else {
return "testSingle_" + index; // singleton keys
}
}
/**
* Count the unique number of names in a entity store of RepTestData, in
* order to validate that there is a reasonable distribution of duplicate
* values.
*/
public static int
countUniqueNames(EntityStore store,
PrimaryIndex<Integer, RepTestData> primary) {
SecondaryIndex<String, Integer, RepTestData> recordByName =
store.getSecondaryIndex(primary, String.class, "name");
EntityCursor<String> nameVals =
recordByName.keys(null, CursorConfig.READ_UNCOMMITTED);
int numUnique = 0;
while (nameVals.nextNoDup() != null) {
numUnique++;
}
nameVals.close();
return numUnique;
}
}