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 <[email protected]>
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;
+ }
+
+}