This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d6ad87  EMPIREDB-362 further API improvments: DBTable addIdentity and 
addTimestamp
3d6ad87 is described below

commit 3d6ad87ee1f2c47699ff8ea80c311aff369c57e2
Author: Rainer Döbele <[email protected]>
AuthorDate: Fri Feb 18 14:20:58 2022 +0100

    EMPIREDB-362 further API improvments: DBTable addIdentity and addTimestamp
---
 .../empire/samples/db/advanced/SampleAdvApp.java   | 40 +++++++++-----
 .../empire/samples/db/advanced/db/CarSalesDB.java  | 63 +++++++++++-----------
 .../samples/db/advanced/db/DealerSalesView.java    | 17 +++---
 .../samples/db/advanced/records/BrandRecord.java   |  8 +--
 .../samples/db/advanced/records/DealerRecord.java  |  8 +--
 .../samples/db/advanced/records/ModelRecord.java   | 16 +++---
 .../org/apache/empire/samples/db/SampleApp.java    |  6 +--
 .../org/apache/empire/samples/db/SampleDB.java     | 43 +++++++--------
 .../java/org/apache/empire/db/DBCombinedCmd.java   |  2 +-
 .../main/java/org/apache/empire/db/DBCommand.java  |  4 +-
 .../java/org/apache/empire/db/DBCommandExpr.java   |  5 +-
 .../main/java/org/apache/empire/db/DBQuery.java    | 22 +++-----
 .../main/java/org/apache/empire/db/DBRecord.java   | 20 ++++---
 .../java/org/apache/empire/db/DBRecordBean.java    | 18 ++++---
 .../main/java/org/apache/empire/db/DBRowSet.java   | 35 +++++++-----
 .../main/java/org/apache/empire/db/DBTable.java    | 63 +++++++++++++++++-----
 .../main/java/org/apache/empire/db/DBUtils.java    |  2 +-
 .../empire/db/expr/compare/DBCompareColExpr.java   |  6 +--
 .../empire/db/expr/join/DBCompareJoinExpr.java     |  2 +-
 .../apache/empire/db/expr/order/DBOrderByExpr.java |  7 +--
 .../java/org/apache/empire/db/generic/TRecord.java | 16 +++---
 .../apache/empire/dbms/oracle/DBCommandOracle.java |  2 +-
 22 files changed, 230 insertions(+), 175 deletions(-)

diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index 176220c..74d4279 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -44,6 +44,7 @@ import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.exceptions.ConstraintViolationException;
 import org.apache.empire.db.exceptions.StatementFailedException;
+import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.samples.db.advanced.db.CarSalesDB;
 import org.apache.empire.samples.db.advanced.db.CarSalesDB.DealershipType;
@@ -454,30 +455,41 @@ public class SampleAdvApp
     
     private void queryViewDemo()
     {
+        // query all
         /*
-        DBRecord rec = new DBRecord(context, carSales.DEALER_BRANDS);
-        rec.read(DBRecord.key(1, "5YJ"));
-        DealershipType dst1 = 
rec.getEnum(carSales.DEALER_BRANDS.DEALERSHIP_TYPE);
-        String dsn1 = rec.getString(carSales.DEALER_BRANDS.DEALERSHIP_TYPE);
-        log.info("DealershipType {}", dsn1);
-        */
-        
-        // shortcuts (for convenience)
-        DealerSalesView DSV = carSales.DEALER_SALES_VIEW;
-        // create command
         DBCommand cmd = context.createCommand()
            .select  (DSV.getColumns())
            .orderBy (DSV.SALE_YEAR, DSV.DEALER_COUNTRY);
+        List<DataListEntry> list = context.getUtils().queryDataList(cmd);
+        for (DataListEntry dle : list)
+        {
+            System.out.println(dle.toString());
+        }
+        */
         
+        // shortcuts (for convenience)
+        DealerSalesView DSV = carSales.DEALER_SALES_VIEW;
+
+        DBCommand cmd = context.createCommand();
+        // Detect if Brand sold is the Dealer's Brand
+        DBCompareExpr IS_DEALER_BRAND = 
DSV.DEALERSHIP_TYPE.in(DealershipType.B, DealershipType.F);
+        // select
+        cmd.select(DSV.SALE_YEAR, DSV.DEALER_NAME, DSV.DEALER_COUNTRY);
+        cmd.select(DSV.SALE_COUNT.sum().as("TOTAL_SALES"));
+        cmd.select(carSales.caseWhen(IS_DEALER_BRAND, DSV.TURNOVER, 
0).sum().as("TURNOVER_BRAND"));
+        cmd.select(DSV.TURNOVER.sum().as("TURNOVER_TOTAL"));
+        // group
+        cmd.groupBy(DSV.SALE_YEAR, DSV.DEALER_NAME, DSV.DEALER_COUNTRY);
+        // order
+        cmd.orderBy(DSV.SALE_YEAR, DSV.DEALER_NAME);
+
+        // query and print result
         List<DataListEntry> list = context.getUtils().queryDataList(cmd);
         for (DataListEntry dle : list)
         {
-            DealershipType dst = dle.getEnum(DSV.DEALERSHIP_TYPE);
-            Options opt = DSV.DEALERSHIP_TYPE.getOptions();
-            String dsn = dle.getString(DSV.DEALERSHIP_TYPE);
-            log.info("DealershipType {}-->{}", dsn, 
dle.format(DSV.DEALERSHIP_TYPE));
             System.out.println(dle.toString());
         }
+
     }
     
     /**
diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
index 4e76b9d..34f75e4 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
@@ -106,17 +106,17 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
         public final DBTableColumn NAME;
         public final DBTableColumn COUNTRY;
         public final DBTableColumn UPDATE_TIMESTAMP;
-
+        
         public Brand(CarSalesDB db)
         {
-            super("BRANDS", db);
+            super("BRAND", db);
             // ID
             WMI             = addColumn("WMI",              DataType.VARCHAR,  
     3, true); // World Manufacturer Index (see Wikipedia)
             NAME            = addColumn("NAME",             DataType.VARCHAR,  
    80, true);
             COUNTRY         = addColumn("COUNTRY",          DataType.VARCHAR,  
    40, false);
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,     0, true);
+            UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
 
-            // Primary Key (automatically set due to AUTOINC column)
+            // Set Primary Key
             setPrimaryKey(WMI);
         }
     }
@@ -138,21 +138,21 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
 
         public Model(CarSalesDB db)
         {
-            super("MODELS", db);
+            super("MODEL", db);
             
             // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
    0, true, "MODEL_ID_SEQUENCE");  // Optional Sequence name for some DBMS 
(e.g. Oracle)
-            NAME            = addColumn("NAME",             DataType.VARCHAR,  
   20, true);
-            CONFIG_NAME     = addColumn("CONFIGURATION",    DataType.VARCHAR,  
   40, true);
-            WMI             = addForgeinKey(db.BRAND, "WMI", true);
-            TRIM            = addColumn("TRIM",             DataType.VARCHAR,  
   20, true);
-            ENGINE_TYPE     = addColumn("ENGINE_TYPE",      DataType.CHAR,     
    1, true, EngineType.class);
-            ENGINE_POWER    = addColumn("ENGINE_POWER",     DataType.DECIMAL,  
  4.0, true);
-            BASE_PRICE      = addColumn("BASE_PRICE",       DataType.DECIMAL,  
  8.2, false);
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,    0, true);
+            ID              = addIdentity  ("ID",               
"MODEL_ID_SEQUENCE");  // Optional Sequence name for some DBMS (e.g. Oracle)
+            NAME            = addColumn    ("NAME",             
DataType.VARCHAR,     20, true);
+            CONFIG_NAME     = addColumn    ("CONFIGURATION",    
DataType.VARCHAR,     40, true);
+            WMI             = addForeignKey("WMI",              db.BRAND,      
           true);
+            TRIM            = addColumn    ("TRIM",             
DataType.VARCHAR,     20, true);
+            ENGINE_TYPE     = addColumn    ("ENGINE_TYPE",      DataType.CHAR, 
        1, true, EngineType.class);
+            ENGINE_POWER    = addColumn    ("ENGINE_POWER",     
DataType.DECIMAL,    4.0, true);
+            BASE_PRICE      = addColumn    ("BASE_PRICE",       
DataType.DECIMAL,    8.2, false);
+            UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
             
-            // Primary Key (automatically set due to AUTOINC column, but we'll 
set it anyway)
-            setPrimaryKey(ID);
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
         }
     }
 
@@ -171,19 +171,19 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
 
         public Dealer(CarSalesDB db)
         {
-            super("DEALERS", db);
+            super("DEALER", db);
             
             // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
    0, true, "DEALER_ID_SEQUENCE");  // Optional Sequence name for some DBMS 
(e.g. Oracle)
-            COMPANY_NAME    = addColumn("COMPANY_NAME",     DataType.VARCHAR,  
   40, true);
-            STREET          = addColumn("ADDRESS",          DataType.VARCHAR,  
   40, false);
-            CITY            = addColumn("CITY",             DataType.VARCHAR,  
   20, true);
-            COUNTRY         = addColumn("COUNTRY",          DataType.VARCHAR,  
   40, true);
-            YEAR_FOUNDED    = addColumn("YEAR_FOUNDED",     DataType.DECIMAL,  
  4.0, false);
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,    0, true);
+            ID              = addIdentity ("ID",               
"DEALER_ID_SEQUENCE");  // Optional Sequence name for some DBMS (e.g. Oracle)
+            COMPANY_NAME    = addColumn   ("COMPANY_NAME",     
DataType.VARCHAR,     40, true);
+            STREET          = addColumn   ("ADDRESS",          
DataType.VARCHAR,     40, false);
+            CITY            = addColumn   ("CITY",             
DataType.VARCHAR,     20, true);
+            COUNTRY         = addColumn   ("COUNTRY",          
DataType.VARCHAR,     40, true);
+            YEAR_FOUNDED    = addColumn   ("YEAR_FOUNDED",     
DataType.DECIMAL,    4.0, false);
+            UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
             
-            // Primary Key (automatically set due to AUTOINC column, but we'll 
set it anyway)
-            setPrimaryKey(ID);
+            // Primary Key (automatically set due to addIdentity()) otherwise 
use 
+            // setPrimaryKey(...);
         }
     }
 
@@ -202,8 +202,8 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
             super("DEALER_BRANDS", db);
             
             // Key columns
-            DEALER_ID       = addForgeinKey(db.DEALER,  "DEALER_ID", true);
-            WMI             = addForgeinKey(db.BRAND,   "WMI", true);
+            DEALER_ID       = addForeignKey("DEALER_ID", db.DEALER,  true);
+            WMI             = addForeignKey("WMI",       db.BRAND,   true);
             // Data columns
             DEALERSHIP_TYPE = addColumn("DEALERSHIP_TYPE",   DataType.CHAR,    
  1, true, DealershipType.class);
             YEAR_BEGIN      = addColumn("YEAR_BEGIN",        DataType.DECIMAL, 
4.0, false);
@@ -229,8 +229,8 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
             super("SALES", db);
             
             // ID
-            MODEL_ID        = addForgeinKey(db.MODEL,  "MODEL_ID",  true);
-            DEALER_ID       = addForgeinKey(db.DEALER, "DEALER_ID", true);
+            MODEL_ID        = addForeignKey("MODEL_ID",  db.MODEL,  true);
+            DEALER_ID       = addForeignKey("DEALER_ID", db.DEALER, true);
             YEAR            = addColumn("YEAR",             DataType.DECIMAL,  
  4.0, true);
             MONTH           = addColumn("MONTH",            DataType.DECIMAL,  
  2.0, true);
             CAR_COLOR       = addColumn("CAR_COLOR",        DataType.VARCHAR,  
   20, false);
@@ -260,10 +260,11 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
      */
     public CarSalesDB()
     {
-        // Define other Foreign-Key Relations
+        // Define additional Foreign-Key Relations here
         // e.g. Multicolum etc.
         // addRelation( SALES.MODEL_ID.referenceOn( MODEL.ID )
         //            , SALES.MODEL_ID.referenceOn( target ));
+        log.info("CarSalesDB has been created with {} Tables, {} Views and {} 
Relations", getTables().size(), getViews().size(), getRelations().size());
     }
     
     /**
diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/DealerSalesView.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/DealerSalesView.java
index 83b4455..7efc869 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/DealerSalesView.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/DealerSalesView.java
@@ -11,20 +11,22 @@ public class DealerSalesView extends TView<CarSalesDB>
     public final DBViewColumn DEALER_NAME;
     public final DBViewColumn DEALER_COUNTRY;
     public final DBViewColumn BRAND_SOLD;
+    public final DBViewColumn DEALERSHIP_TYPE;
     public final DBViewColumn SALE_YEAR;
     public final DBViewColumn SALE_COUNT;
-    public final DBViewColumn DEALERSHIP_TYPE;
+    public final DBViewColumn TURNOVER;
 
     public DealerSalesView(CarSalesDB db)
     {
         super("DEALER_SALES_VIEW", db);
         // add columns
-        DEALER_NAME    = addColumn("DEALER_NAME",     db.DEALER.COMPANY_NAME);
-        DEALER_COUNTRY = addColumn("DEALER_COUNTRY",  db.DEALER.COUNTRY);
-        BRAND_SOLD     = addColumn("BRAND_SOLD",      db.BRAND.NAME);
-        DEALERSHIP_TYPE= addColumn("DEALERSHIP_TYPE", 
db.DEALER_BRANDS.DEALERSHIP_TYPE);
-        SALE_YEAR      = addColumn("SALE_YEAR",       db.SALES.YEAR);
-        SALE_COUNT     = addColumn("SALE_COUNT",      DataType.INTEGER);
+        DEALER_NAME     = addColumn("DEALER_NAME",     db.DEALER.COMPANY_NAME);
+        DEALER_COUNTRY  = addColumn("DEALER_COUNTRY",  db.DEALER.COUNTRY);
+        BRAND_SOLD      = addColumn("BRAND_SOLD",      db.BRAND.NAME);
+        DEALERSHIP_TYPE = addColumn("DEALERSHIP_TYPE", 
db.DEALER_BRANDS.DEALERSHIP_TYPE);
+        SALE_YEAR       = addColumn("SALE_YEAR",       db.SALES.YEAR);
+        SALE_COUNT      = addColumn("SALE_COUNT",      DataType.INTEGER);
+        TURNOVER        = addColumn("TURNOVER",        DataType.DECIMAL);
     }
 
     @Override
@@ -35,6 +37,7 @@ public class DealerSalesView extends TView<CarSalesDB>
         cmd.select(DB.DEALER.COMPANY_NAME, DB.DEALER.COUNTRY);
         cmd.select(DB.BRAND.NAME, DB.DEALER_BRANDS.DEALERSHIP_TYPE);
         cmd.select(DB.SALES.YEAR, DB.SALES.count());
+        cmd.select(DB.SALES.PRICE.sum().as(TURNOVER));
         // joins
         cmd.join (DB.DEALER.ID, DB.SALES.DEALER_ID);
         cmd.join (DB.SALES.MODEL_ID, DB.MODEL.ID);
diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
index 6267509..ba546a3 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
@@ -33,11 +33,11 @@ public class BrandRecord extends TRecord<CarSalesDB.Brand>
     
     public BrandRecord insert(String wmi, String name, String country)
     {
-        // RS = RowSet
+        // T = RowSet (Table/View)
         create();
-        set(RS.WMI,     wmi);
-        set(RS.NAME,    name);
-        set(RS.COUNTRY, country);
+        set(T.WMI,     wmi);
+        set(T.NAME,    name);
+        set(T.COUNTRY, country);
         update();
         return this;
     }
diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
index 7ca4385..b138204 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
@@ -15,11 +15,11 @@ public class DealerRecord extends TRecord<CarSalesDB.Dealer>
     
     public DealerRecord insert(String companyName, String city, String country)
     {
-        // RS = RowSet
+        // T = RowSet (Table/View)
         create();
-        set(RS.COMPANY_NAME, companyName);
-        set(RS.CITY,         city);
-        set(RS.COUNTRY,      country);
+        set(T.COMPANY_NAME, companyName);
+        set(T.CITY,         city);
+        set(T.COUNTRY,      country);
         update();
         return this;
     }
diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
index 78f8e1b..239fc00 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
@@ -16,15 +16,15 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
     
     public void insert(BrandRecord brand, String modelName, String configName, 
String trim, EngineType engineType, int enginePower, double basePrice)
     {
-        // RS = RowSet
+        // T = RowSet (Table/View)
         create();
-        set(RS.WMI             , brand);
-        set(RS.NAME            , modelName);
-        set(RS.CONFIG_NAME     , configName);
-        set(RS.TRIM            , trim);
-        set(RS.ENGINE_TYPE     , engineType);
-        set(RS.ENGINE_POWER    , enginePower);
-        set(RS.BASE_PRICE      , basePrice);
+        set(T.WMI             , brand);
+        set(T.NAME            , modelName);
+        set(T.CONFIG_NAME     , configName);
+        set(T.TRIM            , trim);
+        set(T.ENGINE_TYPE     , engineType);
+        set(T.ENGINE_POWER    , enginePower);
+        set(T.BASE_PRICE      , basePrice);
         update();
     }
 }
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index cfe6560..b15c046 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -290,7 +290,7 @@ public class SampleApp
                   .set(DEP.BUSINESS_UNIT, businessUnit)
                   .update();
                // Return Department ID
-        return rec.getId();
+        return rec.getIdentity();
        }
 
        /**
@@ -314,7 +314,7 @@ public class SampleApp
                if (salary>0)
                    insertPayments(rec);
                // Return Employee ID
-               return rec.getId();
+               return rec.getIdentity();
        }
 
     /**
@@ -340,7 +340,7 @@ public class SampleApp
             BigDecimal variation = new BigDecimal((Math.random()*200) - 100.0);
             variation = variation.setScale(2, RoundingMode.HALF_UP);
             // insert
-            rec.create(DBRecord.key(employee.getId(), month.getYear(), 
month.getMonth()));
+            rec.create(DBRecord.key(employee.getIdentity(), month.getYear(), 
month.getMonth()));
             rec.set(PAY.AMOUNT, monthlySalary.add(variation));
             rec.update();
         }
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
index 2d480d3..8e3b948 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
@@ -92,11 +92,11 @@ public class SampleDB extends DBDatabase
         {
             super("DEPARTMENTS", db);
             // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
     0, true, "DEP_ID_SEQUENCE"); // Optional Sequence for some DBMS (e.g. 
Oracle)
-            NAME            = addColumn("NAME",             DataType.VARCHAR,  
    80, true);
-            HEAD            = addColumn("HEAD",             DataType.VARCHAR,  
    80, false);
-            BUSINESS_UNIT   = addColumn("BUSINESS_UNIT",    DataType.VARCHAR,  
     4, true, "ITTK");
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,     0, true);
+            ID              = addIdentity ("ID",               
"DEP_ID_SEQUENCE"); // Optional Sequence for some DBMS (e.g. Oracle)
+            NAME            = addColumn   ("NAME",             
DataType.VARCHAR,      80, true);
+            HEAD            = addColumn   ("HEAD",             
DataType.VARCHAR,      80, false);
+            BUSINESS_UNIT   = addColumn   ("BUSINESS_UNIT",    
DataType.VARCHAR,       4, true, "ITTK");
+            UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
 
             // Primary Key (automatically set due to AUTOINC column)
             // setPrimaryKey(DEPARTMENT_ID);
@@ -131,18 +131,18 @@ public class SampleDB extends DBDatabase
             super("EMPLOYEES", db);
             
             // ID
-            ID              = addColumn("ID",               DataType.AUTOINC,  
    0, true, "EMPLOYEE_ID_SEQUENCE");  // Optional Sequence name for some DBMS 
(e.g. Oracle)
-            SALUTATION      = addColumn("SALUTATION",       DataType.VARCHAR,  
    5, false);
-            FIRST_NAME      = addColumn("FIRST_NAME",       DataType.VARCHAR,  
   40, true);
-            LAST_NAME       = addColumn("LAST_NAME",        DataType.VARCHAR,  
   40, true);
-            DATE_OF_BIRTH   = addColumn("DATE_OF_BIRTH",    DataType.DATE,     
    0, false);
-            DEPARTMENT_ID   = addColumn("DEPARTMENT_ID",    DataType.INTEGER,  
    0, true);
-            GENDER          = addColumn("GENDER",           DataType.VARCHAR,  
    1, true, Gender.class);
-            PHONE_NUMBER    = addColumn("PHONE_NUMBER",     DataType.VARCHAR,  
   40, false);
-            EMAIL           = addColumn("EMAIL",            DataType.VARCHAR,  
   80, false);
-            SALARY          = addColumn("SALARY",           DataType.DECIMAL,  
 10.2, false);
-            RETIRED         = addColumn("RETIRED",          DataType.BOOL,     
    0, true, false);
-            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", 
DataType.TIMESTAMP,    0, true);
+            ID              = addIdentity  ("ID",               
"EMPLOYEE_ID_SEQUENCE");  // Optional Sequence name for some DBMS (e.g. Oracle)
+            SALUTATION      = addColumn    ("SALUTATION",       
DataType.VARCHAR,      5, false);
+            FIRST_NAME      = addColumn    ("FIRST_NAME",       
DataType.VARCHAR,     40, true);
+            LAST_NAME       = addColumn    ("LAST_NAME",        
DataType.VARCHAR,     40, true);
+            DATE_OF_BIRTH   = addColumn    ("DATE_OF_BIRTH",    DataType.DATE, 
        0, false);
+            DEPARTMENT_ID   = addForeignKey("DEPARTMENT_ID",    
db.DEPARTMENTS,           true);
+            GENDER          = addColumn    ("GENDER",           
DataType.VARCHAR,      1, true, Gender.class);
+            PHONE_NUMBER    = addColumn    ("PHONE_NUMBER",     
DataType.VARCHAR,     40, false);
+            EMAIL           = addColumn    ("EMAIL",            
DataType.VARCHAR,     80, false);
+            SALARY          = addColumn    ("SALARY",           
DataType.DECIMAL,   10.2, false);
+            RETIRED         = addColumn    ("RETIRED",          DataType.BOOL, 
        0, true, false);
+            UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
             
             // Primary Key (automatically set due to AUTOINC column)
             // setPrimaryKey(EMPLOYEE_ID);
@@ -169,7 +169,7 @@ public class SampleDB extends DBDatabase
             super("PAYMENTS", db);
             
             // ID
-            EMPLOYEE_ID     = addColumn("EMPLOYEE_ID",      DataType.INTEGER,  
    0, true);
+            EMPLOYEE_ID     = addForeignKey("EMPLOYEE_ID",  db.EMPLOYEES,      
       true);
             YEAR            = addColumn("YEAR",             DataType.DECIMAL,  
  4.0, true);
             MONTH           = addColumn("MONTH",            DataType.DECIMAL,  
  2.0, true);
             AMOUNT          = addColumn("AMOUNT",           DataType.DECIMAL,  
  8.2, true);
@@ -195,9 +195,10 @@ public class SampleDB extends DBDatabase
      */
     public SampleDB()
     {
-        // Define Foreign-Key Relations
-        addRelation( EMPLOYEES.DEPARTMENT_ID.referenceOn( DEPARTMENTS.ID ));
-        addRelation( PAYMENTS.EMPLOYEE_ID   .referenceOn( EMPLOYEES.ID ));
+        // Define additional Foreign-Key Relations here
+        // which have not already been defined by addForeignKey()
+        // addRelation( {Source Column}.referenceOn( {Target Column} ));
+        log.info("SampleDB has been created with {} Tables and {} Relations", 
getTables().size(), getRelations().size());
     }
     
     @Override
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java 
b/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
index 10159b3..8825bc4 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
@@ -200,7 +200,7 @@ public class DBCombinedCmd extends DBCommandExpr
         // Add order by expression
         for (DBOrderByExpr obe : exprs)
         {
-            DBColumnExpr c = getCmdColumn(obe.getColumnExpr());
+            DBColumnExpr c = getCmdColumn(obe.getColumn());
             orderBy.add(new DBOrderByExpr(c, obe.isDescending()));
         }
         return this;
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 ba39c30..d1a4549 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
@@ -1281,7 +1281,7 @@ public abstract class DBCommand extends DBCommandExpr
             if (!(cmp instanceof DBCompareColExpr))
                continue;
             // Compare columns
-            DBColumnExpr c = ((DBCompareColExpr)cmp).getColumnExpr();
+            DBColumnExpr c = ((DBCompareColExpr)cmp).getColumn();
             DBColumn udc = c.getUpdateColumn();
             if (c.equals(col) || (udc!=null && 
udc.equals(col.getUpdateColumn())))
             {   // Check if we replace a DBCommandParam
@@ -1416,7 +1416,7 @@ public abstract class DBCommand extends DBCommandExpr
             compexpr = new ArrayList<DBCompareColExpr>(where.size());
             for (DBCompareExpr expr : where)
             {   if (expr instanceof DBCompareColExpr)
-                {   DBColumn column = 
((DBCompareColExpr)expr).getColumnExpr().getUpdateColumn();
+                {   DBColumn column = 
((DBCompareColExpr)expr).getColumn().getUpdateColumn();
                     if (column!=null && hasSetExprOn(column)==false)
                         compexpr.add((DBCompareColExpr)expr);
                 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
index 1246299..096533d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
@@ -25,6 +25,7 @@ import java.util.Set;
 
 import org.apache.empire.commons.Options;
 import org.apache.empire.data.DataType;
+import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.db.expr.order.DBOrderByExpr;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.exceptions.InvalidArgumentException;
@@ -127,7 +128,7 @@ public abstract class DBCommandExpr extends DBExpr
 
         /** throws ERR_NOTSUPPORTED */
         @Override
-        public void readRecord(DBRecordBase record, Object[] key)
+        public void readRecord(DBRecordBase record, DBCompareExpr 
whereConstraints)
         {
             throw new NotSupportedException(this, "getRecord");
         }
@@ -435,7 +436,7 @@ public abstract class DBCommandExpr extends DBExpr
         {   // find existing
             for (DBOrderByExpr ob : orderBy)
             {   // Compare expression
-                if (ob.getColumnExpr().equals(expr.getColumnExpr()))
+                if (ob.getColumn().equals(expr.getColumn()))
                 {   // already there, replace
                     ob.setDescending(expr.isDescending());
                     expr = null;
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java 
b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
index 0c845b1..e5a91a9 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
@@ -27,7 +27,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.ColumnExpr;
-import org.apache.empire.db.exceptions.InvalidKeyException;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.RecordUpdateAmbiguousException;
 import org.apache.empire.db.exceptions.RecordUpdateFailedException;
@@ -390,20 +389,13 @@ public class DBQuery extends DBRowSet
      * @param conn a valid connection to the database.
      */
     @Override
-    public void readRecord(DBRecordBase record, Object[] key)
+    public void readRecord(DBRecordBase record, DBCompareExpr whereConstraints)
     {
-        if (record == null)
-            throw new InvalidArgumentException("conn|rec", null);
-        DBColumn[] keyColumns = getKeyColumns();
-        if (key == null || keyColumns.length != key.length)
-            throw new InvalidKeyException(this, key);
+        if (record==null || whereConstraints==null)
+            throw new InvalidArgumentException("record|key", null);
         // Select
         DBCommand cmd = getCommandFromExpression();
-        for (int i = 0; i < keyColumns.length; i++)
-        {   // Set key column constraint
-            Object value = key[i];
-            cmd.where(keyColumns[i].is(value));
-        }    
+        cmd.where(whereConstraints);
         // Read Record
         readRecord(record, cmd);
     }
@@ -501,15 +493,15 @@ public class DBQuery extends DBRowSet
                 if (cmp instanceof DBCompareColExpr)
                 {      // Check whether constraint belongs to update table
                     DBCompareColExpr cmpExpr = (DBCompareColExpr) cmp;
-                    DBColumn col = cmpExpr.getColumnExpr().getUpdateColumn();
+                    DBColumn col = cmpExpr.getColumn().getUpdateColumn();
                     if (col!=null && col.getRowSet() == table)
                     {  // add the constraint
                        if (cmpExpr.getValue() instanceof DBCmdParam)
                        {       // Create a new command param
-                               DBColumnExpr colExpr = cmpExpr.getColumnExpr();
+                               DBColumnExpr colExpr = cmpExpr.getColumn();
                                DBCmdParam param 
=(DBCmdParam)cmpExpr.getValue(); 
                                DBCmdParam value = upd.addParam(colExpr, 
param.getValue());
-                               cmp = new DBCompareColExpr(colExpr, 
cmpExpr.getCmpop(), value);
+                               cmp = new DBCompareColExpr(colExpr, 
cmpExpr.getCmpOperator(), value);
                        }
                         upd.where(cmp);
                     }    
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
index e047b20..12edb5f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
@@ -224,13 +224,13 @@ public class DBRecord extends DBRecordBase
     }
     
     /**
-     * Returns the record id for tables which have a single numeric primary key
+     * Returns the record identity for tables which have a single numeric 
primary key like AUTOINC
      * This method is provided for convenience in addition to the the getKey() 
method
      * @return the record id or 0 if the key is null
      * @throws NoPrimaryKeyException if the table has no primary key
      * @throws NotSupportedException if the primary key is not a single column 
of if the column is not numeric
      */
-    public long getId()
+    public long getIdentity()
     {
         // Check Columns
         Column[] keyColumns = getKeyColumns();
@@ -238,7 +238,7 @@ public class DBRecord extends DBRecordBase
             throw new NoPrimaryKeyException(getRowSet());
         // Check Columns
         if (keyColumns.length!=1 || !keyColumns[0].getDataType().isNumeric())
-            throw new NotSupportedException(this, "getId");
+            throw new NotSupportedException(this, "getIdentity");
         // the numeric id
         return getLong(keyColumns[0]);
     }
@@ -268,17 +268,19 @@ public class DBRecord extends DBRecordBase
      */
     public DBRecord read(Object[] key)
     {   // read
-        getRowSet().readRecord(this, key);
+        DBRowSet rs = getRowSet(); 
+        DBCompareExpr keyConstraints = rs.getKeyConstraints(key);
+        rs.readRecord(this, keyConstraints);
         return this;
     }
 
     /**
      * Reads a record from the database
-     * @param id the record id value
+     * @param identity the record id value
      */
-    public final DBRecord read(long id)
+    public final DBRecord read(long identity)
     {
-        return read(new Object[] {id});
+        return read(new Object[] { identity });
     }
     
     /**
@@ -303,7 +305,9 @@ public class DBRecord extends DBRecordBase
      */
     public DBRecord read(Object[] key, PartialMode mode, DBColumn... columns)
     {
-        getRowSet().readRecord(this, key, mode, columns);
+        DBRowSet rs = getRowSet(); 
+        DBCompareExpr keyConstraints = rs.getKeyConstraints(key);
+        rs.readRecord(this, keyConstraints, mode, columns);
         return this;
     }
 
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecordBean.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRecordBean.java
index 2d0b405..0aa366f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecordBean.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecordBean.java
@@ -130,13 +130,13 @@ public class DBRecordBean extends DBRecordBase
     }
     
     /**
-     * Returns the record id for tables which have a single numeric primary key
+     * Returns the record identity for tables which have a single numeric 
primary key like AUTOINC
      * This method is provided for convenience in addition to the the getKey() 
method
      * @return the record id or 0 if the key is null
      * @throws NoPrimaryKeyException if the table has no primary key
      * @throws NotSupportedException if the primary key is not a single column 
of if the column is not numeric
      */
-    public long getId()
+    public long getIdentity()
     {
         // Check Columns
         Column[] keyColumns = getKeyColumns();
@@ -144,7 +144,7 @@ public class DBRecordBean extends DBRecordBase
             throw new NoPrimaryKeyException(getRowSet());
         // Check Columns
         if (keyColumns.length!=1 || !keyColumns[0].getDataType().isNumeric())
-            throw new NotSupportedException(this, "getId");
+            throw new NotSupportedException(this, "getIdentity");
         // the numeric id
         return getLong(keyColumns[0]);
     }
@@ -194,7 +194,8 @@ public class DBRecordBean extends DBRecordBase
     {   // read
         try {
             this.tempContext = context;
-            rowset.readRecord(this, key);
+            DBCompareExpr keyConstraints = rowset.getKeyConstraints(key);
+            rowset.readRecord(this, keyConstraints);
             return this;
         } finally {
             this.tempContext = null;
@@ -203,11 +204,11 @@ public class DBRecordBean extends DBRecordBase
 
     /**
      * Reads a record from the database
-     * @param id the record id value
+     * @param identity the record id value
      */
-    public final DBRecordBean read(DBContext context, DBRowSet rowset, long id)
+    public final DBRecordBean read(DBContext context, DBRowSet rowset, long 
identity)
     {
-        return read(context, rowset, new Object[] {id});
+        return read(context, rowset, new Object[] { identity });
     }
     
     /**
@@ -239,7 +240,8 @@ public class DBRecordBean extends DBRecordBase
     {   // read
         try {
             this.tempContext = context;
-            rowset.readRecord(this, key, mode, columns);
+            DBCompareExpr keyConstraints = rowset.getKeyConstraints(key);
+            rowset.readRecord(this, keyConstraints, mode, columns);
             return this;
         } finally {
             this.tempContext = null;
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 2eb4a8c..33d9b86 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
@@ -34,10 +34,11 @@ import org.apache.empire.data.Column;
 import org.apache.empire.data.ColumnExpr;
 import org.apache.empire.data.DataType;
 import org.apache.empire.data.EntityType;
+import org.apache.empire.data.Record;
 import org.apache.empire.db.DBRelation.DBCascadeAction;
 import org.apache.empire.db.DBRelation.DBReference;
-import org.apache.empire.db.exceptions.FieldReadOnlyException;
 import org.apache.empire.db.exceptions.FieldNotNullException;
+import org.apache.empire.db.exceptions.FieldReadOnlyException;
 import org.apache.empire.db.exceptions.InvalidKeyException;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
@@ -58,6 +59,7 @@ import org.apache.empire.exceptions.ItemNotFoundException;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.apache.empire.exceptions.ObjectNotValidException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
+import org.apache.empire.exceptions.UnspecifiedErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -511,6 +513,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
     {
         this.comment = comment;
     }
+    
     /**
      * @return Returns the timestampColumn.
      */
@@ -527,11 +530,13 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
         if (timestampColumn!=null && timestampColumn.getRowSet()!=this)
             throw new InvalidArgumentException("timestampColumn", 
timestampColumn);
         if (timestampColumn!=null && this.timestampColumn!=null && 
this.timestampColumn!=timestampColumn)
-            log.warn("Timestamp column has already been set for rowset {}. 
Replacing with {}", getName(), timestampColumn.getName());
+            throw new UnspecifiedErrorException("A Timestamp column has 
already been set for rowset "+getName());
         if (timestampColumn instanceof DBTableColumn)
             ((DBTableColumn) timestampColumn).setReadOnly(true);
         // set now
         this.timestampColumn = timestampColumn;
+        // log
+        log.debug("Timestamp column {} has been set for table {}", 
timestampColumn.getName(), getName());
     }
     
     /**
@@ -747,23 +752,25 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
      * @param cmd the command to which to add the constraints
      * @param key the record key
      */
-    protected void setKeyConstraints(DBCommand cmd, Object[] key)
+    protected DBCompareExpr getKeyConstraints(Object[] key)
     {
         // Check Primary key
         DBColumn[] keyColumns =(DBColumn[])getKeyColumns();
-        if (keyColumns == null ) 
+        if (keyColumns==null || keyColumns.length==0) 
             throw new NoPrimaryKeyException(this); // Invalid Argument
         // Check Columns
         if (key == null || key.length != keyColumns.length)
             throw new InvalidKeyException(this, key); // Invalid Argument
         // Add the key constraints
-        for (int i = 0; i < key.length; i++)
+        DBCompareExpr compareExpr = keyColumns[0].is(key[0]);
+        for (int i = 1; i < key.length; i++)
         {   // prepare key value
             DBColumn column = keyColumns[i];
             Object value = key[i];
             // set key column constraint
-            cmd.where(column.is(value));
-        }    
+            compareExpr = compareExpr.and(column.is(value));
+        }
+        return compareExpr;
     }
     
     /**
@@ -774,7 +781,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
      * @param cmd the SQL-Command used to query the record
      * @param rowSetData optional rowset specific data to be held on the record
      */
-    protected <R extends DBRecordBase> void readRecord(R record, DBCommand cmd)
+    protected void readRecord(DBRecordBase record, DBCommand cmd)
     {
         // check param
         checkParamRecord(record, false);
@@ -816,7 +823,6 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
      * <P>
      * @param record the DBRecord object which will hold the record data
      * @param key the primary key values
-     */
     public <R extends DBRecordBase> void readRecord(R record, Object[] key)
     {
         // Check Arguments
@@ -829,6 +835,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
         // Read Record
         readRecord(record, cmd);
     }
+     */
    
     /**
      * Reads a record from the database
@@ -858,10 +865,10 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
      * @param mode flag whether to include only the given columns or whether 
to add all but the given columns
      * @param columns the columns to include or exclude (depending on mode)
      */
-    public void readRecord(DBRecordBase record, Object[] key, PartialMode 
mode, DBColumn... columns)
+    public void readRecord(DBRecordBase record, DBCompareExpr 
whereConstraints, PartialMode mode, DBColumn... columns)
     {
         // Check Arguments
-        checkParamNull("key", key);
+        checkParamNull("whereConstraints", whereConstraints);
         // create command
         DBCommand cmd = createRecordCommand(record.getContext());
         for (DBColumn column : this.columns)
@@ -886,7 +893,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
             }
         }
         // Set key constraints
-        setKeyConstraints(cmd, key);
+        cmd.where(whereConstraints);
         // Read Record
         readRecord(record, cmd);
     }
@@ -907,7 +914,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
         DBCommand cmd = createRecordCommand(context);
         cmd.select(count());
         // Set key constraints
-        setKeyConstraints(cmd, key);
+        cmd.where(getKeyConstraints(key));
         // check exits
         return (context.getUtils().querySingleInt(cmd, 0)==1);
     }
@@ -921,7 +928,7 @@ public abstract class DBRowSet extends DBExpr implements 
EntityType
      */
     public final boolean recordExists(Object id, DBContext context)
     {
-        return recordExists(new Object[] { id }, context); 
+        return recordExists(Record.key(id), context); 
     }
     
     /**
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 593a1f9..08242d6 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
@@ -37,7 +37,9 @@ import 
org.apache.empire.db.exceptions.RecordDeleteFailedException;
 import org.apache.empire.db.exceptions.RecordUpdateFailedException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.ItemExistsException;
+import org.apache.empire.exceptions.ObjectNotValidException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
+import org.apache.empire.exceptions.UnspecifiedErrorException;
 
 
 /**
@@ -272,19 +274,22 @@ public class DBTable extends DBRowSet implements Cloneable
      * @return the new column object
      */
     protected DBTableColumn crateAndAppendColumn(String columnName, DataType 
type, double size, boolean required, Object defValue)
-    { 
+    {
+        // Check exists
+        if (getColumn(columnName)!=null)
+            throw new ItemExistsException(columnName);
         // Make sure (DataType.INTEGER & DataMode.AutoGenerated) = 
DataType.AUTOINC
         boolean autoGenerated = (type==DataType.AUTOINC || 
type==DataType.UNIQUEID);
         DBTableColumn column = new DBTableColumn(this, type, columnName, size, 
required, autoGenerated, defValue);
-        addColumn(column);
         // auto-set primary key
         if (column.getDataType()==DataType.AUTOINC)
         {   // Automatically set primary key
             if (this.primaryKey==null)
                 this.setPrimaryKey(column);
             else
-                log.warn("Table {} already has a Primary-Key! DataType of 
column {} should be INTEGER.", getName(), column.getName());
+                throw new UnspecifiedErrorException("Table "+getName()+" 
already has a Primary-Key! No column of type AUTOINC can be added.");
         }
+        /*
         // auto-set timestamp column
         if (column.getDataType()==DataType.TIMESTAMP)
         {   // Automatically set timestamp column
@@ -293,6 +298,8 @@ public class DBTable extends DBRowSet implements Cloneable
             else
                 log.warn("Table {} already has a Timestamp column. DataType of 
column {} should be DATETIME.", getName(), column.getName());
         }
+        */
+        addColumn(column);
         return column;
     }
     
@@ -413,16 +420,32 @@ public class DBTable extends DBRowSet implements Cloneable
     }
     
     /**
+     * Adds an Identity column to the table which also serves as the PrimaryKey
+     * An Identity Column is always an auto-generated Integer(Long) value
+     * @param name the name of the identity column
+     * @param seqName (optional) name of the sequence if supported by DBMS
+     * @return the Identity column
+     */
+    public DBTableColumn addIdentity(String name, String seqName)
+    {
+        return addColumn("ID", DataType.AUTOINC, 0, true, seqName);
+    }
+    
+    /**
      * Adds a new ForgeinKey table column the column list
      * The foreign table must have a single column foreign key
-     * @param target the table on which to reference
      * @param name the name of the new column
+     * @param target the table on which to reference
      * @param required true if the value is required
      * @param options (optional) a set of allowed values for this column
      * @return the new column
      */
-    public DBTableColumn addForgeinKey(DBTable target, String name, boolean 
required, Options options)
+    public DBTableColumn addForeignKey(String name, DBTable target, boolean 
required, Options options)
     {
+        // Check target: If null then Table has not been defined yet!
+        if (target==null)
+            throw new ObjectNotValidException(target);
+        // Check key
         DBColumn[] keyCols = target.getKeyColumns();
         if (keyCols==null || keyCols.length!=1)
             throw new InvalidArgumentException("target", target);
@@ -441,17 +464,28 @@ public class DBTable extends DBRowSet implements Cloneable
     /**
      * Adds a new ForgeinKey table column the column list
      * The foreign table must have a single column foreign key
-     * @param target the table on which to reference
      * @param name the name of the new column
+     * @param target the table on which to reference
      * @param required true if the value is required
-     * @param options (optional) a set of allowed values for this column
      * @return the new column
      */
-    public final DBTableColumn addForgeinKey(DBTable target, String name, 
boolean required)
+    public final DBTableColumn addForeignKey(String name, DBTable target, 
boolean required)
     {
-        return addForgeinKey(target, name, required, null);
+        return addForeignKey(name, target, required, null);
+    }
+    
+    /**
+     * Adds a Timestamp column to the current table
+     * There can only be one timestamp column per table
+     * @param name the name of the new column
+     * @return the new column
+     */
+    public DBTableColumn addTimestamp(String name)
+    {
+        DBTableColumn tsColumn = addColumn(name, DataType.TIMESTAMP, 0, true);
+        this.setTimestampColumn(tsColumn);
+        return tsColumn;
     }
-
 
     /**
      * Returns the primary key.
@@ -480,8 +514,7 @@ public class DBTable extends DBRowSet implements Cloneable
      */
     public void setPrimaryKey(DBColumn... columns)
     {
-        if (columns==null)
-            throw new InvalidArgumentException("columns", columns);
+        checkParamNull("columns", columns);
         // All columns must belong to this table
         for (int i=0; i<columns.length; i++)
             if (columns[i].getRowSet()!=this)
@@ -491,6 +524,8 @@ public class DBTable extends DBRowSet implements Cloneable
         {   // compare columns
             if (primaryKey.compareColumns(columns))
                 return; // already set
+            // warn
+            log.warn("A PrimaryKey for the Table {} has already been set. 
Replacing with new one.", getName());
             // new key
             removeIndex(primaryKey);
         }
@@ -499,6 +534,8 @@ public class DBTable extends DBRowSet implements Cloneable
         {   // create primary key
             primaryKey = new DBIndex(name + "_PK", DBIndexType.PRIMARY_KEY, 
columns);
             addIndex(primaryKey);
+            // log
+            log.debug("PrimaryKey {} of length {} has been set for table {}", 
primaryKey.getName(), columns.length, getName());
         }
         else
         {   // No primary Key
@@ -713,7 +750,7 @@ public class DBTable extends DBRowSet implements Cloneable
         // Build SQL-Statement
         DBCommand cmd = createRecordCommand(context);
         // Set key constraints
-        setKeyConstraints(cmd, key);
+        cmd.where(getKeyConstraints(key));
         // Perform delete
         String sqlCmd = cmd.getDelete(this);
         int affected  = context.executeSQL(sqlCmd, cmd.getParamValues());
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java 
b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
index 2270aaa..849b101 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
@@ -1203,7 +1203,7 @@ public class DBUtils implements DBContextAware
         DBObject.checkParamNull("key", key);
         // set key constraints 
         DBCommand cmd = context.createCommand();
-        rowset.setKeyConstraints(cmd, key);
+        cmd.where(rowset.getKeyConstraints(key));
         // use factory of rowset
         return queryBean(cmd, getRowsetBeanListFactory(beanType, rowset));
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
index fdb5f10..e4c24df 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
@@ -82,7 +82,7 @@ public class DBCompareColExpr extends DBCompareExpr
      * Gets the DBColumnExpr object 
      * @return the DBColumnExpr object 
      */
-    public DBColumnExpr getColumnExpr()
+    public DBColumnExpr getColumn()
     {
         return expr;
     }
@@ -91,7 +91,7 @@ public class DBCompareColExpr extends DBCompareExpr
      * Gets the comparison operator
      * @return the comparison operator
      */
-    public DBCmpType getCmpop()
+    public DBCmpType getCmpOperator()
     {
         return cmpop;
     }
@@ -298,7 +298,7 @@ public class DBCompareColExpr extends DBCompareExpr
        if (other instanceof DBCompareColExpr)
        {
                DBCompareColExpr o = (DBCompareColExpr)other;
-               DBColumnExpr oexpr = o.getColumnExpr();
+               DBColumnExpr oexpr = o.getColumn();
                if (expr.equals(oexpr))
                        return true;
                // unwrap
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
index a67dec2..fff3904 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
@@ -54,7 +54,7 @@ public class DBCompareJoinExpr extends DBColumnJoinExpr
             return findFirstColumn(((DBCompareAndOrExpr)expr).getLeft());
         // Get Colum Expr
         if (expr instanceof DBCompareColExpr)
-            return ((DBCompareColExpr)expr).getColumnExpr();
+            return ((DBCompareColExpr)expr).getColumn();
         // Error
         log.error("Unknown class found for building a valid JOIN Expression");
         return null;
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/order/DBOrderByExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/order/DBOrderByExpr.java
index b8e3a2e..cdff70c 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/order/DBOrderByExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/order/DBOrderByExpr.java
@@ -45,15 +45,10 @@ public class DBOrderByExpr extends DBExpr
         this.desc = desc;
     }
     
-    public DBColumnExpr getColumnExpr()
+    public DBColumnExpr getColumn()
     {
         return expr;
     }
-    
-    public DBColumn getColumn()
-    {
-        return expr.getSourceColumn();
-    }
 
     public boolean isDescending()
     {
diff --git a/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java 
b/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
index d4bd0b7..6a80227 100644
--- a/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
+++ b/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
@@ -22,21 +22,21 @@ import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBRowSet;
 
-public class TRecord<RS extends DBRowSet> extends DBRecord
+public class TRecord<T extends DBRowSet> extends DBRecord
 {
     private static final long serialVersionUID = 1L;
     
-    public final RS RS;
+    public final T T;   // provide access to RowSet via T
 
     /**
      * Internal constructor for DBRecord
      * May be used by derived classes to provide special behaviour
      */
-    protected TRecord(DBContext context, RS rowset, boolean 
enableRollbackHandling)
+    protected TRecord(DBContext context, T rowset, boolean 
enableRollbackHandling)
     {   
         super(context, rowset, enableRollbackHandling);
         // set the rowset for quick access
-        this.RS = rowset;
+        this.T = rowset;
     }
 
     /**
@@ -44,20 +44,20 @@ public class TRecord<RS extends DBRowSet> extends DBRecord
      * @param context the DBContext for this record
      * @param rowset the corresponding RowSet(Table, View, Query, etc.)
      */
-    public TRecord(DBContext context, RS rowset)
+    public TRecord(DBContext context, T rowset)
     {
         super(context, rowset);
         // set the rowset for quick access
-        this.RS = rowset;
+        this.T = rowset;
     }
     
     /**
      * finally we know the rowset
      */
     @Override
-    public RS getRowSet()
+    public T getRowSet()
     {
-        return this.RS;
+        return this.T;
     }
 
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
index 241187c..a8c1406 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
@@ -374,7 +374,7 @@ public class DBCommandOracle extends DBCommand
         for (DBCompareExpr we : this.where) 
         {
             DBCompareColExpr cce = (DBCompareColExpr)we;
-            DBColumn ccecol = cce.getColumnExpr().getUpdateColumn();
+            DBColumn ccecol = cce.getColumn().getUpdateColumn();
             if (table.isKeyColumn(ccecol)&& !isSetColumn(ccecol))  
             {
                 buf.append(" AND ");

Reply via email to