fix: align the geo data QBit with QQQ 4.1
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 60e5a80ed7a5a67877bfb3e129b1929c83464b6e] (pull_request) Successful in 12s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 9s
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
Shared Java Maven CI / secrets (push) Successful in 56s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 1m0s
Shared Java Maven CI / gate (push) Canceled after 0s
Shared Java Maven CI / verify (push) Canceled after 0s
qrun-release / release (push) Canceled after 6m20s
qrun-release / postpublish (push) Canceled after 0s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Canceled after 0s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Canceled after 0s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Canceled after 31m29s
QRun-IO/ci-policy: ci / ci-result (pull_request) Canceled after 0s

Build against the published QQQ 4.1 core (qqq-bom-pom 4.1.0-RC.21). Mark
City, Country and StateProvince with produceTableMetaData and add the
setters QRecordEntity needs to discover their fields, and make the
producer tolerate a table without fields. Update the producer test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
James MaesandClaude Sonnet 5.5 committed 2026-11-05 05:44:20 -06:00
1 parent 6ac6a0366c
commit b5787bbe6b
6 files changed
+300 -3

No files matched your search

+9
View File
@@ -51,6 +51,7 @@
<properties>
<revision>0.1.0</revision>
<qqq.version>4.1.0-RC.21</qqq.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -58,6 +59,14 @@
<dependencyManagement>
<dependencies>
<!-- Published QQQ 4.1 core (minimum QQQ 4.1), imported ahead of the parent's BOM. -->
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-bom-pom</artifactId>
<version>${qqq.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
@@ -126,6 +126,10 @@ public class GeoDataQBitProducer implements QBitProducer
*******************************************************************************/
private void updateForeignKeyReferences(QTableMetaData table)
{
if(table.getFields() == null)
{
return;
}
table.getFields().values().forEach(field ->
{
if(field.getPossibleValueSourceName() != null)
@@ -14,7 +14,7 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
@QMetaDataProducingEntity(producePossibleValueSource = true)
@QMetaDataProducingEntity(produceTableMetaData = true, producePossibleValueSource = true)
public class City extends QRecordEntity
{
public static final String TABLE_NAME = "city";
@@ -204,4 +204,103 @@ public class City extends QRecordEntity
{
return modifyDate;
}
/*******************************************************************************
** Setter for id (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setId(Integer id)
{
this.id = id;
}
/*******************************************************************************
** Setter for stateProvinceId (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setStateProvinceId(Integer stateProvinceId)
{
this.stateProvinceId = stateProvinceId;
}
/*******************************************************************************
** Setter for name (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setName(String name)
{
this.name = name;
}
/*******************************************************************************
** Setter for asciiName (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setAsciiName(String asciiName)
{
this.asciiName = asciiName;
}
/*******************************************************************************
** Setter for population (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setPopulation(Integer population)
{
this.population = population;
}
/*******************************************************************************
** Setter for latitude (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setLatitude(BigDecimal latitude)
{
this.latitude = latitude;
}
/*******************************************************************************
** Setter for longitude (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setLongitude(BigDecimal longitude)
{
this.longitude = longitude;
}
/*******************************************************************************
** Setter for timezone (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setTimezone(String timezone)
{
this.timezone = timezone;
}
/*******************************************************************************
** Setter for isActive (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setIsActive(Boolean isActive)
{
this.isActive = isActive;
}
/*******************************************************************************
** Setter for createDate (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setCreateDate(Instant createDate)
{
this.createDate = createDate;
}
/*******************************************************************************
** Setter for modifyDate (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setModifyDate(Instant modifyDate)
{
this.modifyDate = modifyDate;
}
}
@@ -13,7 +13,7 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
@QMetaDataProducingEntity(producePossibleValueSource = true)
@QMetaDataProducingEntity(produceTableMetaData = true, producePossibleValueSource = true)
public class Country extends QRecordEntity
{
public static final String TABLE_NAME = "country";
@@ -171,4 +171,85 @@ public class Country extends QRecordEntity
{
return modifyDate;
}
/*******************************************************************************
** Setter for id (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setId(Integer id)
{
this.id = id;
}
/*******************************************************************************
** Setter for alpha2Code (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setAlpha2Code(String alpha2Code)
{
this.alpha2Code = alpha2Code;
}
/*******************************************************************************
** Setter for alpha3Code (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setAlpha3Code(String alpha3Code)
{
this.alpha3Code = alpha3Code;
}
/*******************************************************************************
** Setter for numericCode (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setNumericCode(Integer numericCode)
{
this.numericCode = numericCode;
}
/*******************************************************************************
** Setter for name (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setName(String name)
{
this.name = name;
}
/*******************************************************************************
** Setter for officialName (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setOfficialName(String officialName)
{
this.officialName = officialName;
}
/*******************************************************************************
** Setter for isActive (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setIsActive(Boolean isActive)
{
this.isActive = isActive;
}
/*******************************************************************************
** Setter for createDate (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setCreateDate(Instant createDate)
{
this.createDate = createDate;
}
/*******************************************************************************
** Setter for modifyDate (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setModifyDate(Instant modifyDate)
{
this.modifyDate = modifyDate;
}
}
@@ -13,7 +13,7 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
@QMetaDataProducingEntity(producePossibleValueSource = true)
@QMetaDataProducingEntity(produceTableMetaData = true, producePossibleValueSource = true)
public class StateProvince extends QRecordEntity
{
public static final String TABLE_NAME = "stateProvince";
@@ -155,4 +155,76 @@ public class StateProvince extends QRecordEntity
{
return modifyDate;
}
/*******************************************************************************
** Setter for id (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setId(Integer id)
{
this.id = id;
}
/*******************************************************************************
** Setter for countryId (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setCountryId(Integer countryId)
{
this.countryId = countryId;
}
/*******************************************************************************
** Setter for code (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setCode(String code)
{
this.code = code;
}
/*******************************************************************************
** Setter for name (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setName(String name)
{
this.name = name;
}
/*******************************************************************************
** Setter for subdivisionType (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setSubdivisionType(String subdivisionType)
{
this.subdivisionType = subdivisionType;
}
/*******************************************************************************
** Setter for isActive (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setIsActive(Boolean isActive)
{
this.isActive = isActive;
}
/*******************************************************************************
** Setter for createDate (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setCreateDate(Instant createDate)
{
this.createDate = createDate;
}
/*******************************************************************************
** Setter for modifyDate (QRecordEntity discovers a field only from a getter and setter pair).
*******************************************************************************/
public void setModifyDate(Instant modifyDate)
{
this.modifyDate = modifyDate;
}
}
@@ -78,6 +78,38 @@ class GeoDataQBitProducerTest
/*******************************************************************************
** The enabled entities produce their tables, on the configured backend, with the
** prefix; the possible value sources point at tables that exist. (On core 4.1 an
** entity annotation only produces a table when it asks for it.)
*******************************************************************************/
@Test
void testProduce_createsTablesAndPossibleValueSourcesPointAtThem() throws QException
{
QInstance qInstance = new QInstance();
qInstance.addBackend(new QBackendMetaData().withName("rdbms"));
new GeoDataQBitProducer()
.withConfig(new GeoDataQBitConfig().withBackendName("rdbms").withTableNamePrefix("geo")
.withEnableCountries(true).withEnableStateProvinces(true).withEnableCities(true))
.produce(qInstance, "geo");
assertThat(qInstance.getTables().keySet()).contains("geo_country", "geo_stateProvince", "geo_city");
assertThat(qInstance.getTable("geo_city").getBackendName()).isEqualTo("rdbms");
assertThat(qInstance.getTable("geo_country").getPrimaryKeyField()).isEqualTo("id");
assertThat(qInstance.getTable("geo_country").getFields().keySet()).contains("alpha2Code", "name", "isActive");
assertThat(qInstance.getTable("geo_city").getFields().keySet()).contains("name");
for(var pvs : qInstance.getPossibleValueSources().values())
{
if(pvs.getTableName() != null)
{
assertThat(qInstance.getTable(pvs.getTableName())).as(pvs.getName()).isNotNull();
}
}
}
/*******************************************************************************
** Test that producer stores config in QBit metadata.
*******************************************************************************/