mirror of
https://github.com/berkeleydb/je.git
synced 2024-11-15 01:46:24 +00:00
330 lines
12 KiB
Java
330 lines
12 KiB
Java
|
/*-
|
|||
|
* 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.io.File;
|
|||
|
|
|||
|
import com.sleepycat.je.DatabaseException;
|
|||
|
import com.sleepycat.je.Environment;
|
|||
|
import com.sleepycat.je.EnvironmentConfig;
|
|||
|
import com.sleepycat.persist.EntityStore;
|
|||
|
import com.sleepycat.persist.ForwardCursor;
|
|||
|
import com.sleepycat.persist.StoreConfig;
|
|||
|
|
|||
|
/**
|
|||
|
* An example shows how some common SQL queries are implemented using DPL.
|
|||
|
*
|
|||
|
* @see #usage
|
|||
|
*
|
|||
|
* @author chao
|
|||
|
*/
|
|||
|
public class SQLApp {
|
|||
|
|
|||
|
private static String envDir = "./tmp";
|
|||
|
private static boolean cleanEnvOnExit = false;
|
|||
|
private static Environment env = null;
|
|||
|
private static EntityStore store = null;
|
|||
|
private static DataAccessor dao = null;
|
|||
|
|
|||
|
/**
|
|||
|
* Setup a Berkeley DB engine environment, and preload some example records.
|
|||
|
*
|
|||
|
* @throws com.sleepycat.je.DatabaseException
|
|||
|
*/
|
|||
|
public void setup()
|
|||
|
throws DatabaseException {
|
|||
|
|
|||
|
/* Open a transactional Berkeley DB engine environment. */
|
|||
|
EnvironmentConfig envConfig = new EnvironmentConfig();
|
|||
|
envConfig.setAllowCreate(true);
|
|||
|
envConfig.setTransactional(true);
|
|||
|
env = new Environment(new File(envDir), envConfig);
|
|||
|
|
|||
|
/* Open a transactional entity store. */
|
|||
|
StoreConfig storeConfig = new StoreConfig();
|
|||
|
storeConfig.setAllowCreate(true);
|
|||
|
storeConfig.setTransactional(true);
|
|||
|
store = new EntityStore(env, "SQLAppStore", storeConfig);
|
|||
|
|
|||
|
/* Initialize the data access object. */
|
|||
|
dao = new DataAccessor(store);
|
|||
|
|
|||
|
/* Preload some example records. */
|
|||
|
loadDepartmentDb();
|
|||
|
loadEmployeeDb();
|
|||
|
}
|
|||
|
|
|||
|
/* Load the department database. */
|
|||
|
private void loadDepartmentDb()
|
|||
|
throws DatabaseException {
|
|||
|
|
|||
|
dao.departmentById.put
|
|||
|
(new Department(1, "CEO Office", "North America"));
|
|||
|
dao.departmentById.put
|
|||
|
(new Department(2, "Sales", "EURO"));
|
|||
|
dao.departmentById.put
|
|||
|
(new Department(3, "HR", "MEA"));
|
|||
|
dao.departmentById.put
|
|||
|
(new Department(4, "Engineering", "APAC"));
|
|||
|
dao.departmentById.put
|
|||
|
(new Department(5, "Support", "LATAM"));
|
|||
|
}
|
|||
|
|
|||
|
/* Load the employee database. */
|
|||
|
private void loadEmployeeDb()
|
|||
|
throws DatabaseException {
|
|||
|
|
|||
|
/* Add the corporate's CEO using the Employee primary index. */
|
|||
|
dao.employeeById.put(new Employee(1, // employeeId
|
|||
|
"Abraham Lincoln", //employeeName
|
|||
|
10000.0f, //salary
|
|||
|
null, //managerId
|
|||
|
1, //departmentId
|
|||
|
"Washington D.C., USA")); //address
|
|||
|
|
|||
|
/* Add 4 managers responsible for 4 departments. */
|
|||
|
dao.employeeById.put(new Employee(2,
|
|||
|
"Augustus",
|
|||
|
9000.0f,
|
|||
|
1,
|
|||
|
2,
|
|||
|
"Rome, Italy"));
|
|||
|
dao.employeeById.put(new Employee(3,
|
|||
|
"Cleopatra",
|
|||
|
7000.0f,
|
|||
|
1,
|
|||
|
3,
|
|||
|
"Cairo, Egypt"));
|
|||
|
dao.employeeById.put(new Employee(4,
|
|||
|
"Confucius",
|
|||
|
7500.0f,
|
|||
|
1,
|
|||
|
4,
|
|||
|
"Beijing, China"));
|
|||
|
dao.employeeById.put(new Employee(5,
|
|||
|
"Toussaint Louverture",
|
|||
|
6800.0f,
|
|||
|
1,
|
|||
|
5,
|
|||
|
"Port-au-Prince, Haiti"));
|
|||
|
|
|||
|
/* Add 2 employees per department. */
|
|||
|
dao.employeeById.put(new Employee(6,
|
|||
|
"William Shakespeare",
|
|||
|
7300.0f,
|
|||
|
2,
|
|||
|
2,
|
|||
|
"London, England"));
|
|||
|
dao.employeeById.put(new Employee(7,
|
|||
|
"Victor Hugo",
|
|||
|
7000.0f,
|
|||
|
2,
|
|||
|
2,
|
|||
|
"Paris, France"));
|
|||
|
dao.employeeById.put(new Employee(8,
|
|||
|
"Yitzhak Rabin",
|
|||
|
6500.0f,
|
|||
|
3,
|
|||
|
3,
|
|||
|
"Jerusalem, Israel"));
|
|||
|
dao.employeeById.put(new Employee(9,
|
|||
|
"Nelson Rolihlahla Mandela",
|
|||
|
6400.0f,
|
|||
|
3,
|
|||
|
3,
|
|||
|
"Cape Town, South Africa"));
|
|||
|
dao.employeeById.put(new Employee(10,
|
|||
|
"Meiji Emperor",
|
|||
|
6600.0f,
|
|||
|
4,
|
|||
|
4,
|
|||
|
"Tokyo, Japan"));
|
|||
|
dao.employeeById.put(new Employee(11,
|
|||
|
"Mohandas Karamchand Gandhi",
|
|||
|
7600.0f,
|
|||
|
4,
|
|||
|
4,
|
|||
|
"New Delhi, India"));
|
|||
|
dao.employeeById.put(new Employee(12,
|
|||
|
"Ayrton Senna da Silva",
|
|||
|
5600.0f,
|
|||
|
5,
|
|||
|
5,
|
|||
|
"Brasilia, Brasil"));
|
|||
|
dao.employeeById.put(new Employee(13,
|
|||
|
"Ronahlinho De Assis Moreira",
|
|||
|
6100.0f,
|
|||
|
5,
|
|||
|
5,
|
|||
|
"Brasilia, Brasil"));
|
|||
|
}
|
|||
|
|
|||
|
/** Run the SQL examples. */
|
|||
|
public void runApp()
|
|||
|
throws DatabaseException {
|
|||
|
|
|||
|
/* Print departmemt database contents order by departmentId. */
|
|||
|
System.out.println("SELECT * FROM department ORDER BY departmentId;");
|
|||
|
printQueryResults(dao.departmentById.entities());
|
|||
|
|
|||
|
/* Print departmemt database contents order by departmentName. */
|
|||
|
System.out.println("SELECT * FROM department " +
|
|||
|
"ORDER BY departmentName;");
|
|||
|
printQueryResults(dao.departmentByName.entities());
|
|||
|
|
|||
|
/* Print employee database contents order by employeeId. */
|
|||
|
System.out.println("SELECT * FROM employee ORDER BY employeeId;");
|
|||
|
printQueryResults(dao.employeeById.entities());
|
|||
|
|
|||
|
/* Do a prefix query. */
|
|||
|
System.out.println("SELECT * FROM employee WHERE employeeName " +
|
|||
|
"LIKE 'M%';");
|
|||
|
printQueryResults(dao.doPrefixQuery(dao.employeeByName, "M"));
|
|||
|
|
|||
|
/* Do a range query. */
|
|||
|
System.out.println("SELECT * FROM employee WHERE salary >= 6000 AND " +
|
|||
|
"salary <= 8000;");
|
|||
|
printQueryResults(dao.doRangeQuery(dao.employeeBySalary,
|
|||
|
new Float(6000), //fromKey
|
|||
|
true, //fromInclusive
|
|||
|
new Float(8000), //toKey
|
|||
|
true)); //toInclusive
|
|||
|
|
|||
|
/* Two conditions join on a single primary database. */
|
|||
|
System.out.println("SELECT * FROM employee " +
|
|||
|
"WHERE employeeName = 'Victor Hugo' " +
|
|||
|
"AND departmentId = 2;");
|
|||
|
printQueryResults(dao.doTwoConditionsJoin(dao.employeeById,
|
|||
|
dao.employeeByName,
|
|||
|
new String("Victor Hugo"),
|
|||
|
dao.employeeByDepartmentId,
|
|||
|
new Integer(2)));
|
|||
|
|
|||
|
/*
|
|||
|
* Two conditions join on two primary databases combined with a
|
|||
|
* secondary key search.
|
|||
|
*/
|
|||
|
System.out.println("SELECT * FROM employee e, department d " +
|
|||
|
"WHERE e.departmentId = d.departmentId " +
|
|||
|
"AND d.departmentName = 'Engineering';");
|
|||
|
dao.getEmployeeByDeptName("Engineering");
|
|||
|
|
|||
|
/*
|
|||
|
* Two conditions join on two primary databases combined with a
|
|||
|
* filtering on the non-secondary-key.
|
|||
|
*/
|
|||
|
System.out.println("SELECT * FROM employee e, department d " +
|
|||
|
"WHERE e.departmentId = d.departmentId " +
|
|||
|
"AND d.location = 'North America';");
|
|||
|
dao.getEmployeeByDeptLocation("North America");
|
|||
|
}
|
|||
|
|
|||
|
/** Print query results. */
|
|||
|
public <V> void printQueryResults(ForwardCursor<V> cursor)
|
|||
|
throws DatabaseException {
|
|||
|
|
|||
|
try {
|
|||
|
for (Object entity : cursor) {
|
|||
|
System.out.println(entity);
|
|||
|
}
|
|||
|
System.out.println();
|
|||
|
} finally {
|
|||
|
cursor.close();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Close the store and environment.
|
|||
|
*/
|
|||
|
public void close() {
|
|||
|
|
|||
|
if (store != null) {
|
|||
|
try {
|
|||
|
store.close();
|
|||
|
} catch (DatabaseException dbe) {
|
|||
|
System.err.println("Error closing store: " +
|
|||
|
dbe.toString());
|
|||
|
System.exit(-1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (env != null) {
|
|||
|
try {
|
|||
|
// Finally, close environment.
|
|||
|
env.close();
|
|||
|
} catch (DatabaseException dbe) {
|
|||
|
System.err.println("Error closing env: " +
|
|||
|
dbe.toString());
|
|||
|
System.exit(-1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (cleanEnvOnExit) {
|
|||
|
removeDbFiles();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void removeDbFiles() {
|
|||
|
File file = new File(envDir);
|
|||
|
for (File f : file.listFiles()) {
|
|||
|
f.delete();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @param args the command line arguments
|
|||
|
*/
|
|||
|
public static void main(String[] args) {
|
|||
|
|
|||
|
/* Parse the arguments list. */
|
|||
|
parseArgs(args);
|
|||
|
|
|||
|
try {
|
|||
|
SQLApp s = new SQLApp();
|
|||
|
s.setup();
|
|||
|
s.runApp();
|
|||
|
s.close();
|
|||
|
} catch (DatabaseException e) {
|
|||
|
e.printStackTrace();
|
|||
|
System.exit(-1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* Parse input arguments. */
|
|||
|
private static void parseArgs(String args[]) {
|
|||
|
for(int i = 0; i < args.length; ++i) {
|
|||
|
if (args[i].startsWith("-")) {
|
|||
|
switch(args[i].charAt(1)) {
|
|||
|
case 'h':
|
|||
|
envDir = args[++i];
|
|||
|
break;
|
|||
|
case 'd':
|
|||
|
cleanEnvOnExit = true;
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static void usage() {
|
|||
|
System.out.println("Usage: java SQLApp" +
|
|||
|
"\n [-h <env directory>] " +
|
|||
|
"# environment home directory" +
|
|||
|
"\n [-d] # clean environment after program exits");
|
|||
|
System.exit(-1);
|
|||
|
}
|
|||
|
}
|