From 3eaf3b1729a82d29978d0f178eea1da2ad03db77 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 25 Jan 2024 14:22:57 +0100 Subject: [PATCH] [jOOQ/jOOQ#16135] Add the invisibleColumnsAsHidden flag --- .../java/org/jooq/codegen/GenerationTool.java | 1 + .../java/org/jooq/codegen/XMLGenerator.java | 2 +- .../java/org/jooq/meta/AbstractDatabase.java | 11 ++++ .../src/main/java/org/jooq/meta/Database.java | 14 +++++ .../jooq/meta/DefaultColumnDefinition.java | 2 +- .../org/jooq/meta/h2/H2TableDefinition.java | 14 ++++- .../java/org/jooq/meta/jaxb/Database.java | 52 +++++++++++++++++++ .../jooq/meta/mysql/MySQLTableDefinition.java | 7 ++- .../jooq/meta/postgres/PostgresDatabase.java | 7 +++ .../postgres/PostgresTableDefinition.java | 14 ++++- .../org/jooq/meta/xml/XMLTableDefinition.java | 5 +- .../org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd | 4 +- .../jooq/impl/InformationSchemaExport.java | 2 +- 13 files changed, 124 insertions(+), 11 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index f2bcec5a64..26ba0a0196 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -603,6 +603,7 @@ public class GenerationTool { database.setIncludeSystemSequences(TRUE.equals(d.isIncludeSystemSequences())); database.setIncludeSystemUDTs(TRUE.equals(d.isIncludeSystemUDTs())); database.setIncludeInvisibleColumns(!FALSE.equals(d.isIncludeInvisibleColumns())); + database.setInvisibleColumnsAsHidden(!FALSE.equals(d.isInvisibleColumnsAsHidden())); database.setIncludePrimaryKeys(!FALSE.equals(d.isIncludePrimaryKeys())); database.setIncludeRoutines(!FALSE.equals(d.isIncludeRoutines())); database.setIncludeDomains(!FALSE.equals(d.isIncludeDomains())); diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/XMLGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/XMLGenerator.java index 0fa07de442..f2eb5c7eaf 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/XMLGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/XMLGenerator.java @@ -206,7 +206,7 @@ public class XMLGenerator extends AbstractGenerator { column.setNumericPrecision(type.getPrecision()); column.setNumericScale(type.getScale()); column.setOrdinalPosition(co.getPosition()); - column.setHidden(co.isHidden()); + column.setHidden(type.isHidden()); column.setReadonly(co.isReadonly()); if (type.isComputed()) { diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index 38538ca015..a1c45a0de4 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -197,6 +197,7 @@ public abstract class AbstractDatabase implements Database { private boolean includeExcludeColumns = false; private boolean includeExcludePackageRoutines = false; private boolean includeInvisibleColumns = true; + private boolean invisibleColumnsAsHidden = true; private boolean includeXMLSchemaCollections = true; private boolean includeTables = true; private boolean includeEmbeddables = true; @@ -1181,6 +1182,16 @@ public abstract class AbstractDatabase implements Database { return includeInvisibleColumns; } + @Override + public final void setInvisibleColumnsAsHidden(boolean invisibleColumnsAsHidden) { + this.invisibleColumnsAsHidden = invisibleColumnsAsHidden; + } + + @Override + public final boolean getInvisibleColumnsAsHidden() { + return invisibleColumnsAsHidden; + } + @Override public final boolean getIncludeTables() { return includeTables; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java index 5aaaf7f5f4..45db657a94 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java @@ -824,6 +824,20 @@ public interface Database extends AutoCloseable { */ boolean getIncludeInvisibleColumns(); + /** + * Whether invisible columns should be marked as {@link DataType#hidden()}. + *

+ * This feature is available in the commercial distribution only. + */ + void setInvisibleColumnsAsHidden(boolean invisibleColumnsAsHidden); + + /** + * Whether invisible columns should be marked as {@link DataType#hidden()}. + *

+ * This feature is available in the commercial distribution only. + */ + boolean getInvisibleColumnsAsHidden(); + /** * Whether zero-scale decimal types should be treated as their most * appropriate, corresponding integer type. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultColumnDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultColumnDefinition.java index 17d2cb3eab..36385c35fe 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultColumnDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultColumnDefinition.java @@ -85,7 +85,7 @@ public class DefaultColumnDefinition boolean readonly, String comment ) { - this(table, name, position, type, identity, false, readonly, comment); + this(table, name, position, type, identity, type.isHidden(), readonly, comment); } public DefaultColumnDefinition( diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java index 6e57f572f4..782b910388 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java @@ -56,6 +56,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.jooq.Field; import org.jooq.Name; import org.jooq.Param; import org.jooq.Record; @@ -70,6 +71,8 @@ import org.jooq.meta.h2.H2Database.ElementType; import org.jooq.meta.h2.H2Database.ElementTypeLookupKey; import org.jooq.meta.hsqldb.information_schema.Tables; +import org.jetbrains.annotations.NotNull; + /** * H2 table definition * @@ -102,6 +105,7 @@ public class H2TableDefinition extends AbstractTableDefinition { List result = new ArrayList<>(); H2Database db = (H2Database) getDatabase(); + Field visible = COLUMNS.IS_VISIBLE.coerce(BOOLEAN); // [#252] While recursing on ELEMENT_TYPES to detect multi dimensional @@ -131,7 +135,8 @@ public class H2TableDefinition extends AbstractTableDefinition { Tables.COLUMNS.IS_IDENTITY.eq(inline("YES")).as(Tables.COLUMNS.IS_IDENTITY), COLUMNS.DOMAIN_SCHEMA, COLUMNS.DOMAIN_NAME, - Tables.COLUMNS.DTD_IDENTIFIER + Tables.COLUMNS.DTD_IDENTIFIER, + visible ) .from(COLUMNS) .where(COLUMNS.TABLE_SCHEMA.equal(getSchema().getName())) @@ -165,7 +170,7 @@ public class H2TableDefinition extends AbstractTableDefinition { if (et == null) et = new ElementType(record.get(COLUMNS.TYPE_NAME), record.get(COLUMNS.CHARACTER_MAXIMUM_LENGTH), record.get(COLUMNS.NUMERIC_PRECISION), record.get(COLUMNS.NUMERIC_SCALE), null, 0); - DataTypeDefinition type = new DefaultDataTypeDefinition( + DefaultDataTypeDefinition type = new DefaultDataTypeDefinition( getDatabase(), typeSchema == null ? getSchema() : typeSchema, et.dataType() + IntStream.range(0, et.dimension()).mapToObj(i -> " ARRAY").collect(Collectors.joining()), @@ -177,6 +182,11 @@ public class H2TableDefinition extends AbstractTableDefinition { userType ).generatedAlwaysAs(isComputed ? record.get(Tables.COLUMNS.GENERATION_EXPRESSION) : null); + + + + + result.add(new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()), record.get(COLUMNS.COLUMN_NAME), diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Database.java index d0f3ccce45..315b34b681 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Database.java @@ -105,6 +105,8 @@ public class Database implements Serializable, XMLAppendable protected Boolean includeSystemUDTs = false; @XmlElement(defaultValue = "true") protected Boolean includeInvisibleColumns = true; + @XmlElement(defaultValue = "true") + protected Boolean invisibleColumnsAsHidden = true; @XmlElement(defaultValue = "") @XmlJavaTypeAdapter(StringAdapter.class) protected String recordVersionFields = ""; @@ -1159,6 +1161,34 @@ public class Database implements Serializable, XMLAppendable this.includeInvisibleColumns = value; } + /** + * This flag indicates whether invisible columns should marked as {@link org.jooq.DataType#hidden()} in output produced by this database. + *

+ * This feature is available in the commercial distribution only. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isInvisibleColumnsAsHidden() { + return invisibleColumnsAsHidden; + } + + /** + * This flag indicates whether invisible columns should marked as {@link org.jooq.DataType#hidden()} in output produced by this database. + *

+ * This feature is available in the commercial distribution only. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setInvisibleColumnsAsHidden(Boolean value) { + this.invisibleColumnsAsHidden = value; + } + /** * All table and view columns that are used as "version" fields for optimistic locking. *

@@ -2544,6 +2574,17 @@ public class Database implements Serializable, XMLAppendable return this; } + /** + * This flag indicates whether invisible columns should marked as {@link org.jooq.DataType#hidden()} in output produced by this database. + *

+ * This feature is available in the commercial distribution only. + * + */ + public Database withInvisibleColumnsAsHidden(Boolean value) { + setInvisibleColumnsAsHidden(value); + return this; + } + /** * All table and view columns that are used as "version" fields for optimistic locking. *

@@ -3152,6 +3193,7 @@ public class Database implements Serializable, XMLAppendable builder.append("includeSystemSequences", includeSystemSequences); builder.append("includeSystemUDTs", includeSystemUDTs); builder.append("includeInvisibleColumns", includeInvisibleColumns); + builder.append("invisibleColumnsAsHidden", invisibleColumnsAsHidden); builder.append("recordVersionFields", recordVersionFields); builder.append("recordTimestampFields", recordTimestampFields); builder.append("syntheticObjects", syntheticObjects); @@ -3528,6 +3570,15 @@ public class Database implements Serializable, XMLAppendable return false; } } + if (invisibleColumnsAsHidden == null) { + if (other.invisibleColumnsAsHidden!= null) { + return false; + } + } else { + if (!invisibleColumnsAsHidden.equals(other.invisibleColumnsAsHidden)) { + return false; + } + } if (recordVersionFields == null) { if (other.recordVersionFields!= null) { return false; @@ -3930,6 +3981,7 @@ public class Database implements Serializable, XMLAppendable result = ((prime*result)+((includeSystemSequences == null)? 0 :includeSystemSequences.hashCode())); result = ((prime*result)+((includeSystemUDTs == null)? 0 :includeSystemUDTs.hashCode())); result = ((prime*result)+((includeInvisibleColumns == null)? 0 :includeInvisibleColumns.hashCode())); + result = ((prime*result)+((invisibleColumnsAsHidden == null)? 0 :invisibleColumnsAsHidden.hashCode())); result = ((prime*result)+((recordVersionFields == null)? 0 :recordVersionFields.hashCode())); result = ((prime*result)+((recordTimestampFields == null)? 0 :recordTimestampFields.hashCode())); result = ((prime*result)+((syntheticObjects == null)? 0 :syntheticObjects.hashCode())); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLTableDefinition.java index bef3f97959..494e946aca 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLTableDefinition.java @@ -154,7 +154,7 @@ public class MySQLTableDefinition extends AbstractTableDefinition { } } - DataTypeDefinition type = new DefaultDataTypeDefinition( + DefaultDataTypeDefinition type = new DefaultDataTypeDefinition( getDatabase(), getSchema(), dataType, @@ -168,6 +168,11 @@ public class MySQLTableDefinition extends AbstractTableDefinition { .generatedAlwaysAs(generated ? record.get(COLUMNS.GENERATION_EXPRESSION) : null) .generationOption(generationOption); + + + + + result.add(new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()), record.get(COLUMNS.COLUMN_NAME), diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java index 637941391f..7a6d1a7e2b 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java @@ -1246,6 +1246,13 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat + + + + + + + diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresTableDefinition.java index da491d5001..6f382b7177 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresTableDefinition.java @@ -42,6 +42,7 @@ import static org.jooq.impl.DSL.any; import static org.jooq.impl.DSL.coalesce; import static org.jooq.impl.DSL.concat; import static org.jooq.impl.DSL.count; +import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.greatest; import static org.jooq.impl.DSL.inline; @@ -146,6 +147,8 @@ public class PostgresTableDefinition extends AbstractTableDefinition { Field serialColumnDefault = inline("nextval('%_seq'::regclass)"); Field generationExpression = COLUMNS.GENERATION_EXPRESSION; Field attgenerated = database.is12() ? PG_ATTRIBUTE.ATTGENERATED : inline("s"); + Condition columnHidden = falseCondition(); + @@ -166,6 +169,7 @@ public class PostgresTableDefinition extends AbstractTableDefinition { ? isIdentity10.or(count().filterWhere(isIdentity10).over().eq(inline(0)).and(isSerial)) : isSerial; + for (Record record : create().select( COLUMNS.COLUMN_NAME, COLUMNS.ORDINAL_POSITION, @@ -184,7 +188,8 @@ public class PostgresTableDefinition extends AbstractTableDefinition { when(COLUMNS.DATA_TYPE.eq(inline("ARRAY")), substring(PG_TYPE.TYPNAME, inline(2))) .else_(COLUMNS.UDT_NAME) ).as(COLUMNS.UDT_NAME), - PG_DESCRIPTION.DESCRIPTION) + PG_DESCRIPTION.DESCRIPTION, + columnHidden) .from(COLUMNS) .join(PG_ATTRIBUTE) .on(PG_ATTRIBUTE.ATTNAME.eq(COLUMNS.COLUMN_NAME)) @@ -209,7 +214,7 @@ public class PostgresTableDefinition extends AbstractTableDefinition { if (schemaName != null) typeSchema = getDatabase().getSchema(schemaName); - DataTypeDefinition type = new DefaultDataTypeDefinition( + DefaultDataTypeDefinition type = new DefaultDataTypeDefinition( getDatabase(), typeSchema, record.get(COLUMNS.DATA_TYPE), @@ -232,6 +237,11 @@ public class PostgresTableDefinition extends AbstractTableDefinition { : null ); + + + + + ColumnDefinition column = new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()), record.get(COLUMNS.COLUMN_NAME), diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/xml/XMLTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/xml/XMLTableDefinition.java index 8dbdebc088..84115a92c9 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/xml/XMLTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/xml/XMLTableDefinition.java @@ -93,7 +93,7 @@ public class XMLTableDefinition extends AbstractTableDefinition { SchemaDefinition schema = getDatabase().getSchema(column.getTableSchema()); - DataTypeDefinition type = new DefaultDataTypeDefinition( + DefaultDataTypeDefinition type = new DefaultDataTypeDefinition( getDatabase(), schema, column.getDataType(), @@ -110,7 +110,8 @@ public class XMLTableDefinition extends AbstractTableDefinition { : "VIRTUAL".equalsIgnoreCase(column.getGenerationOption()) ? VIRTUAL : null - : null); + : null) + .hidden(column.isHidden()); result.add(new DefaultColumnDefinition( this, diff --git a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd index 19b6e28cc8..ea38683c26 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd @@ -1113,7 +1113,9 @@ This feature is available in the commercial distribution only.]]>< - + +This feature is available in the commercial distribution only.]]> diff --git a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java index 332c7ba11e..2c49995449 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java +++ b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java @@ -329,7 +329,7 @@ final class InformationSchemaExport { result.getViews().add(iv); } - Field[] fields = t.fields(); + Field[] fields = t.fieldsIncludingHidden().fields(); for (int i = 0; i < fields.length; i++) { Field f = fields[i]; DataType type = f.getDataType();