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 aece78e  EMPIREDB-362 final changes
aece78e is described below

commit aece78e63035716a37f52001d0236539486c5c79
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Mar 8 11:11:53 2022 +0100

    EMPIREDB-362 final changes
---
 .../apache/empire/db/codegen/CodeGenConfig.java    | 17 ++++++++-
 .../apache/empire/db/codegen/CodeGenWriter.java    |  2 +
 .../src/main/resources/templates/BaseRecord.vm     | 23 +++++++++---
 .../src/main/resources/templates/BaseTable.vm      |  2 +-
 .../src/main/resources/templates/BaseView.vm       |  2 +-
 .../src/main/resources/templates/Database.vm       |  3 +-
 .../src/main/resources/templates/Record.vm         |  8 ++--
 .../src/main/resources/templates/Table.vm          |  2 +-
 .../src/main/resources/templates/View.vm           |  2 +-
 .../empire/samples/db/advanced/SampleAdvApp.java   | 11 ++++++
 .../empire/samples/db/advanced/db/CarSalesDB.java  |  2 -
 .../samples/db/advanced/records/BrandRecord.java   | 19 +++++++++-
 .../samples/db/advanced/records/DealerRecord.java  | 43 +++++++++++++++++++++-
 .../samples/db/advanced/records/ModelRecord.java   | 38 ++++++++++++++++++-
 .../org/apache/empire/samples/db/SampleApp.java    |  3 +-
 .../empire/samples/springboot/SampleApp.java       |  5 ++-
 .../java/org/apache/empire/data/ColumnExpr.java    |  1 -
 .../main/java/org/apache/empire/db/DBDatabase.java | 34 +++++++++++------
 .../main/java/org/apache/empire/db/DBRowSet.java   | 14 +++++--
 .../java/org/apache/empire/db/generic/TRecord.java | 26 +++++++++----
 .../apache/empire/dbms/hsql/DBMSHandlerHSql.java   |  2 +
 21 files changed, 211 insertions(+), 48 deletions(-)

diff --git 
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
 
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
index 94e0198..a1c8fd7 100644
--- 
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
+++ 
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
@@ -138,6 +138,11 @@ public class CodeGenConfig extends XMLConfiguration {
         * <br/>
         */
        private String recordBaseName = "BaseRecord";
+    
+    /**
+     * Name of the Context class
+     */
+    private String contextClassName = "DBContext";
        
        /**
         * Prefix used for table member declarations
@@ -473,7 +478,17 @@ public class CodeGenConfig extends XMLConfiguration {
                this.recordBaseName = recordBaseName;
        }
        
-       public String getTableNamePrefix() {
+       public String getContextClassName()
+    {
+        return contextClassName;
+    }
+
+    public void setContextClassName(String contextClassName)
+    {
+        this.contextClassName = contextClassName;
+    }
+
+    public String getTableNamePrefix() {
                return tableNamePrefix;
        }
 
diff --git 
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
 
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
index 5e4de8d..8e8df1b 100644
--- 
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
+++ 
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
@@ -287,6 +287,7 @@ public class CodeGenWriter {
                context.put("basePackageName", config.getPackageName());
                context.put("tablePackageName", config.getTablePackageName());
                context.put("recordPackageName", config.getRecordPackageName());
+        context.put("contextClassName", config.getContextClassName());
                context.put("baseTableClassName", config.getTableBaseName());
                writeFile(file, BASE_RECORD_TEMPLATE, context);
                return file;
@@ -304,6 +305,7 @@ public class CodeGenWriter {
                        context.put("tablePackageName", 
config.getTablePackageName());
                context.put("recordPackageName", config.getRecordPackageName());
                context.put("baseRecordClassName", config.getRecordBaseName());
+        context.put("contextClassName", config.getContextClassName());
                context.put("dbClassName", config.getDbClassName());
                context
                                .put("createRecordProperties", config
diff --git a/empire-db-codegen/src/main/resources/templates/BaseRecord.vm 
b/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
index 913f559..2a1c2a8 100644
--- a/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
+++ b/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
@@ -26,21 +26,34 @@ import org.apache.empire.db.DBTable;
 import ${tablePackageName}.${baseTableClassName};
 #end
 
-public abstract class ${baseRecordClassName}<T extends ${baseTableClassName}> 
extends DBRecord {
+public abstract class ${baseRecordClassName}<CTX extends $contextClassName, T 
extends ${baseTableClassName}> extends DBRecord {
 
        private static final long serialVersionUID = 1L;
 
+    public final CTX CTX;  // provide access to the context
+
     public final T T;   // provide access to RowSet via T
 
-       public ${baseRecordClassName}(DBContext context, T rowset) {
+       public ${baseRecordClassName}(CTX context, T rowset) {
                super(context, rowset);
-        // set the RowSet for quick access
+        // set context and RowSet for quick access
+        this.CTX = context;
         this.T = rowset;
        }
 
        /**
-        * Returns the RowSet this record is based upon.
-        * @return The RowSet this record is based upon.
+        * Returns the Context
+        * @return The Context
+        */
+    @Override
+    public CTX getContext()
+    {
+        return this.CTX;
+    }
+
+       /**
+        * Returns the RowSet for this record
+        * @return The RowSet for this record
         */
     @Override
     public T getRowSet()
diff --git a/empire-db-codegen/src/main/resources/templates/BaseTable.vm 
b/empire-db-codegen/src/main/resources/templates/BaseTable.vm
index c92f9bf..bbef8e6 100644
--- a/empire-db-codegen/src/main/resources/templates/BaseTable.vm
+++ b/empire-db-codegen/src/main/resources/templates/BaseTable.vm
@@ -23,7 +23,7 @@ import ${basePackageName}.${dbClassName};
 
 public class ${baseTableClassName} extends DBTable {
 
-       private static final long serialVersionUID = 1L;
+       // private static final long serialVersionUID = 1L;
 
     public final ${dbClassName} DB;
     
diff --git a/empire-db-codegen/src/main/resources/templates/BaseView.vm 
b/empire-db-codegen/src/main/resources/templates/BaseView.vm
index 53bf5e3..ae81712 100644
--- a/empire-db-codegen/src/main/resources/templates/BaseView.vm
+++ b/empire-db-codegen/src/main/resources/templates/BaseView.vm
@@ -23,7 +23,7 @@ import ${basePackageName}.${dbClassName};
 
 public abstract class ${baseViewClassName} extends DBView {
 
-       private static final long serialVersionUID = 1L;
+       // private static final long serialVersionUID = 1L;
 
     public final ${dbClassName} DB;
 
diff --git a/empire-db-codegen/src/main/resources/templates/Database.vm 
b/empire-db-codegen/src/main/resources/templates/Database.vm
index bfb7184..7e8be2c 100644
--- a/empire-db-codegen/src/main/resources/templates/Database.vm
+++ b/empire-db-codegen/src/main/resources/templates/Database.vm
@@ -50,8 +50,9 @@ import $viewPackageName.*;
 
 public class $dbClassName extends DBDatabase {
 
+       // private static final long serialVersionUID = 1L;
+
        private static $dbClassName instance;
-       private static final long serialVersionUID = 1L;
 
 #foreach($table in $database.tables)
        #set($tblClass=$parser.getTableClassName($table.name))
diff --git a/empire-db-codegen/src/main/resources/templates/Record.vm 
b/empire-db-codegen/src/main/resources/templates/Record.vm
index 2bf6bd6..bcab354 100644
--- a/empire-db-codegen/src/main/resources/templates/Record.vm
+++ b/empire-db-codegen/src/main/resources/templates/Record.vm
@@ -42,7 +42,7 @@ import 
${tablePackageName}.$parser.getTableClassName($table.name);
  * This class provides protected method that subclasses should use to provide
  * access to related records.
  */
-public class $parser.getRecordClassName($table.name) extends 
${baseRecordClassName}<$parser.getTableClassName($table.name)> {
+public class $parser.getRecordClassName($table.name) extends 
${baseRecordClassName}<$contextClassName, 
$parser.getTableClassName($table.name)> {
 
        private static final long serialVersionUID = 1L;
 
@@ -54,10 +54,10 @@ public class $parser.getRecordClassName($table.name) 
extends ${baseRecordClassNa
        // Access methods for all columns
 #foreach($col in $table.columns)
 
-       public $parser.getJavaType($col).getCanonicalName() 
$parser.getAccessorName($col)() {
-               return 
($parser.getJavaType($col).getCanonicalName())super.get(T.${parser.getColumnName($col)});
+       public $parser.getJavaType($col).getSimpleName() 
$parser.getAccessorName($col)() {
+               return 
($parser.getJavaType($col).getSimpleName())super.get(T.${parser.getColumnName($col)});
        }
-       public void 
$parser.getMutatorName($col)($parser.getJavaType($col).getCanonicalName() val) {
+       public void 
$parser.getMutatorName($col)($parser.getJavaType($col).getSimpleName() val) {
                super.set(T.${parser.getColumnName($col)}, val);
        }
 #end
diff --git a/empire-db-codegen/src/main/resources/templates/Table.vm 
b/empire-db-codegen/src/main/resources/templates/Table.vm
index e72cc68..f511ac1 100644
--- a/empire-db-codegen/src/main/resources/templates/Table.vm
+++ b/empire-db-codegen/src/main/resources/templates/Table.vm
@@ -33,7 +33,7 @@ import $basePackageName.${dbClassName};
 public class $parser.getTableClassName($table.name) extends 
${baseTableClassName} {
 #end
 
-       private static final long serialVersionUID = 1L;
+       // private static final long serialVersionUID = 1L;
        
        // define columns
 #foreach ($col in $table.columns)
diff --git a/empire-db-codegen/src/main/resources/templates/View.vm 
b/empire-db-codegen/src/main/resources/templates/View.vm
index 9400c34..1f97ca4 100644
--- a/empire-db-codegen/src/main/resources/templates/View.vm
+++ b/empire-db-codegen/src/main/resources/templates/View.vm
@@ -36,7 +36,7 @@ import $basePackageName.${dbClassName};
 public class $parser.getViewClassName($view.name) extends ${baseViewClassName} 
{
 #end
        
-       private static final long serialVersionUID = 1L;
+       // private static final long serialVersionUID = 1L;
 
        // define columns
 #foreach ($col in $view.columns)
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 6aed30f..489a282 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
@@ -118,6 +118,12 @@ public class SampleAdvApp
         context.setPreparedStatementsEnabled(true);
         context.setRollbackHandlingEnabled(false);
 
+        /*
+        // optional: Disable PreparedStatements for DBRecord operations (not 
recommended)
+        if (!context.isPreparedStatementsEnabled())
+            carSales.setPreparedStatementsEnabled(false);
+        */    
+        
         // STEP 3: Open Database (and create if not existing)
         System.out.println("*** Step 3: openDatabase() ***");
         // db.open(context);
@@ -548,6 +554,11 @@ public class SampleAdvApp
              log.info("Dealer \"{}\" rating changed from {} to {}", 
dealer.getString(DEALER.COMPANY_NAME), oldRating, newRating);
              dealer.set(DEALER.RATING, newRating);
              dealer.update();
+             // Show brands
+             String brands = dealer.getBrands();
+             log.info("Dealer \"{}\" distributes the brands {}", 
dealer.getString(DEALER.COMPANY_NAME), brands);
+             // alternatively use  
+             // List<BrandRecord> brandList = dealer.getBrandList();
         }
         context.commit();
     }
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 1eeb99b..9041f10 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
@@ -321,8 +321,6 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
     @Override
     public void open(DBContext context)
     {
-        // Enable prepared statements
-        setPreparedStatementsEnabled(true);
         // Check exists
         if (checkExists(context))
         {   // attach to driver
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 ba546a3..3efd4ba 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
@@ -18,11 +18,12 @@
  */
 package org.apache.empire.samples.db.advanced.records;
 
+import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.generic.TRecord;
 import org.apache.empire.samples.db.advanced.SampleContext;
 import org.apache.empire.samples.db.advanced.db.CarSalesDB;
 
-public class BrandRecord extends TRecord<CarSalesDB.Brand>
+public class BrandRecord extends TRecord<SampleContext, CarSalesDB.Brand>
 {
     private static final long serialVersionUID = 1L;
 
@@ -31,6 +32,13 @@ public class BrandRecord extends TRecord<CarSalesDB.Brand>
         super(context, context.getDatabase().BRAND);
     }
     
+    /**
+     * Insert a new brand
+     * @param wmi
+     * @param name
+     * @param country
+     * @return the BrandRecord itself (returned to allow instruction chaining)
+     */
     public BrandRecord insert(String wmi, String name, String country)
     {
         // T = RowSet (Table/View)
@@ -42,4 +50,13 @@ public class BrandRecord extends TRecord<CarSalesDB.Brand>
         return this;
     }
 
+    /**
+     * Overloaded read for convenience
+     * @param wmi
+     */
+    public void read(String wmi)
+    {
+        super.read(DBRecord.key(wmi));
+    }
+
 }
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 b138204..329ce79 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
@@ -1,18 +1,30 @@
 package org.apache.empire.samples.db.advanced.records;
 
+import java.util.List;
+
+import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.generic.TRecord;
 import org.apache.empire.samples.db.advanced.SampleContext;
 import org.apache.empire.samples.db.advanced.db.CarSalesDB;
 
-public class DealerRecord extends TRecord<CarSalesDB.Dealer>
+public class DealerRecord extends TRecord<SampleContext, CarSalesDB.Dealer>
 {
     private static final long serialVersionUID = 1L;
+    
+    private List<BrandRecord> brandList = null; // Lazy initialization
 
     public DealerRecord(SampleContext context)
     {
         super(context, context.getDatabase().DEALER);
     }
     
+    /**
+     * Create a new Dealer 
+     * @param companyName
+     * @param city
+     * @param country
+     * @return the DealerRecord itself (returned to allow instruction chaining)
+     */
     public DealerRecord insert(String companyName, String city, String country)
     {
         // T = RowSet (Table/View)
@@ -23,4 +35,33 @@ public class DealerRecord extends TRecord<CarSalesDB.Dealer>
         update();
         return this;
     }
+
+    /**
+     * Get the Brand names as a comma separated String
+     * @return the brand names 
+     */
+    public String getBrands()
+    {
+        DBCommand cmd = T.DB.createCommand()
+                .select(T.DB.BRAND.NAME.stringAgg(", "))
+                .join(T.DB.DEALER_BRANDS.WMI, T.DB.BRAND.WMI)
+                .where(T.DB.DEALER_BRANDS.DEALER_ID.is(getIdentity()));
+        return CTX.getUtils().querySingleString(cmd);
+    }
+    
+    /**
+     * Get the dealers Brands as a list of BrandRecords
+     * @return the BrandRecords 
+     */
+    public List<BrandRecord> getBrandList()
+    {
+        if (brandList == null)
+        {   // init brand list
+            DBCommand cmd = T.DB.createCommand()
+                    .join(T.DB.DEALER_BRANDS.WMI, T.DB.BRAND.WMI)
+                    .where(T.DB.DEALER_BRANDS.DEALER_ID.is(getIdentity()));
+            brandList = CTX.getUtils().queryRecordList(cmd, T.DB.BRAND, 
BrandRecord.class);
+        }
+        return brandList;
+    }
 }
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 31bc745..bc4c610 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
@@ -15,17 +15,30 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 
-public class ModelRecord extends TRecord<CarSalesDB.Model>
+public class ModelRecord extends TRecord<SampleContext, CarSalesDB.Model>
 {
     private static final Logger log = 
LoggerFactory.getLogger(ModelRecord.class);
 
     private static final long serialVersionUID = 1L;
+    
+    private BrandRecord brand = null; // Lazy initialization
 
     public ModelRecord(SampleContext context)
     {
         super(context, context.getDatabase().MODEL);
     }
     
+    /**
+     * Insert a new Model
+     * @param brand
+     * @param modelName
+     * @param configName
+     * @param trim
+     * @param engineType
+     * @param enginePower
+     * @param basePrice
+     * @param firstSale
+     */
     public void insert(BrandRecord brand, String modelName, String configName, 
String trim
                        , EngineType engineType, int enginePower, double 
basePrice, LocalDate firstSale)
     {
@@ -41,6 +54,19 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
         set(T.FIRST_SALE      , firstSale);
         update();
     }
+
+    /**
+     * Returns the Model's brand
+     * @return
+     */
+    public BrandRecord getBrand()
+    {
+        if (brand==null) {
+            brand = new BrandRecord(CTX);
+            brand.read(getString(T.WMI));
+        }
+        return brand;
+    }
     
     @Override
     public void update()
@@ -57,6 +83,11 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
         super.update();
     }
     
+    /**
+     * Generates the Model-XML when Record is modified
+     * Only used to demonstrate the use of the CLOB-DataType
+     * @return the XML String
+     */
     private String getModelXml()
     {
         Document modelDoc = this.getXmlDocument();
@@ -66,6 +97,11 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
         return writer.toString();
     }
     
+    /**
+     * Serializes the Model-fields when Record is modified
+     * Only used to demonstrate the use of the BLOB-DataType
+     * @return the binary fields info
+     */
     private byte[] getModelBinary()
     {
         try
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 8354216..c7e6d88 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
@@ -38,7 +38,6 @@ import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBRecordBean;
 import org.apache.empire.db.DBRowSet.PartialMode;
 import org.apache.empire.db.context.DBContextStatic;
-import org.apache.empire.db.generic.TRecord;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
 import org.apache.empire.samples.db.SampleDB.Gender;
@@ -284,7 +283,7 @@ public class SampleApp
     {
         SampleDB.Departments DEP = db.DEPARTMENTS;
                // Insert a Department
-               TRecord<SampleDB.Departments> rec = new 
TRecord<SampleDB.Departments>(context, DEP);
+               DBRecord rec = new DBRecord(context, DEP);
                rec.create()
                   .set(DEP.NAME, departmentName)
                   .set(DEP.BUSINESS_UNIT, businessUnit)
diff --git 
a/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
 
b/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
index 58d0994..6c6ccb1 100644
--- 
a/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
+++ 
b/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
@@ -26,7 +26,9 @@ import java.sql.SQLException;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
+
 import javax.sql.DataSource;
+
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
@@ -42,7 +44,6 @@ import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBRecordBean;
 import org.apache.empire.db.DBRowSet;
 import org.apache.empire.db.context.DBContextStatic;
-import org.apache.empire.db.generic.TRecord;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
 import org.apache.empire.exceptions.InvalidArgumentException;
@@ -180,7 +181,7 @@ public class SampleApp implements ApplicationRunner {
   private long insertDepartment(String departmentName, String businessUnit) {
     SampleDB.Departments DEP = db.DEPARTMENTS;
     // Insert a Department
-    TRecord<SampleDB.Departments> rec = new 
TRecord<SampleDB.Departments>(context, DEP);
+    DBRecord rec = new DBRecord(context, DEP);
     rec.create()
             .set(DEP.NAME, departmentName)
             .set(DEP.BUSINESS_UNIT, businessUnit)
diff --git a/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java 
b/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
index 2b8feb2..5714365 100644
--- a/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
@@ -19,7 +19,6 @@
 package org.apache.empire.data;
 
 import org.apache.empire.commons.Options;
-import org.apache.empire.commons.Unwrappable;
 
 /**
  * The column interface provides methods for accessing metadata that is 
relevant for managing
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 4daacaf..ac27663 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
@@ -150,14 +150,18 @@ public abstract class DBDatabase extends DBObject
     
     protected DBMSHandler dbms    = null;
     
-    protected boolean legacyDate  = true; // When true not using Java8 
Local???? Types
-    
     /**   
-     * Property that indicates whether to always use usePreparedStatements 
(Default is false!)
-     * Note: This will only apply for update and insert commands as well as 
for read operations on a DBRecord.
-     * For custom SQL commands parameters must be explicitly declared using 
cmd.addCmdParam();   
+     * Property that indicates whether to use Prepared Statements for the read 
and update operations in DBRecord (Default is true!).
+     * Note: This will not affect statements generated via 
DBContext.createCommand()
+     * However statement parameters can always be manually declared using 
cmd.addCmdParam();
+     */
+    private boolean autoPrepareStmt = true;
+
+    /**
+     * Flag indicating whether Bean getters / setters use java.util.Date or 
Java types (LocalDate, LocalDateTime)
+     * True (default) when java.util.Date is used
      */
-    private boolean autoPrepareStmt = false;
+    protected boolean legacyDate  = true; 
 
     /**
      * Constructs a new DBDatabase object and sets the specified schema object.
@@ -301,9 +305,10 @@ public abstract class DBDatabase extends DBObject
     }
     
     /**
-     * return whether prepared statements are preferred over normal statements 
(Default is false)
-     * Note: This will only apply for update and insert commands as well as 
for read operations on a DBRecord.
-     * For custom SQL commands parameters must be explicitly declared using 
cmd.addCmdParam();   
+     * Returns whether Prepared Statements are enabled for the read and update 
operations in DBRecord.
+     * Note: This will not affect statements generated via 
DBContext.createCommand()
+     * However statement parameters can always be manually declared using 
cmd.addCmdParam();
+     *    
      * @return true if prepared Statements are enabled or false if not
      */
     public boolean isPreparedStatementsEnabled()
@@ -312,8 +317,10 @@ public abstract class DBDatabase extends DBObject
     }
 
     /**
-     * enables or disables the use of prepared statements for update and 
insert commands as well as for read operations on a DBRecord.
-     * Note: For custom SQL commands parameters must be explicitly declared 
using cmd.addCmdParam();   
+     * Enables or Disables the use of Prepared Statements only for the read 
and update operations in DBRecord.
+     * For general use of Prepared Statements please use 
DBContext.createCommand()
+     * However statement parameters can always be manually declared using 
cmd.addCmdParam();   
+     *    
      * @param preparedStatementsEnabled
      */
     public void setPreparedStatementsEnabled(boolean autoPrepareStmt)
@@ -924,11 +931,14 @@ public abstract class DBDatabase extends DBObject
      * Creates a new Command object for this database
      * 
      * @return the command object.
+     *
+     * @Deprecated use context.createCommand();
      */
     public final DBCommand createCommand()
     {
         checkOpen(); 
-        return dbms.createCommand(isPreparedStatementsEnabled());
+        // For compatiblity with 2.x dont use isPreparedStatementsEnabled() 
+        return dbms.createCommand(false);
     }
     
     /**
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 88359d7..6f58608 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
@@ -37,6 +37,7 @@ 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.context.DBContextBase;
 import org.apache.empire.db.exceptions.FieldNotNullException;
 import org.apache.empire.db.exceptions.FieldReadOnlyException;
 import org.apache.empire.db.exceptions.InvalidKeyException;
@@ -1200,10 +1201,15 @@ public abstract class DBRowSet extends DBExpr 
implements EntityType
      */
     protected DBCommand createRecordCommand(DBContext context)
     {
-        /** 
-         * alternative is:
-         *    return context.getDbms().createCommand(true); 
-         */
+        // Special behaviour for DBRecord operations
+        if ((context instanceof DBContextBase) && 
!((DBContextBase)context).isPreparedStatementsEnabled())
+        {   // Check PreparedStatementsEnabled in DBDatabase
+            if (getDatabase().isPreparedStatementsEnabled())
+            {   // Use PreparedStatement even though disabled in context
+                return context.getDbms().createCommand(true);
+            }
+        }
+        // just use the context
         return context.createCommand();
     }
 
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 6a80227..e214bbc 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,42 +22,54 @@ import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBRowSet;
 
-public class TRecord<T extends DBRowSet> extends DBRecord
+public class TRecord<CTX extends DBContext, T extends DBRowSet> extends 
DBRecord
 {
     private static final long serialVersionUID = 1L;
     
     public final T T;   // provide access to RowSet via T
+    
+    public final CTX CTX; // provide access to Context via CTX
 
     /**
-     * Internal constructor for DBRecord
+     * Internal constructor for TRecord
      * May be used by derived classes to provide special behaviour
      */
-    protected TRecord(DBContext context, T rowset, boolean 
enableRollbackHandling)
+    protected TRecord(CTX context, T rowset, boolean enableRollbackHandling)
     {   
         super(context, rowset, enableRollbackHandling);
         // set the rowset for quick access
         this.T = rowset;
+        this.CTX = context;
     }
 
     /**
-     * Constructs a new DBRecord.<BR>
+     * Constructs a new TRecord.<BR>
      * @param context the DBContext for this record
      * @param rowset the corresponding RowSet(Table, View, Query, etc.)
      */
-    public TRecord(DBContext context, T rowset)
+    public TRecord(CTX context, T rowset)
     {
         super(context, rowset);
         // set the rowset for quick access
         this.T = rowset;
+        this.CTX = context;
+    }
+    
+    /**
+     * finally we know the Context class
+     */
+    @Override
+    public CTX getContext()
+    {
+        return this.CTX;
     }
     
     /**
-     * finally we know the rowset
+     * finally we know the RowSet class
      */
     @Override
     public T getRowSet()
     {
         return this.T;
     }
-
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java 
b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
index 4c5819a..0acbef4 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
@@ -158,6 +158,8 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
             case SQL_FUNC_MAX:          return "max(?)";
             case SQL_FUNC_MIN:          return "min(?)";
             case SQL_FUNC_AVG:          return "avg(?)";
+            case SQL_FUNC_STRAGG:       return "GROUP_CONCAT(DISTINCT ? ORDER 
BY {1} SEPARATOR {0})"; 
+            
             // Others
             case SQL_FUNC_DECODE:       return "case ?{0} end";
             case SQL_FUNC_DECODE_SEP:   return " ";

Reply via email to