You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2017/06/30 07:26:59 UTC
empire-db git commit: EMPIREDB-257 return unmodifiable lists. check
database match on DBCommend object helper function to create "case when"
expressions.
Repository: empire-db
Updated Branches:
refs/heads/master 7b7dce0c3 -> 6283adbbb
EMPIREDB-257
return unmodifiable lists.
check database match on DBCommend object
helper function to create "case when" expressions.
Project: http://git-wip-us.apache.org/repos/asf/empire-db/repo
Commit: http://git-wip-us.apache.org/repos/asf/empire-db/commit/6283adbb
Tree: http://git-wip-us.apache.org/repos/asf/empire-db/tree/6283adbb
Diff: http://git-wip-us.apache.org/repos/asf/empire-db/diff/6283adbb
Branch: refs/heads/master
Commit: 6283adbbb9599434dba958b852f4beed5a60e978
Parents: 7b7dce0
Author: Rainer Döbele <do...@apache.org>
Authored: Fri Jun 30 09:26:55 2017 +0200
Committer: Rainer Döbele <do...@apache.org>
Committed: Fri Jun 30 09:26:55 2017 +0200
----------------------------------------------------------------------
.../org/apache/empire/data/bean/BeanClass.java | 3 +-
.../org/apache/empire/data/bean/BeanDomain.java | 3 +-
.../java/org/apache/empire/db/DBColumnExpr.java | 30 +-------
.../java/org/apache/empire/db/DBCommand.java | 50 ++++++++-----
.../java/org/apache/empire/db/DBDatabase.java | 77 +++++++++++++++++++-
.../java/org/apache/empire/db/DBRowSet.java | 5 +-
.../main/java/org/apache/empire/db/DBTable.java | 5 +-
.../exceptions/DatabaseMismatchException.java | 38 ++++++++++
.../db/sqlite/DBDatabaseDriverSQLite.java | 9 +--
9 files changed, 158 insertions(+), 62 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/data/bean/BeanClass.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/data/bean/BeanClass.java b/empire-db/src/main/java/org/apache/empire/data/bean/BeanClass.java
index 4fae288..e9d8ab7 100644
--- a/empire-db/src/main/java/org/apache/empire/data/bean/BeanClass.java
+++ b/empire-db/src/main/java/org/apache/empire/data/bean/BeanClass.java
@@ -19,6 +19,7 @@
package org.apache.empire.data.bean;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import org.apache.empire.data.Column;
@@ -120,7 +121,7 @@ public abstract class BeanClass
*/
public List<BeanProperty> getProperties()
{
- return properties;
+ return Collections.unmodifiableList(this.properties);
}
/**
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/data/bean/BeanDomain.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/data/bean/BeanDomain.java b/empire-db/src/main/java/org/apache/empire/data/bean/BeanDomain.java
index 9786bdc..a3964b1 100644
--- a/empire-db/src/main/java/org/apache/empire/data/bean/BeanDomain.java
+++ b/empire-db/src/main/java/org/apache/empire/data/bean/BeanDomain.java
@@ -19,6 +19,7 @@
package org.apache.empire.data.bean;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
/**
@@ -52,7 +53,7 @@ public abstract class BeanDomain
public List<BeanClass> getClasses()
{
- return classes;
+ return Collections.unmodifiableList(this.classes);
}
}
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java b/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
index c3a583f..99dc2cc 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
@@ -1010,32 +1010,6 @@ public abstract class DBColumnExpr extends DBExpr
{
return new DBCountExpr(this, true);
}
-
- /**
- * Detects the DataType of a given value.
- * @param value the value to detect
- * @return the DataType enum for the value
- */
- protected DataType detectDataType(Object value)
- {
- if (value instanceof DBColumnExpr)
- return ((DBColumnExpr)value).getDataType();
- if (value instanceof String)
- return DataType.TEXT;
- if ((value instanceof Integer) || (value instanceof Long))
- return DataType.INTEGER;
- if (value instanceof Number)
- return DataType.DECIMAL;
- if (value instanceof Boolean)
- return DataType.BOOL;
- if (value instanceof Date)
- return DataType.DATETIME;
- if (value instanceof Character)
- return DataType.CHAR;
- if (value instanceof byte[])
- return DataType.BLOB;
- return DataType.UNKNOWN;
- }
/**
* Creates and returns a sql-expression that compares the current column expression with
@@ -1051,13 +1025,13 @@ public abstract class DBColumnExpr extends DBExpr
DataType dataType = DataType.UNKNOWN;
if (otherwise!=null)
{
- dataType = detectDataType(otherwise);
+ dataType = getDatabase().detectDataType(otherwise);
}
if (dataType==DataType.UNKNOWN)
{
for (Object v : valueMap.values())
{
- dataType = detectDataType(v);
+ dataType = getDatabase().detectDataType(v);
if (dataType!=DataType.UNKNOWN)
break;
}
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
index 422bfe7..b935e5e 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
@@ -24,6 +24,7 @@ import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -32,6 +33,7 @@ import java.util.Vector;
import org.apache.empire.commons.StringUtils;
import org.apache.empire.data.DataType;
+import org.apache.empire.db.exceptions.DatabaseMismatchException;
import org.apache.empire.db.expr.compare.DBCompareColExpr;
import org.apache.empire.db.expr.compare.DBCompareExpr;
import org.apache.empire.db.expr.join.DBColumnJoinExpr;
@@ -284,7 +286,8 @@ public abstract class DBCommand extends DBCommandExpr
* @param expr the DBColumnExpr object
*/
public void select(DBColumnExpr expr)
- { // Select this column
+ { // Select this column
+ checkDatabase(expr);
if (select == null)
select = new ArrayList<DBColumnExpr>();
if (expr != null && select.contains(expr) == false)
@@ -309,7 +312,7 @@ public abstract class DBCommand extends DBCommandExpr
*
* @param columns the column expressions to add
*/
- public void select(Collection<? extends DBColumnExpr> columns)
+ public final void select(Collection<? extends DBColumnExpr> columns)
{
for (DBColumnExpr expr : columns)
{
@@ -348,6 +351,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public void set(DBSetExpr expr)
{
+ checkDatabase(expr);
if (set == null)
set = new ArrayList<DBSetExpr>();
for (int i = 0; i < set.size(); i++)
@@ -464,6 +468,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public void join(DBJoinExpr join)
{
+ checkDatabase(join);
if (joins == null)
joins = new ArrayList<DBJoinExpr>();
// Create a new join
@@ -482,7 +487,7 @@ public abstract class DBCommand extends DBCommandExpr
* @param right the right RowSet
* @return the join expression
*/
- public DBCrossJoinExpr join(DBRowSet left, DBRowSet right)
+ public final DBCrossJoinExpr join(DBRowSet left, DBRowSet right)
{
DBCrossJoinExpr join = new DBCrossJoinExpr(left, right);
join(join);
@@ -498,7 +503,7 @@ public abstract class DBCommand extends DBCommandExpr
*
* @return the join expression
*/
- public DBColumnJoinExpr join(DBColumnExpr left, DBColumnExpr right, DBJoinType joinType)
+ public final DBColumnJoinExpr join(DBColumnExpr left, DBColumnExpr right, DBJoinType joinType)
{
DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, joinType);
join(join);
@@ -513,7 +518,7 @@ public abstract class DBCommand extends DBCommandExpr
*
* @return the join expresion
*/
- public DBColumnJoinExpr join(DBColumnExpr left, DBColumn right)
+ public final DBColumnJoinExpr join(DBColumnExpr left, DBColumn right)
{
return join(left, right, DBJoinType.INNER);
}
@@ -527,7 +532,7 @@ public abstract class DBCommand extends DBCommandExpr
*
* @return the join expresion
*/
- public DBCompareJoinExpr join(DBRowSet rowset, DBCompareExpr cmp, DBJoinType joinType)
+ public final DBCompareJoinExpr join(DBRowSet rowset, DBCompareExpr cmp, DBJoinType joinType)
{
DBCompareJoinExpr join = new DBCompareJoinExpr(rowset, cmp, joinType);
join(join);
@@ -542,7 +547,7 @@ public abstract class DBCommand extends DBCommandExpr
*
* @return the join expresion
*/
- public DBCompareJoinExpr join(DBRowSet rowset, DBCompareExpr cmp)
+ public final DBCompareJoinExpr join(DBRowSet rowset, DBCompareExpr cmp)
{
return join(rowset, cmp, DBJoinType.INNER);
}
@@ -688,6 +693,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public void where(DBCompareExpr expr)
{
+ checkDatabase(expr);
if (where == null)
where = new ArrayList<DBCompareExpr>();
setConstraint(where, expr);
@@ -710,11 +716,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public List<DBCompareExpr> getWhereConstraints()
{
- if (where != null)
- { // Return a Copy of all Where Constraints
- return new ArrayList<DBCompareExpr>(where);
- }
- return null;
+ return (this.where!=null ? Collections.unmodifiableList(this.where) : null);
}
/**
@@ -735,11 +737,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public List<DBJoinExpr> getJoins()
{
- if (joins != null)
- {
- return new ArrayList<DBJoinExpr>(joins);
- }
- return null;
+ return (this.joins!=null ? Collections.unmodifiableList(this.joins) : null);
}
/**
@@ -761,6 +759,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public void having(DBCompareExpr expr)
{
+ checkDatabase(expr);
if (having == null)
having = new ArrayList<DBCompareExpr>();
setConstraint(having, expr);
@@ -786,7 +785,10 @@ public abstract class DBCommand extends DBCommandExpr
{
if (groupBy == null)
groupBy = new ArrayList<DBColumnExpr>();
- for(DBColumnExpr expr:exprs){
+ // Add all
+ for(DBColumnExpr expr : exprs)
+ {
+ checkDatabase(expr);
if (expr.isAggregate()==false && groupBy.contains(expr)==false)
groupBy.add(expr);
}
@@ -797,7 +799,7 @@ public abstract class DBCommand extends DBCommandExpr
*
* @param columns the column expressions to add
*/
- public void groupBy(Collection<? extends DBColumnExpr> columns)
+ public final void groupBy(Collection<? extends DBColumnExpr> columns)
{
for (DBColumnExpr expr : columns)
{
@@ -1263,5 +1265,13 @@ public abstract class DBCommand extends DBCommandExpr
addListExpr(buf, orderBy, CTX_DEFAULT, ", ");
}
}
-
+
+ protected void checkDatabase(DBExpr expr)
+ {
+ if (expr.getDatabase().equals(this.getDatabase()))
+ return;
+ // not the same database
+ throw new DatabaseMismatchException(this, expr);
+ }
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
index a75132c..c7ca54c 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
@@ -27,6 +27,8 @@ import java.sql.SQLIntegrityConstraintViolationException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -42,6 +44,7 @@ import org.apache.empire.db.exceptions.QueryFailedException;
import org.apache.empire.db.exceptions.QueryNoResultException;
import org.apache.empire.db.exceptions.StatementFailedException;
import org.apache.empire.db.expr.column.DBValueExpr;
+import org.apache.empire.db.expr.compare.DBCompareExpr;
import org.apache.empire.exceptions.InternalException;
import org.apache.empire.exceptions.InvalidArgumentException;
import org.apache.empire.exceptions.ItemExistsException;
@@ -538,7 +541,7 @@ public abstract class DBDatabase extends DBObject
*/
public List<DBTable> getTables()
{
- return tables;
+ return Collections.unmodifiableList(this.tables);
}
/**
@@ -643,7 +646,7 @@ public abstract class DBDatabase extends DBObject
*/
public List<DBRelation> getRelations()
{
- return relations;
+ return Collections.unmodifiableList(this.relations);
}
/**
@@ -685,7 +688,7 @@ public abstract class DBDatabase extends DBObject
*/
public List<DBView> getViews()
{
- return views;
+ return Collections.unmodifiableList(this.views);
}
/**
@@ -1381,6 +1384,18 @@ public abstract class DBDatabase extends DBObject
}
/**
+ * Executes an InsertInfo statement from a command object
+ * @param table the table into which to insert the selected data
+ * @param cmd the command object containing the selection command
+ * @param conn a valid connection to the database.
+ * @return the number of records that have been inserted with the supplied statement
+ */
+ public final int executeInsertInto(DBTable table, DBCommand cmd, Connection conn)
+ {
+ return executeSQL(cmd.getInsertInto(table), cmd.getParamValues(), conn);
+ }
+
+ /**
* Executes an Update statement from a command object
* @param cmd the command object containing the update command
* @param conn a valid connection to the database.
@@ -1539,5 +1554,61 @@ public abstract class DBDatabase extends DBObject
throw new EmpireSQLException(this, sqle);
}
}
+
+ /**
+ * Detects the DataType of a given value.
+ * @param value the value to detect
+ * @return the DataType enum for the value
+ */
+ public DataType detectDataType(Object value)
+ {
+ if (value instanceof DBColumnExpr)
+ return ((DBColumnExpr)value).getDataType();
+ if (value instanceof String)
+ return DataType.TEXT;
+ if ((value instanceof Integer) || (value instanceof Long))
+ return DataType.INTEGER;
+ if (value instanceof Number)
+ return DataType.DECIMAL;
+ if (value instanceof Boolean)
+ return DataType.BOOL;
+ if (value instanceof Date)
+ return DataType.DATETIME;
+ if (value instanceof Character)
+ return DataType.CHAR;
+ if (value instanceof byte[])
+ return DataType.BLOB;
+ return DataType.UNKNOWN;
+ }
+
+ /**
+ * Creates a case column expression
+ * "case when <condition> then <trueValue> else <falseValue> end"
+ * This is a helper function to simplify client usage
+ * @param condition
+ * @param trueValue the value to select if the condition is true
+ * @param falseValue the value to select if the condition is false
+ * @return an sql case expression
+ */
+ public DBColumnExpr caseWhen(DBCompareExpr condition, Object trueValue, Object falseValue)
+ {
+ DataType dataType = detectDataType((trueValue!=null ? trueValue : falseValue));
+ DBColumnExpr trueExpr = ((trueValue instanceof DBColumnExpr) ? (DBColumnExpr)trueValue : this.getValueExpr(trueValue, dataType));
+ return trueExpr.when(condition, falseValue);
+ }
+
+ /**
+ * Creates a case column expression that check whether a column or column expression is null
+ * "case when <condition> is null then <trueValue> else <falseValue> end"
+ * This is a helper function to simplify client usage
+ * @param expr a column or column expression
+ * @param trueValue the value to select if the condition is true
+ * @param falseValue the value to select if the condition is false
+ * @return an sql case expression
+ */
+ public DBColumnExpr caseWhenNull(DBColumnExpr expr, Object trueValue, Object falseValue)
+ {
+ return caseWhen(expr.is(null), trueValue, falseValue);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
index 502c2cc..f5112bf 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Timestamp;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -37,9 +38,9 @@ import org.apache.empire.data.DataType;
import org.apache.empire.db.DBRelation.DBCascadeAction;
import org.apache.empire.db.DBRelation.DBReference;
import org.apache.empire.db.exceptions.FieldNotNullException;
+import org.apache.empire.db.exceptions.InvalidKeyException;
import org.apache.empire.db.exceptions.NoPrimaryKeyException;
import org.apache.empire.db.exceptions.QueryNoResultException;
-import org.apache.empire.db.exceptions.InvalidKeyException;
import org.apache.empire.db.exceptions.RecordNotFoundException;
import org.apache.empire.db.exceptions.RecordUpdateFailedException;
import org.apache.empire.db.exceptions.RecordUpdateInvalidException;
@@ -260,7 +261,7 @@ public abstract class DBRowSet extends DBExpr
*/
public List<DBColumn> getColumns()
{
- return columns;
+ return Collections.unmodifiableList(columns);
}
/**
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/DBTable.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBTable.java b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
index 058c49c..b7244ec 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBTable.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
@@ -22,6 +22,7 @@ package org.apache.empire.db;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@@ -291,7 +292,7 @@ public class DBTable extends DBRowSet implements Cloneable
*/
public List<DBIndex> getIndexes()
{
- return indexes;
+ return Collections.unmodifiableList(this.indexes);
}
/**
@@ -538,7 +539,7 @@ public class DBTable extends DBRowSet implements Cloneable
if (this.equals(r.getForeignKeyTable()))
relations.add(r);
}
- return relations;
+ return Collections.unmodifiableList(relations);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/exceptions/DatabaseMismatchException.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/exceptions/DatabaseMismatchException.java b/empire-db/src/main/java/org/apache/empire/db/exceptions/DatabaseMismatchException.java
new file mode 100644
index 0000000..7313e2c
--- /dev/null
+++ b/empire-db/src/main/java/org/apache/empire/db/exceptions/DatabaseMismatchException.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.empire.db.exceptions;
+
+import org.apache.empire.commons.ErrorType;
+import org.apache.empire.db.DBExpr;
+import org.apache.empire.exceptions.EmpireException;
+
+public class DatabaseMismatchException extends EmpireException
+{
+ /**
+ * Comment for <code>serialVersionUID</code>
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static final ErrorType errorType = new ErrorType("error.db.databaseInvalid", "the databases don''t match for object of type ''{0}'' and object of type ''{1}''.");
+
+ public DatabaseMismatchException(DBExpr expr1, DBExpr expr2)
+ {
+ super(errorType, new String[] { expr1.getClass().getSimpleName(), expr2.getClass().getSimpleName() });
+ }
+}
http://git-wip-us.apache.org/repos/asf/empire-db/blob/6283adbb/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java b/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
index 3f0bacb..b8c41ea 100644
--- a/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
+++ b/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
@@ -32,7 +32,6 @@ import java.util.List;
import org.apache.empire.data.DataType;
import org.apache.empire.db.DBCmdType;
-import org.apache.empire.db.DBColumnExpr;
import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDDLGenerator;
import org.apache.empire.db.DBDatabase;
@@ -75,13 +74,13 @@ public class DBDatabaseDriverSQLite extends DBDatabaseDriver
}
@Override
- public DBColumnJoinExpr join(DBColumnExpr left, DBColumnExpr right, DBJoinType joinType)
+ public void join(DBJoinExpr join)
{
// http://www.sqlite.org/omitted.html
- if (joinType != DBJoinType.LEFT) {
- throw new NotImplementedException(joinType, left + " join " + right);
+ if (join.getType() != DBJoinType.LEFT) {
+ throw new NotImplementedException(join.getType(), join.getLeftTable().getName() + " join " + join.getRightTable().getName());
}
- return super.join(left, right, joinType);
+ super.join(join);
}
@Override