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

derjan 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 d77aa42e EMPIREDB-413
d77aa42e is described below

commit d77aa42edda661d7cf209b9fc77a59ea958e5772
Author: Jan Glaubitz <j...@glaubitz.org>
AuthorDate: Mon May 22 08:11:40 2023 +0200

    EMPIREDB-413
    
     - Add support for PostgreSQL 'interval'
---
 .../empire/dbms/postgresql/DBCommandPostgres.java  |   5 +
 .../dbms/postgresql/PostgresIntervalExpr.java      | 132 +++++++++++++++++++++
 2 files changed, 137 insertions(+)

diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
index fdc37214..2d73f1bd 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
@@ -26,6 +26,7 @@ import org.apache.empire.db.DBRowSet;
 import org.apache.empire.db.DBSQLBuilder;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
+import 
org.apache.empire.dbms.postgresql.PostgresIntervalExpr.PostgresIntervalUnitField;
 
 /**
  * Defines the PostgreSQL command type.
@@ -122,6 +123,10 @@ public class DBCommandPostgres extends DBCommand
         return new PostgresAtAt(left, right);
     }
     
+    public PostgresIntervalExpr pgInterval(int quantity, 
PostgresIntervalUnitField unit) {
+       return new PostgresIntervalExpr(getDatabase(), quantity, unit) ;
+    }
+    
     @Override
     public DBCommand limitRows(int numRows)
     {
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresIntervalExpr.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresIntervalExpr.java
new file mode 100644
index 00000000..b11043f1
--- /dev/null
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresIntervalExpr.java
@@ -0,0 +1,132 @@
+package org.apache.empire.dbms.postgresql;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBColumnExpr;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBSQLBuilder;
+import org.w3c.dom.Element;
+
+public class PostgresIntervalExpr extends DBColumnExpr {
+
+       public enum PostgresIntervalUnitField {
+
+               YEARS,
+
+               MONTHS,
+
+               WEEKS,
+
+               DAYS,
+
+               HOURS,
+
+               MINUTES,
+
+               SECONDS;
+
+       }
+       
+       private final DBDatabase                                                
                db;
+       private final Map<PostgresIntervalUnitField, Integer>   fields  = new 
HashMap<>();
+
+       public PostgresIntervalExpr(DBDatabase db, int quantity, 
PostgresIntervalUnitField unit)
+       {
+               this.db = db;
+               this.fields.put(unit, quantity);
+       }
+       
+       @Override
+       public DataType getDataType()
+       {
+               return DataType.UNKNOWN;
+       }
+
+       @Override
+       public String getName()
+       {
+               return "interval";
+       }
+
+       @Override
+       public boolean isAggregate()
+       {
+               return false;
+       }
+
+       @Override
+       public DBColumn getUpdateColumn()
+       {
+               return null;
+       }
+
+       @Override
+       public Element addXml(Element parent, long flags)
+       {
+               return null;
+       }
+
+       @Override
+       public void addSQL(DBSQLBuilder sql, long context)
+       {
+               sql.append("interval");
+               sql.append(" '");
+               appendIfAdded(PostgresIntervalUnitField.YEARS, sql, context);
+               appendIfAdded(PostgresIntervalUnitField.MONTHS, sql, context);
+               appendIfAdded(PostgresIntervalUnitField.WEEKS, sql, context);
+               appendIfAdded(PostgresIntervalUnitField.DAYS, sql, context);
+               appendIfAdded(PostgresIntervalUnitField.HOURS, sql, context);
+               appendIfAdded(PostgresIntervalUnitField.MINUTES, sql, context);
+               appendIfAdded(PostgresIntervalUnitField.SECONDS, sql, context);
+               sql.reset(sql.length() - 1); // remove last blank
+               sql.append("' ");
+       }
+
+       private void appendIfAdded(PostgresIntervalUnitField unit, DBSQLBuilder 
sql, long context)
+       {
+               if (this.fields.containsKey(unit) && this.fields.get(unit) != 
null) {
+                       sql.append(this.fields.get(unit));
+                       sql.append(" ");
+                       sql.append(unit.name());
+                       sql.append(" ");
+               }
+       }
+
+       public PostgresIntervalExpr add(int quantity, PostgresIntervalUnitField 
unit)
+       {
+               this.fields.put(unit, quantity);
+               return this;
+       }
+
+       @Override
+       public void addReferencedColumns(Set<DBColumn> list)
+       {
+       }
+
+       @SuppressWarnings("unchecked")
+       @Override
+       public final DBDatabase getDatabase()
+       {
+               return this.db;
+       }
+
+       /**
+        * Not an Enum. Returns null
+        */
+       @Override
+       public Class<Enum<?>> getEnumType()
+       {
+               return null;
+       }
+
+       @Override
+       public DBColumn getSourceColumn()
+       {
+               return null;
+       }
+       
+}

Reply via email to