je/examples/persist/sqlapp/DataAccessor.java
2021-06-06 13:46:45 -04:00

228 lines
7.8 KiB
Java
Raw 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.
*/
package persist.sqlapp;
import java.util.Collection;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.persist.EntityCursor;
import com.sleepycat.persist.EntityIndex;
import com.sleepycat.persist.EntityJoin;
import com.sleepycat.persist.EntityStore;
import com.sleepycat.persist.ForwardCursor;
import com.sleepycat.persist.PrimaryIndex;
import com.sleepycat.persist.SecondaryIndex;
/**
* The data accessor class for the entity model.
*
* @author chao
*/
class DataAccessor {
/* Employee Accessors */
PrimaryIndex<Integer, Employee> employeeById;
SecondaryIndex<String, Integer, Employee> employeeByName;
SecondaryIndex<Float, Integer, Employee> employeeBySalary;
SecondaryIndex<Integer, Integer, Employee> employeeByManagerId;
SecondaryIndex<Integer, Integer, Employee> employeeByDepartmentId;
/* Department Accessors */
PrimaryIndex<Integer, Department> departmentById;
SecondaryIndex<String, Integer, Department> departmentByName;
/** Opens all primary and secondary indices. */
public DataAccessor(EntityStore store)
throws DatabaseException {
/* Primary index of the Employee database. */
employeeById =
store.getPrimaryIndex(Integer.class, Employee.class);
/* Secondary index of the Employee database. */
employeeByName = store.getSecondaryIndex(employeeById,
String.class,
"employeeName");
employeeBySalary = store.getSecondaryIndex(employeeById,
Float.class,
"salary");
employeeByManagerId = store.getSecondaryIndex(employeeById,
Integer.class,
"managerId");
employeeByDepartmentId = store.getSecondaryIndex(employeeById,
Integer.class,
"departmentId");
/* Primary index of the Department database. */
departmentById =
store.getPrimaryIndex(Integer.class, Department.class);
/* Secondary index of the Department database. */
departmentByName = store.getSecondaryIndex(departmentById,
String.class,
"departmentName");
}
/**
* Do prefix query, similar to the SQL statement:
* <blockquote><pre>
* SELECT * FROM table WHERE col LIKE 'prefix%';
* </pre></blockquote>
*
* @param index
* @param prefix
* @return
* @throws DatabaseException
*/
public <V> EntityCursor<V> doPrefixQuery(EntityIndex<String, V> index,
String prefix)
throws DatabaseException {
assert (index != null);
assert (prefix.length() > 0);
/* Opens a cursor for traversing entities in a key range. */
char[] ca = prefix.toCharArray();
final int lastCharIndex = ca.length - 1;
ca[lastCharIndex]++;
return doRangeQuery(index, prefix, true, String.valueOf(ca), false);
}
/**
* Do range query, similar to the SQL statement:
* <blockquote><pre>
* SELECT * FROM table WHERE col >= fromKey AND col <= toKey;
* </pre></blockquote>
*
* @param index
* @param fromKey
* @param fromInclusive
* @param toKey
* @param toInclusive
* @return
* @throws DatabaseException
*/
public <K, V> EntityCursor<V> doRangeQuery(EntityIndex<K, V> index,
K fromKey,
boolean fromInclusive,
K toKey,
boolean toInclusive)
throws DatabaseException {
assert (index != null);
/* Opens a cursor for traversing entities in a key range. */
return index.entities(fromKey,
fromInclusive,
toKey,
toInclusive);
}
/**
* Do a "AND" join on a single primary database, similar to the SQL:
* <blockquote><pre>
* SELECT * FROM table WHERE col1 = key1 AND col2 = key2;
* </pre></blockquote>
*
* @param pk
* @param sk1
* @param key1
* @param sk2
* @param key2
* @return
* @throws DatabaseException
*/
public <PK, SK1, SK2, E> ForwardCursor<E>
doTwoConditionsJoin(PrimaryIndex<PK, E> pk,
SecondaryIndex<SK1, PK, E> sk1,
SK1 key1,
SecondaryIndex<SK2, PK, E> sk2,
SK2 key2)
throws DatabaseException {
assert (pk != null);
assert (sk1 != null);
assert (sk2 != null);
EntityJoin<PK, E> join = new EntityJoin<PK, E>(pk);
join.addCondition(sk1, key1);
join.addCondition(sk2, key2);
return join.entities();
}
/**
* Query the Employee database by Department's secondary-key: deptName.
* <blockquote><pre>
* SELECT * FROM employee e, department d
* WHERE e.departmentId = d.departmentId
* AND d.departmentName = 'deptName';
* </pre></blockquote>
*
* @param deptName
* @throws DatabaseException
*/
public void getEmployeeByDeptName(String deptName)
throws DatabaseException {
Department dept = departmentByName.get(deptName);
/* Do an inner join on Department and Employee. */
EntityCursor<Employee> empCursor =
employeeByDepartmentId.
subIndex(dept.getDepartmentId()).entities();
try {
for (Employee emp : empCursor) {
System.out.println(emp);
}
System.out.println();
} finally {
empCursor.close();
}
}
/**
* Query the Employee database by adding a filter on Department's
* non-secondary-key: deptLocation.
* <blockquote><pre>
* SELECT * FROM employee e, department d
* WHERE e.departmentId = d.departmentId
* AND d.location = 'deptLocation';
* </pre></blockquote>
*
* @param deptLocation
* @throws DatabaseException
*/
public void getEmployeeByDeptLocation(String deptLocation)
throws DatabaseException {
/* Iterate over Department database. */
Collection<Department> departments =
departmentById.sortedMap().values();
for (Department dept : departments) {
if (dept.getLocation().equals(deptLocation)) {
/* A nested loop to do an equi-join. */
EntityCursor<Employee> empCursor =
employeeByDepartmentId.
subIndex(dept.getDepartmentId()).
entities();
try {
/* Iterate over all employees in dept. */
for (Employee emp : empCursor) {
System.out.println(emp);
}
} finally {
empCursor.close();
}
}
}
}
}