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; + } + +}