mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 05:01:07 +00:00
Add details about producing tableMetaData via @QMetaDataProducingEntity and customizers
This commit is contained in:
@ -288,33 +288,49 @@ all of the fields in you table in two places (the entity and the table meta-data
|
|||||||
If you are using `QRecordEntity` classes that correspond to your tables, then you can take advantage of some
|
If you are using `QRecordEntity` classes that correspond to your tables, then you can take advantage of some
|
||||||
additional annotations on those classes, to produce more related meta-data objects associated with those tables.
|
additional annotations on those classes, to produce more related meta-data objects associated with those tables.
|
||||||
The point of this is to eliminate boilerplate, and simplify / speed up the process of getting a new table
|
The point of this is to eliminate boilerplate, and simplify / speed up the process of getting a new table
|
||||||
built and deployed in your application, with some bells and whistles added.
|
built and deployed in your application.
|
||||||
|
|
||||||
|
Furthermore, the case can be made that it is beneficial to keep the meta-data definition for a table as close
|
||||||
|
as possible to the entity that corresponds to the table. This enables modifications to the table (e.g., adding
|
||||||
|
a new field/column) to only require edits in one java source file, rather than necessarily requiring edits
|
||||||
|
in two files.
|
||||||
|
|
||||||
=== @QMetaDataProducingEntity
|
=== @QMetaDataProducingEntity
|
||||||
This is an annotation to go on a QRecordEntity class, which you would like to be
|
This is an annotation meant to be placed on a `QRecordEntity` subclass, which you would like to be
|
||||||
processed by `MetaDataProducerHelper`, to automatically produce some meta-data
|
processed by an invocation of `MetaDataProducerHelper`, to automatically produce some meta-data
|
||||||
objects. Specifically supports:
|
objects.
|
||||||
|
|
||||||
* Making a possible-value-source out of the table.
|
This annotation supports:
|
||||||
|
|
||||||
|
* Creating table meta-data for the corresponding record entity table. Enabled by setting `produceTableMetaData=true`.
|
||||||
|
** One may customize the table meta data that is produced automatically by supplying a class that extends
|
||||||
|
`MetaDataCustomizerInterface` in the annotation attribute `tableMetaDataCustomizer`.
|
||||||
|
** In addition to (or as an alternative to) the per-table `MetaDataCustomizerInterface` that can be specified
|
||||||
|
in `@QMetaDataProducingEntity.tableMetaDataCustomzier`, when an application calls
|
||||||
|
`MetaDataProducerHelper.processAllMetaDataProducersInPackage`, an additional `MetaDataCustomizerInterface` can be
|
||||||
|
given, to apply a common set of adjustments to all tales being generated by the call.
|
||||||
|
* Making a possible-value-source out of the table. Enabled by setting `producePossibleValueSource=true`.
|
||||||
* Processing child tables to create joins and childRecordList widgets
|
* Processing child tables to create joins and childRecordList widgets
|
||||||
|
|
||||||
=== @ChildTable
|
=== @ChildTable
|
||||||
This is an annotation used as a value that goes inside a `@QMetadataProducingEntity` annotation, to define
|
This is an annotation used as a value that goes inside a `@QMetadataProducingEntity` annotation, to define
|
||||||
child-tables, e.g., for producing joins and childRecordList widgets related to the table defined in the entity class.
|
child-tables, e.g., for producing joins and childRecordList widgets related to the table defined in the entity class.
|
||||||
|
|
||||||
=== @ChildJoin
|
==== @ChildJoin
|
||||||
This is an annotation used as a value inside a `@ChildTable` inside a `@QMetadataProducingEntity` annotation,
|
This is an annotation used as a value inside a `@ChildTable` inside a `@QMetadataProducingEntity` annotation,
|
||||||
to control the generation of a `QJoinMetaData`, as a `ONE_TO_MANY` type join from the table represented by
|
to control the generation of a `QJoinMetaData`, as a `ONE_TO_MANY` type join from the table represented by
|
||||||
the annotated entity, to the table referenced in the `@ChildTable` annotation.
|
the annotated entity, to the table referenced in the `@ChildTable` annotation.
|
||||||
|
|
||||||
=== @ChildRecordListWidget
|
==== @ChildRecordListWidget
|
||||||
This is an annotation used as a value that goes inside a `@QMetadataProducingEntity` annotation, to control
|
This is an annotation used as a value that goes inside a `@QMetadataProducingEntity` annotation, to control
|
||||||
the generation of a QWidgetMetaData - for a ChildRecordList widget.
|
the generation of a QWidgetMetaData - for a ChildRecordList widget.
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
.QRecordEntity with meta-data producing annotations
|
.QRecordEntity with meta-data producing annotations and a table MetaDataCustomizer
|
||||||
----
|
----
|
||||||
@QMetaDataProducingEntity(
|
@QMetaDataProducingEntity(
|
||||||
|
produceTableMetaData = true,
|
||||||
|
tableMetaDataCustomizer = MyTable.TableMetaDataCustomizer.class,
|
||||||
producePossibleValueSource = true,
|
producePossibleValueSource = true,
|
||||||
childTables = {
|
childTables = {
|
||||||
@ChildTable(
|
@ChildTable(
|
||||||
@ -326,13 +342,47 @@ the generation of a QWidgetMetaData - for a ChildRecordList widget.
|
|||||||
public class MyTable extends QRecordEntity
|
public class MyTable extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "myTable";
|
public static final String TABLE_NAME = "myTable";
|
||||||
// class body left as exercise for reader
|
|
||||||
|
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table) throws QException
|
||||||
|
{
|
||||||
|
String childJoinName = QJoinMetaData.makeInferredJoinName(TABLE_NAME, MyChildTable.TABLE_NAME);
|
||||||
|
|
||||||
|
table
|
||||||
|
.withUniqueKey(new UniqueKey("name"))
|
||||||
|
.withIcon(new QIcon().withName("table_bar"))
|
||||||
|
.withRecordLabelFormat("%s")
|
||||||
|
.withRecordLabelFields("name")
|
||||||
|
|
||||||
|
.withSection(new QFieldSection("identity", new QIcon().withName("badge"), Tier.T1,
|
||||||
|
List.of("id", "name")))
|
||||||
|
// todo additional sections for other fields
|
||||||
|
.withSection(new QFieldSection("children", new QIcon().withName("account_tree"), Tier.T2)
|
||||||
|
.withWidgetName(childJoinName))
|
||||||
|
|
||||||
|
.withExposedJoin(new ExposedJoin()
|
||||||
|
.withLabel("Children")
|
||||||
|
.withJoinPath(List.of(childJoinName))
|
||||||
|
.withJoinTable(MyChildTable.TABLE_NAME));
|
||||||
|
|
||||||
|
return (table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
// remaining fields, constructors, getters & setters left as an exercise for the reader and/or the IDE
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
The class given in the example above, if processed by the `MetaDataProducerHelper`, would add the following
|
The class given in the example above, if processed by the `MetaDataProducerHelper`, would add the following
|
||||||
meta-data objects to your `QInstance`:
|
meta-data objects to your `QInstance`:
|
||||||
|
|
||||||
|
* A `QTableMetaData` named `myTable`, with all fields annotated as `@QField` from the `QRecordEntity` class,
|
||||||
|
and with additional attributes as set in the `TableMetaDataCustomizer` inner class.
|
||||||
* A `QPossibleValueSource` named `myTable`, of type `TABLE`, with `myTable` as its backing table.
|
* A `QPossibleValueSource` named `myTable`, of type `TABLE`, with `myTable` as its backing table.
|
||||||
* A `QJoinMetaData` named `myTableJoinMyChildTable`, as a `ONE_TO_MANY` type, between those two tables.
|
* A `QJoinMetaData` named `myTableJoinMyChildTable`, as a `ONE_TO_MANY` type, between those two tables.
|
||||||
* A `QWidgetMetaData` named `myTableJoinMyChildTable`, as a `CHILD_RECORD_LIST` type, that will show a list of
|
* A `QWidgetMetaData` named `myTableJoinMyChildTable`, as a `CHILD_RECORD_LIST` type, that will show a list of
|
||||||
|
Reference in New Issue
Block a user