From 149d78c236ad89f9a95e93fc80a264a308ab329e Mon Sep 17 00:00:00 2001 From: connoratrug Date: Mon, 30 Dec 2024 17:10:01 +0100 Subject: [PATCH 01/21] chore: create schema with petstore via profile loader --- .../molgenis/emx2/datamodels/DataModels.java | 3 +- .../applications/petstore/Category.csv | 7 +++++ .../_demodata/applications/petstore/Order.csv | 3 ++ data/_demodata/applications/petstore/Pet.csv | 9 ++++++ data/_demodata/applications/petstore/User.csv | 2 ++ .../65c0628c9e94414d877e4a51cf5dc3ac.jpg | Bin 0 -> 48588 bytes data/_models/specific/petstore.csv | 29 ++++++++++++++++++ data/_ontologies/Tag.csv | 12 ++++++++ data/_profiles/PetStore.yaml | 12 ++++++++ data/_settings/petstore/molgenis_members.csv | 6 ++++ data/_settings/petstore/molgenis_settings.csv | 2 ++ 11 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 data/_demodata/applications/petstore/Category.csv create mode 100644 data/_demodata/applications/petstore/Order.csv create mode 100644 data/_demodata/applications/petstore/Pet.csv create mode 100644 data/_demodata/applications/petstore/User.csv create mode 100644 data/_demodata/applications/petstore/_files/65c0628c9e94414d877e4a51cf5dc3ac.jpg create mode 100644 data/_models/specific/petstore.csv create mode 100644 data/_ontologies/Tag.csv create mode 100644 data/_profiles/PetStore.yaml create mode 100644 data/_settings/petstore/molgenis_members.csv create mode 100644 data/_settings/petstore/molgenis_settings.csv diff --git a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java index 8e2faca81f..e3b0608fac 100644 --- a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java +++ b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java @@ -25,7 +25,8 @@ public enum Profile { BEACON_V2("_profiles/BeaconV2.yaml"), GDI("_profiles/GDI.yaml"), SHARED_STAGING("_profiles/SharedStaging.yaml"), - IMAGE_TEST("_profiles/ImageTest.yaml"); + IMAGE_TEST("_profiles/ImageTest.yaml"), + PET_STORE("_profiles/PetStore.yaml"); public static boolean hasProfile(String nameOther) { return Arrays.stream(values()).anyMatch(profile -> profile.name().equals(nameOther)); diff --git a/data/_demodata/applications/petstore/Category.csv b/data/_demodata/applications/petstore/Category.csv new file mode 100644 index 0000000000..f99c56fd80 --- /dev/null +++ b/data/_demodata/applications/petstore/Category.csv @@ -0,0 +1,7 @@ +name +cat +dog +mouse +bird +ant +caterpillar \ No newline at end of file diff --git a/data/_demodata/applications/petstore/Order.csv b/data/_demodata/applications/petstore/Order.csv new file mode 100644 index 0000000000..fac070e2e8 --- /dev/null +++ b/data/_demodata/applications/petstore/Order.csv @@ -0,0 +1,3 @@ +orderId,pet,quantity,price,complete,status +ORDER:6fe7a528-2e97-48cc-91e6-a94c689b4919,pooky,1,9.99,true,delivered +ORDER:e27c852c-29e2-4459-bcf1-98d8907ff77b,spike,7,14.99,false,approved \ No newline at end of file diff --git a/data/_demodata/applications/petstore/Pet.csv b/data/_demodata/applications/petstore/Pet.csv new file mode 100644 index 0000000000..738f170a3d --- /dev/null +++ b/data/_demodata/applications/petstore/Pet.csv @@ -0,0 +1,9 @@ +name,category,photoUrls,tags,weight +pooky,cat,,,9.4 +tom,cat,,red,3.14 +sylvester,cat,,purple,1.337 +jerry,mouse,,blue,0.18 +tweety,bird,,red,0.1 +the very hungry caterpillar,caterpillar,,green,0.5 +spike,dog,,"red,green,species,mammals,carnivorous mammals,herbivorous mammals,birds,insect",15.7 +fire ant,ant,,"red,green,purple",0.01 \ No newline at end of file diff --git a/data/_demodata/applications/petstore/User.csv b/data/_demodata/applications/petstore/User.csv new file mode 100644 index 0000000000..97895294fb --- /dev/null +++ b/data/_demodata/applications/petstore/User.csv @@ -0,0 +1,2 @@ +username,firstName,lastName,picture,picture_filename,email,password,phone,userStatus,pets +bofke,"",,65c0628c9e94414d877e4a51cf5dc3ac,8hlbnm.jpg,,,,,"pooky,spike,the very hungry caterpillar,fire ant" \ No newline at end of file diff --git a/data/_demodata/applications/petstore/_files/65c0628c9e94414d877e4a51cf5dc3ac.jpg b/data/_demodata/applications/petstore/_files/65c0628c9e94414d877e4a51cf5dc3ac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d078be1453493aa1787bf349bb4219dc592a218 GIT binary patch literal 48588 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

Di;XPYfr-5&a! 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 1',,,,Petstore,, +Order,,,price,decimal,,,,,,,,,price >= 1,,,,Petstore,, +Order,,,complete,bool,,,,,,,,,,,,,Petstore,, +Order,,,status,,,,,,,,,hallo,,,,,Petstore,, +Pet,,,name,,1,true,,,,,,,,,,,Petstore,,the name +Pet,,,category,ref,,true,,Category,,,,,,,,,Petstore,, +Pet,,,photoUrls,string_array,,,,,,,,,,,,,Petstore,, +Pet,,,details,heading,,,,,,,,,,,,,Petstore,,Details +Pet,,,tags,ontology_array,,,,Tag,,,,,,,,,Petstore,, +Pet,,,weight,decimal,,true,,,,,,,,,,,Petstore,, +Pet,,,Heading2,heading,,,,,,,,,,,,,Petstore,, +Pet,,,orders,refback,,,,Order,,pet,,,,,,,Petstore,, +User,,,username,,1,true,,,,,,,,,,,Petstore,, +User,,,firstName,,,,,,,,,,,,,,Petstore,, +User,,,lastName,,,,,,,,,,,,,,Petstore,, +User,,,picture,file,,,,,,,,,,,,,Petstore,, +User,,,email,email,,,,,,,,,,,,,Petstore,, +User,,,password,,,,,,,,,,,,,,Petstore,, +User,,,phone,,,,,,,,,,,,,,Petstore,, +User,,,userStatus,int,,,,,,,,,,,,,Petstore,, +User,,,pets,ref_array,,,,Pet,,,,,,,,,Petstore,, \ No newline at end of file diff --git a/data/_ontologies/Tag.csv b/data/_ontologies/Tag.csv new file mode 100644 index 0000000000..8be6181acf --- /dev/null +++ b/data/_ontologies/Tag.csv @@ -0,0 +1,12 @@ +order,name,label,parent,codesystem,code,ontologyTermURI,definition +,colors,,,,,, +,red,,colors,,,, +,green,,colors,,,, +,blue,,colors,,,, +,purple,,colors,,,, +,species,,,,,, +,mammals,,species,,,, +,carnivorous mammals,,mammals,,,, +,herbivorous mammals,,mammals,,,, +,birds,,species,,,, +,insect,,species,,,, \ No newline at end of file diff --git a/data/_profiles/PetStore.yaml b/data/_profiles/PetStore.yaml new file mode 100644 index 0000000000..f4fb72977c --- /dev/null +++ b/data/_profiles/PetStore.yaml @@ -0,0 +1,12 @@ +--- +name: Pet store +description: "a demo schema" + +profileTags: Petstore + +demoData: _demodata/applications/petstore + +settings: + +# special options +setViewPermission: anonymous \ No newline at end of file diff --git a/data/_settings/petstore/molgenis_members.csv b/data/_settings/petstore/molgenis_members.csv new file mode 100644 index 0000000000..7032c4467e --- /dev/null +++ b/data/_settings/petstore/molgenis_members.csv @@ -0,0 +1,6 @@ +user,role +anonymous,Viewer +costumer,Range +shopmanager,Manager +shopowner,Owner +shopviewer,Viewer \ No newline at end of file diff --git a/data/_settings/petstore/molgenis_settings.csv b/data/_settings/petstore/molgenis_settings.csv new file mode 100644 index 0000000000..fb1d8a6d2f --- /dev/null +++ b/data/_settings/petstore/molgenis_settings.csv @@ -0,0 +1,2 @@ +table,key,value +,reports,"[{""id"":""report1"",""description"":""pet report"",""sql"":""select * from \""Pet\""""},{""id"":""report2"",""description"":""pet report with parameters"",""sql"":""select * from \""Pet\"" p where p.name=ANY(${name:string_array})""},{""id"":""report3"",""description"":""jsonb"",""sql"":""SELECT jsonb_agg(to_jsonb(\""Pet\"")) AS result FROM \""Pet\""""},{""id"":""report4"",""description"":""jsonb rows"",""sql"":""SELECT to_jsonb(\""Pet\"") AS result FROM \""Pet\""""}]" From 4294365bb27be0a703c3523b9586de2dac2ac612 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Mon, 30 Dec 2024 17:14:52 +0100 Subject: [PATCH 02/21] link settings --- data/_profiles/PetStore.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/_profiles/PetStore.yaml b/data/_profiles/PetStore.yaml index f4fb72977c..dabe432588 100644 --- a/data/_profiles/PetStore.yaml +++ b/data/_profiles/PetStore.yaml @@ -6,7 +6,7 @@ profileTags: Petstore demoData: _demodata/applications/petstore -settings: +settings: _settings/petstore # special options setViewPermission: anonymous \ No newline at end of file From 9927ed945b36c184781db4ea054fdfdc51fe6e83 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Wed, 8 Jan 2025 14:09:33 +0100 Subject: [PATCH 03/21] remove petStoreLoader --- .../molgenis/emx2/datamodels/DataModels.java | 1 - .../emx2/datamodels/PetStoreLoader.java | 233 ------------------ .../molgenis/emx2/graphql/TestSumQuery.java | 6 +- .../emx2/io/TestColumnTypeIsFile.java | 4 +- .../emx2/typescript/GeneratorTest.java | 5 +- .../org/molgenis/emx2/RunMolgenisEmx2.java | 3 +- 6 files changed, 9 insertions(+), 243 deletions(-) delete mode 100644 backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java diff --git a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java index e3b0608fac..d974360f86 100644 --- a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java +++ b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java @@ -49,7 +49,6 @@ public Task getImportTask(Schema schema, boolean includeDemoData) { public enum Regular { DIRECTORY(DirectoryLoader::new), - PET_STORE(PetStoreLoader::new), ERN_DASHBOARD(DashboardLoader::new), PROJECTMANAGER(ProjectManagerLoader::new), BIOBANK_DIRECTORY(BiobankDirectoryLoader::new), diff --git a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java deleted file mode 100644 index 177496a940..0000000000 --- a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java +++ /dev/null @@ -1,233 +0,0 @@ -package org.molgenis.emx2.datamodels; - -import static org.molgenis.emx2.Column.column; -import static org.molgenis.emx2.ColumnType.*; -import static org.molgenis.emx2.TableMetadata.table; - -import org.molgenis.emx2.*; -import org.molgenis.emx2.io.ImportDataModelTask; -import org.molgenis.emx2.sql.SqlDatabase; - -public class PetStoreLoader extends ImportDataModelTask { - - public static final String CATEGORY = "Category"; - public static final String TAG = "Tag"; - public static final String NAME = "name"; - public static final String PET = "Pet"; - public static final String ORDER = "Order"; - public static final String USER = "User"; - public static final String CATEGORY_COLUMN = "category"; - public static final String STATUS = "status"; - public static final String WEIGHT = "weight"; - public static final String ORDER_ID = "orderId"; - public static final String QUANTITY = "quantity"; - public static final String PRICE = "price"; - public static final String COMPLETE = "complete"; - public static final String EMAIL = "email"; - public static final String PARENT = "parent"; - public static final String COLORS = "colors"; - public static final String SPECIES = "species"; - public static final String MAMMALS = "mammals"; - - public PetStoreLoader(Schema schema, Boolean includeDemoData) { - super(schema, includeDemoData); - } - - @Override - public void run() { - this.start(); - getSchema().migrate(getSchemaMetadata()); - if (isIncludeDemoData()) { - loadExampleData(getSchema()); - } - this.complete(); - } - - public static SchemaMetadata getSchemaMetadata() { - SchemaMetadata schema = new SchemaMetadata(); - schema.create(table(CATEGORY).add(column(NAME).setPkey())); - - schema.create( - table(PET) - .add(column(NAME).setDescription("the name").setPkey()) - .add(column(CATEGORY_COLUMN).setType(REF).setRefTable(CATEGORY).setRequired(true)) - .add(column("photoUrls").setType(STRING_ARRAY)) - .add( - column("details") - .setType(HEADING) - .setDescription( - "Details")) // add a layout element, for now html formatting not allowed - .add(column(STATUS)) // todo enum: available, pending, sold - .add(column("tags").setType(ONTOLOGY_ARRAY).setRefTable(TAG)) - .add(column(WEIGHT).setType(DECIMAL).setRequired(true)) - .setDescription("My pet store example table")); - - schema.create( - table(ORDER) - .add(column(ORDER_ID).setPkey().setType(AUTO_ID).setComputed("ORDER:${mg_autoid}")) - .add(column("pet").setType(REF).setRefTable(PET)) - .add( - column(QUANTITY) - .setType(LONG) - .setValidation("if(quantity < 1) 'quantity should be >= 1'")) - .add(column(PRICE).setType(DECIMAL).setValidation("price >= 1")) - .add(column(COMPLETE).setType(BOOL)) // todo: default false - .add(column(STATUS))); // todo enum: placed, approved, delivered - - // refBack - schema - .getTableMetadata(PET) - .add(column("orders").setType(REFBACK).setRefTable(ORDER).setRefBack("pet")); - - schema.create( - table(USER) - .add(column("username").setPkey()) - .add(column("firstName")) - .add(column("lastName")) - .add(column("picture").setType(FILE)) - .add(column(EMAIL).setType(ColumnType.EMAIL)) - .add(column("password")) // todo: password type - .add(column("phone")) // todo: validation phone - .add(column("userStatus").setType(INT)) - .add(column("pets").setType(REF_ARRAY).setRefTable(PET))); - - return schema; - } - - private void loadExampleData(Schema schema) { - final String shopviewer = "shopviewer"; - final String shopmanager = "shopmanager"; - final String shopowner = "shopowner"; - final String costumer = "costumer"; - - // initialize users - if (!schema.getDatabase().hasUser(shopmanager)) { - schema.getDatabase().setUserPassword(shopmanager, shopmanager); - } - if (!schema.getDatabase().hasUser(shopviewer)) { - schema.getDatabase().setUserPassword(shopviewer, shopviewer); - } - if (!schema.getDatabase().hasUser(shopowner)) { - schema.getDatabase().setUserPassword(shopowner, shopowner); - } - if (!schema.getDatabase().hasUser(costumer)) { - schema.getDatabase().setUserPassword(costumer, costumer); - } - schema.addMember(shopmanager, "Manager"); - schema.addMember(shopviewer, "Viewer"); - schema.addMember(shopowner, "Owner"); - schema.addMember(costumer, "Range"); - - schema - .getTable(CATEGORY) - .insert( - new Row().set(NAME, "cat"), - new Row().set(NAME, "dog"), - new Row().set(NAME, "mouse"), - new Row().set(NAME, "bird"), - new Row().set(NAME, "ant"), - new Row().set(NAME, "caterpillar")); - schema - .getTable(TAG) - .insert( - new Row().set(NAME, COLORS), - new Row().set(NAME, "red").set(PARENT, COLORS), - new Row().set(NAME, "green").set(PARENT, COLORS), - new Row().set(NAME, "blue").set(PARENT, COLORS), - new Row().set(NAME, "purple").set(PARENT, COLORS), - new Row().set(NAME, SPECIES), - new Row().set(NAME, MAMMALS).set(PARENT, SPECIES), - new Row().set(NAME, "carnivorous mammals").set(PARENT, MAMMALS), - new Row().set(NAME, "herbivorous mammals").set(PARENT, MAMMALS), - new Row().set(NAME, "birds").set(PARENT, SPECIES), - new Row().set(NAME, "insect").set(PARENT, SPECIES)); - - schema - .getTable(PET) - .insert( - new Row() - .set(CATEGORY_COLUMN, "cat") - .set("name", "pooky") - .set(STATUS, "available") - .set(WEIGHT, 9.4), - new Row() - .set(CATEGORY_COLUMN, "dog") - .set("name", "spike") - .set(STATUS, "sold") - .set("tags", "red,green") - .set(WEIGHT, 15.7), - new Row() - .set(CATEGORY_COLUMN, "cat") - .set("name", "tom") - .set("tags", "red") - .set(STATUS, "available") - .set(WEIGHT, 3.14), - new Row() - .set(CATEGORY_COLUMN, "cat") - .set("name", "sylvester") - .set("tags", "purple") - .set(SPECIES, "carnivorous mammals") - .set(STATUS, "available") - .set(WEIGHT, 1.337), - new Row() - .set(CATEGORY_COLUMN, "mouse") - .set("name", "jerry") - .set("tags", "blue") - .set(STATUS, "available") - .set(WEIGHT, 0.18), - new Row() - .set(CATEGORY_COLUMN, "bird") - .set("name", "tweety") - .set("tags", "red") - .set(STATUS, "available") - .set(WEIGHT, 0.1), - new Row() - .set(CATEGORY_COLUMN, "caterpillar") - .set("name", "the very hungry caterpillar") - .set(STATUS, "available") - .set(SPECIES, "insect") - .set("tags", "green") - .set(WEIGHT, 0.5), - new Row() - .set(CATEGORY_COLUMN, "ant") - .set("name", "fire ant") - .set(STATUS, "available") - .set(SPECIES, "insect") - .set("tags", "purple,red,green") - .set(WEIGHT, 0.01)); - - schema - .getTable(ORDER) - .insert( - new Row() - .set("pet", "pooky") - .set(QUANTITY, 1l) - .set(PRICE, 9.99) - .set(COMPLETE, true) - .set(STATUS, "delivered"), - new Row() - .set("pet", "spike") - .set(PRICE, 14.99) - .set(QUANTITY, 7l) - .set(COMPLETE, false) - .set(STATUS, "approved")); - - schema - .getTable(USER) - .insert( - new Row() - .set("username", "bofke") - .set("pets", "spike,pooky,the very hungry caterpillar,fire ant")); - - schema.addMember(SqlDatabase.ANONYMOUS, Privileges.VIEWER.toString()); - - schema - .getMetadata() - .setSetting( - "reports", - "[{\"id\":\"report1\",\"description\":\"pet report\",\"sql\":\"select * from \\\"Pet\\\"\"}," - + "{\"id\":\"report2\",\"description\":\"pet report with parameters\",\"sql\":\"select * from \\\"Pet\\\" p where p.name=ANY(${name:string_array})\"}," - + "{\"id\":\"report3\",\"description\":\"jsonb\",\"sql\":\"SELECT jsonb_agg(to_jsonb(\\\"Pet\\\")) AS result FROM \\\"Pet\\\"\"}," - + "{\"id\":\"report4\",\"description\":\"jsonb rows\",\"sql\":\"SELECT to_jsonb(\\\"Pet\\\") AS result FROM \\\"Pet\\\"\"}]"); - } -} diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java index e8e7e7fdb1..6d3f5939f8 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java @@ -7,8 +7,6 @@ import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.SelectColumn.s; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.PetStoreLoader.COLORS; -import static org.molgenis.emx2.datamodels.PetStoreLoader.TAG; import static org.molgenis.emx2.sql.SqlQuery.SUM_FIELD; import com.fasterxml.jackson.core.JsonProcessingException; @@ -22,6 +20,10 @@ import org.molgenis.emx2.sql.TestDatabaseFactory; public class TestSumQuery { + + public static final String TAG = "Tag"; + public static final String COLORS = "colors"; + private static final String TEST_SUM_QUERY = "TestSumQuery"; static Database database; static Schema schema; diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java index a3253d2b36..b370f30e4b 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; -import org.molgenis.emx2.datamodels.PetStoreLoader; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.io.tablestore.TableStore; import org.molgenis.emx2.io.tablestore.TableStoreForCsvFile; import org.molgenis.emx2.io.tablestore.TableStoreForXlsxFile; @@ -30,7 +30,7 @@ public class TestColumnTypeIsFile { public static void setup() { database = TestDatabaseFactory.getTestDatabase(); schema = database.dropCreateSchema(SCHEMA_NAME); - new PetStoreLoader(schema, false).run(); + DataModels.Regular.PET_STORE.getImportTask(schema, false).run(); schema .getTable("User") diff --git a/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java b/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java index 2d0fb2901f..7689f1c4df 100644 --- a/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java +++ b/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import org.molgenis.emx2.Database; import org.molgenis.emx2.Schema; -import org.molgenis.emx2.datamodels.PetStoreLoader; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.datamodels.test.ProductComponentPartsExample; import org.molgenis.emx2.datamodels.test.SimpleTypeTestExample; import org.molgenis.emx2.sql.TestDatabaseFactory; @@ -30,8 +30,7 @@ void generateTypes() throws IOException { File f = new File(this.getClass().getClassLoader().getResource("generateTypes.ts").getFile()); Schema schema = db.dropCreateSchema(GeneratorTest.class.getSimpleName() + "-PetStore"); - PetStoreLoader petStoreLoader = new PetStoreLoader(schema, false); - petStoreLoader.run(); + DataModels.Regular.PET_STORE.getImportTask(schema, false).run(); new Generator().generate(schema, f.getPath()); // now compare generated with expected diff --git a/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java b/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java index fed59f427a..39ff1d6d75 100644 --- a/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java +++ b/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java @@ -5,7 +5,6 @@ import org.molgenis.emx2.datamodels.BiobankDirectoryLoader; import org.molgenis.emx2.datamodels.DataModels; -import org.molgenis.emx2.datamodels.PetStoreLoader; import org.molgenis.emx2.sql.SqlDatabase; import org.molgenis.emx2.utils.EnvironmentProperty; import org.molgenis.emx2.web.MolgenisWebservice; @@ -50,7 +49,7 @@ public static void main(String[] args) { if (!EXCLUDE_PETSTORE_DEMO && db.getSchema("pet store") == null) { Schema schema = db.createSchema("pet store"); - new PetStoreLoader(schema, true).run(); + DataModels.Profile.PET_STORE.getImportTask(schema, true).run(); } if (INCLUDE_CATALOGUE_DEMO && db.getSchema(CATALOGUE_DEMO) == null) { From 05bb614f124577f4db3d57a0c604eeb0a80b0aab Mon Sep 17 00:00:00 2001 From: connoratrug Date: Wed, 8 Jan 2025 15:13:34 +0100 Subject: [PATCH 04/21] use other enum --- .../emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java | 2 +- .../org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java | 2 +- .../java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java | 2 +- .../src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java | 2 +- .../molgenis/emx2/graphql/TestGraphqlAggregatePermission.java | 2 +- .../test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java | 2 +- .../src/test/java/org/molgenis/emx2/rdf/RDFTest.java | 2 +- .../java/org/molgenis/emx2/sql/TestAggregatePermission.java | 2 +- .../src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java | 2 +- .../src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java | 2 +- .../java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java | 2 +- .../src/test/java/org/molgenis/emx2/sql/TestValidation.java | 2 +- .../src/test/java/org.molgenis.emx2.web/RunWebApi.java | 2 +- .../src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java b/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java index 24c0e40449..e404f3d395 100644 --- a/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java +++ b/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import io.javalin.http.Context; import org.junit.jupiter.api.BeforeAll; diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java index a006ca973c..cb28e258f6 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.molgenis.emx2.ColumnType.STRING; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.graphql.GraphqlApiFactory.convertExecutionResultToJson; import static org.molgenis.emx2.sql.SqlDatabase.ADMIN_PW_DEFAULT; diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java index 2468d76e61..e4fdbd822c 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java @@ -6,7 +6,7 @@ import static org.molgenis.emx2.ColumnType.REF_ARRAY; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.graphql.GraphqlApiFactory.convertExecutionResultToJson; import static org.molgenis.emx2.sql.SqlDatabase.ANONYMOUS; import static org.molgenis.emx2.utils.TypeUtils.convertToCamelCase; diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java index f4a0bf7f6d..3535b88545 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.IOException; import java.util.List; diff --git a/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java b/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java index c916a3e262..8ddfc7c761 100644 --- a/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java +++ b/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.molgenis.emx2.Constants.ANONYMOUS; import static org.molgenis.emx2.Privileges.AGGREGATOR; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.graphql.GraphqlApiFactory.convertExecutionResultToJson; import com.fasterxml.jackson.databind.JsonNode; diff --git a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java index 61db49edc4..0438342ee9 100644 --- a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java +++ b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java @@ -1,7 +1,7 @@ package org.molgenis.emx2.rdf; import static org.junit.jupiter.api.Assertions.*; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.ByteArrayOutputStream; import java.io.InputStreamReader; diff --git a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java index dec3ecf5ea..cd65c44cba 100644 --- a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java +++ b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java @@ -4,7 +4,7 @@ import static org.molgenis.emx2.Column.column; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java index 5ac5eb2a2a..a6956ad461 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java @@ -4,7 +4,7 @@ import static org.molgenis.emx2.Constants.ANONYMOUS; import static org.molgenis.emx2.Privileges.AGGREGATOR; import static org.molgenis.emx2.SelectColumn.s; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.sql.SqlQuery.*; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java index 62a7b209a1..279b2ee2b8 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java @@ -8,7 +8,7 @@ import static org.molgenis.emx2.FilterBean.f; import static org.molgenis.emx2.FilterBean.or; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.util.List; import org.junit.jupiter.api.BeforeAll; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java index 4e3a1516ab..6eca12a7ff 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java @@ -9,7 +9,7 @@ import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.SelectColumn.s; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java index f4883b32fb..b0e1a6277a 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java @@ -1,7 +1,7 @@ package org.molgenis.emx2.sql; import static org.junit.jupiter.api.Assertions.*; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.util.List; import java.util.Map; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java index 07634d8b40..4389dbcfbd 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static org.molgenis.emx2.Row.row; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.IOException; import org.junit.jupiter.api.BeforeAll; diff --git a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java index d8e9a3776a..06a269a5c6 100644 --- a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java +++ b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java @@ -1,6 +1,6 @@ package org.molgenis.emx2.web; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import com.zaxxer.hikari.HikariDataSource; import java.io.IOException; diff --git a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java index d6682e4f90..3a666e12c0 100644 --- a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java +++ b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java @@ -14,7 +14,7 @@ import static org.molgenis.emx2.Operator.EQUALS; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.sql.SqlDatabase.ADMIN_PW_DEFAULT; import static org.molgenis.emx2.sql.SqlDatabase.ANONYMOUS; import static org.molgenis.emx2.web.Constants.*; From 3093ae294b02fa94d4487d4f8eb01fff971d5027 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Thu, 9 Jan 2025 15:11:09 +0100 Subject: [PATCH 05/21] update data and test to use profile --- .../molgenis/emx2/io/TestColumnTypeIsFile.java | 2 +- .../emx2/io/TestImportExportAllExamples.java | 8 -------- .../emx2/typescript/GeneratorTest.java | 2 +- data/_demodata/applications/petstore/Pet.csv | 18 +++++++++--------- data/_models/specific/petstore.csv | 1 + 5 files changed, 12 insertions(+), 19 deletions(-) diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java index b370f30e4b..669960f578 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java @@ -30,7 +30,7 @@ public class TestColumnTypeIsFile { public static void setup() { database = TestDatabaseFactory.getTestDatabase(); schema = database.dropCreateSchema(SCHEMA_NAME); - DataModels.Regular.PET_STORE.getImportTask(schema, false).run(); + DataModels.Profile.PET_STORE.getImportTask(schema, false).run(); schema .getTable("User") diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java index 6ef8aedc5f..3b5d00f5f6 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java @@ -10,7 +10,6 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; -import org.molgenis.emx2.datamodels.PetStoreLoader; import org.molgenis.emx2.datamodels.test.ArrayTypeTestExample; import org.molgenis.emx2.datamodels.test.ProductComponentPartsExample; import org.molgenis.emx2.datamodels.test.RefAndRefArrayTestExample; @@ -59,13 +58,6 @@ public void testProductComponentPartsExample() throws IOException { executeCompare(schema1); } - @Test - public void testPetStoreExample() throws IOException { - SchemaMetadata schema1 = new SchemaMetadata(prefix + "7"); - schema1.create(PetStoreLoader.getSchemaMetadata().getTables().toArray(new TableMetadata[0])); - executeCompare(schema1); - } - @Test public void testDefaultValuesMetadata() throws IOException { SchemaMetadata schema1 = new SchemaMetadata(prefix + "8"); diff --git a/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java b/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java index 7689f1c4df..356a272128 100644 --- a/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java +++ b/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java @@ -30,7 +30,7 @@ void generateTypes() throws IOException { File f = new File(this.getClass().getClassLoader().getResource("generateTypes.ts").getFile()); Schema schema = db.dropCreateSchema(GeneratorTest.class.getSimpleName() + "-PetStore"); - DataModels.Regular.PET_STORE.getImportTask(schema, false).run(); + DataModels.Profile.PET_STORE.getImportTask(schema, false).run(); new Generator().generate(schema, f.getPath()); // now compare generated with expected diff --git a/data/_demodata/applications/petstore/Pet.csv b/data/_demodata/applications/petstore/Pet.csv index 738f170a3d..59a85876c9 100644 --- a/data/_demodata/applications/petstore/Pet.csv +++ b/data/_demodata/applications/petstore/Pet.csv @@ -1,9 +1,9 @@ -name,category,photoUrls,tags,weight -pooky,cat,,,9.4 -tom,cat,,red,3.14 -sylvester,cat,,purple,1.337 -jerry,mouse,,blue,0.18 -tweety,bird,,red,0.1 -the very hungry caterpillar,caterpillar,,green,0.5 -spike,dog,,"red,green,species,mammals,carnivorous mammals,herbivorous mammals,birds,insect",15.7 -fire ant,ant,,"red,green,purple",0.01 \ No newline at end of file +name,category,photoUrls,status,tags,weight +pooky,cat,,available,,9.4 +spike,dog,,sold,"red,green",15.7 +tom,cat,,available,red,3.14 +sylvester,cat,,available,purple,1.337 +jerry,mouse,,available,blue,0.18 +tweety,bird,,available,red,0.1 +the very hungry caterpillar,caterpillar,,available,green,0.5 +fire ant,ant,,available,"purple,red,green",0.01 diff --git a/data/_models/specific/petstore.csv b/data/_models/specific/petstore.csv index e59c6f2ee5..984ee58474 100644 --- a/data/_models/specific/petstore.csv +++ b/data/_models/specific/petstore.csv @@ -14,6 +14,7 @@ Pet,,,name,,1,true,,,,,,,,,,,Petstore,,the name Pet,,,category,ref,,true,,Category,,,,,,,,,Petstore,, Pet,,,photoUrls,string_array,,,,,,,,,,,,,Petstore,, Pet,,,details,heading,,,,,,,,,,,,,Petstore,,Details +Pet,,,status,,,,,,,,,,,,,,Petstore,, Pet,,,tags,ontology_array,,,,Tag,,,,,,,,,Petstore,, Pet,,,weight,decimal,,true,,,,,,,,,,,Petstore,, Pet,,,Heading2,heading,,,,,,,,,,,,,Petstore,, From c7e64806fa70546c5cb06db27dafb285f20e0ba8 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Thu, 9 Jan 2025 16:06:47 +0100 Subject: [PATCH 06/21] add missing setup from petstore loader --- .../emx2/graphql/TestGraphqlSchemaFields.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java index e4fdbd822c..326b516064 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.sql.TestDatabaseFactory; import org.molgenis.emx2.tasks.Task; import org.molgenis.emx2.tasks.TaskService; @@ -40,8 +41,32 @@ public class TestGraphqlSchemaFields { @BeforeAll public static void setup() { database = TestDatabaseFactory.getTestDatabase(); + final String shopviewer = "shopviewer"; + final String shopmanager = "shopmanager"; + final String shopowner = "shopowner"; + final String costumer = "costumer"; + + // initialize users + if (!database.hasUser(shopmanager)) { + database.setUserPassword(shopmanager, shopmanager); + } + if (!database.hasUser(shopviewer)) { + database.setUserPassword(shopviewer, shopviewer); + } + if (!database.hasUser(shopowner)) { + database.setUserPassword(shopowner, shopowner); + } + if (!database.hasUser(costumer)) { + database.setUserPassword(costumer, costumer); + } schema = database.dropCreateSchema(schemaName); - PET_STORE.getImportTask(schema, true).run(); + schema.addMember(shopmanager, "Manager"); + schema.addMember(shopviewer, "Viewer"); + schema.addMember(shopowner, "Owner"); + schema.addMember(costumer, "Range"); + DataModels.getImportTask(schema, PET_STORE.name(), true).run(); + schema = database.getSchema(schemaName); + taskService = new TaskServiceInMemory(); grapql = new GraphqlApiFactory().createGraphqlForSchema(schema, taskService); } From b76d7c911433164c5a84952780346a1f0e22eab4 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Thu, 9 Jan 2025 16:21:56 +0100 Subject: [PATCH 07/21] always set pw --- .../emx2/graphql/TestGraphqlSchemaFields.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java index 326b516064..da76a8685e 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java @@ -47,18 +47,11 @@ public static void setup() { final String costumer = "costumer"; // initialize users - if (!database.hasUser(shopmanager)) { - database.setUserPassword(shopmanager, shopmanager); - } - if (!database.hasUser(shopviewer)) { - database.setUserPassword(shopviewer, shopviewer); - } - if (!database.hasUser(shopowner)) { - database.setUserPassword(shopowner, shopowner); - } - if (!database.hasUser(costumer)) { - database.setUserPassword(costumer, costumer); - } + database.setUserPassword(shopmanager, shopmanager); + database.setUserPassword(shopviewer, shopviewer); + database.setUserPassword(shopowner, shopowner); + database.setUserPassword(costumer, costumer); + schema = database.dropCreateSchema(schemaName); schema.addMember(shopmanager, "Manager"); schema.addMember(shopviewer, "Viewer"); From c6c821306e8327bdad17cc0d16b802f98cb1e3b6 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Thu, 9 Jan 2025 17:00:56 +0100 Subject: [PATCH 08/21] fix test --- .../src/test/java/org/molgenis/emx2/rdf/RDFTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java index cd65c44cba..4339b6c865 100644 --- a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java +++ b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java @@ -4,7 +4,6 @@ import static org.molgenis.emx2.Column.column; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.ByteArrayOutputStream; import java.io.File; @@ -37,6 +36,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.sql.TestDatabaseFactory; public class RDFTest { @@ -89,8 +89,8 @@ public static void setup() { database = TestDatabaseFactory.getTestDatabase(); petStore_nr1 = database.dropCreateSchema("petStoreNr1"); petStore_nr2 = database.dropCreateSchema("petStoreNr2"); - PET_STORE.getImportTask(petStore_nr1, true).run(); - PET_STORE.getImportTask(petStore_nr2, true).run(); + DataModels.Profile.PET_STORE.getImportTask(petStore_nr1, false).run(); + DataModels.Profile.PET_STORE.getImportTask(petStore_nr2, false).run(); petStoreSchemas = List.of(petStore_nr1, petStore_nr2); // Test schema for composite keys From 46d11bd9f23d6903a65349dbaeb38facf2e5c292 Mon Sep 17 00:00:00 2001 From: connoratrug Date: Fri, 10 Jan 2025 11:01:11 +0100 Subject: [PATCH 09/21] wip debug failing test --- .../org/molgenis/emx2/RunMolgenisEmx2.java | 14 ++++++++++-- .../WebApiSmokeTests.java | 22 ++++++++++++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java b/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java index 39ff1d6d75..f22006a511 100644 --- a/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java +++ b/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java @@ -30,8 +30,18 @@ public class RunMolgenisEmx2 { public static void main(String[] args) { logger.info("Starting MOLGENIS EMX2 Software Version=" + Version.getVersion()); - Integer port = - (Integer) EnvironmentProperty.getParameter(Constants.MOLGENIS_HTTP_PORT, "8080", INT); + Integer port = 8080; + if (args.length >= 1) { + try { + port = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + logger.error("Port number should be an integer, but was: " + args[0]); + System.exit(1); + } + } else { + port = (Integer) EnvironmentProperty.getParameter(Constants.MOLGENIS_HTTP_PORT, "8080", INT); + } + logger.info( "with " + org.molgenis.emx2.Constants.MOLGENIS_HTTP_PORT diff --git a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java index 3a666e12c0..85b4610cac 100644 --- a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java +++ b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java @@ -1,6 +1,5 @@ package org.molgenis.emx2.web; -import static com.github.stefanbirkner.systemlambda.SystemLambda.withEnvironmentVariable; import static io.restassured.RestAssured.given; import static io.restassured.RestAssured.when; import static org.hamcrest.CoreMatchers.equalTo; @@ -8,7 +7,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.molgenis.emx2.Column.column; import static org.molgenis.emx2.ColumnType.STRING; -import static org.molgenis.emx2.Constants.MOLGENIS_HTTP_PORT; import static org.molgenis.emx2.Constants.SYSTEM_SCHEMA; import static org.molgenis.emx2.FilterBean.f; import static org.molgenis.emx2.Operator.EQUALS; @@ -64,9 +62,7 @@ public static void before() throws Exception { db = TestDatabaseFactory.getTestDatabase(); // start web service for testing, including env variables - withEnvironmentVariable(MOLGENIS_HTTP_PORT, "" + PORT) - // disable because of parallelism issues .and(MOLGENIS_INCLUDE_CATALOGUE_DEMO, "true") - .execute(() -> RunMolgenisEmx2.main(new String[] {})); + RunMolgenisEmx2.main(new String[] {String.valueOf(PORT)}); // set default rest assured settings RestAssured.port = PORT; @@ -112,6 +108,7 @@ public static void after() { } @Test + @Disabled public void testApiRoot() { String result = given() @@ -126,6 +123,7 @@ public void testApiRoot() { } @Test + @Disabled public void testCsvApi_zipUploadDownload() throws IOException { // get original schema String schemaCsv = @@ -162,6 +160,7 @@ public void testCsvApi_zipUploadDownload() throws IOException { } @Test + @Disabled public void testReports() throws IOException { // create a new schema for report Schema schema = db.dropCreateSchema("pet store reports"); @@ -252,6 +251,7 @@ public void testReports() throws IOException { } @Test + @Disabled public void testCsvApi_csvTableMetadataUpdate() throws IOException { // fresh schema for testing @@ -322,6 +322,7 @@ private void addUpdateTableAndCompare(String header, String tableMeta, String ex } @Test + @Disabled public void testCsvApi_csvUploadDownload() throws IOException { // create a new schema for complete csv data round trip db.dropCreateSchema(CSV_TEST_SCHEMA); @@ -391,6 +392,7 @@ private String[] toSortedArray(String string) { } @Test + @Disabled public void testCsvApi_tableFilter() { String result = given() @@ -443,6 +445,7 @@ private byte[] getContentAsByteArray(String fileType, String path) { } @Test + @Disabled public void testJsonYamlApi() { String schemaJson = given().sessionId(SESSION_ID).when().get("/pet store/api/json").asString(); @@ -499,6 +502,7 @@ public void testJsonYamlApi() { } @Test + @Disabled public void testExcelApi() throws IOException, InterruptedException { // download json schema @@ -582,6 +586,7 @@ private File createTempFile(byte[] zipContents, String extension) throws IOExcep } @Test + @Disabled public void testCsvApi_tableCsvUploadDownload() { String path = "/pet store/api/csv/Tag"; @@ -602,6 +607,7 @@ public void testCsvApi_tableCsvUploadDownload() { } @Test + @Disabled public void testGraphqlApi() { String path = "/api/graphql"; @@ -712,6 +718,7 @@ public void testGraphqlApi() { } @Test + @Disabled public void testBootstrapThemeService() { // should success String css = given().when().get("/pet store/tables/theme.css?primaryColor=123123").asString(); @@ -723,6 +730,7 @@ public void testBootstrapThemeService() { } @Test + @Disabled public void testMolgenisWebservice_redirectToFirstMenuItem() { given() .redirects() @@ -782,6 +790,7 @@ public void testMolgenisWebservice_redirectToFirstMenuItem() { } @Test + @Disabled public void testTokenBasedAuth() throws JsonProcessingException { // check if we can use temporary token @@ -866,11 +875,13 @@ public void testTokenBasedAuth() throws JsonProcessingException { } @Test + @Disabled public void testMolgenisWebservice_robotsDotTxt() { when().get("/robots.txt").then().statusCode(200).body(equalTo("User-agent: *\nAllow: /")); } @Test + @Disabled public void testRdfApiRequest() { final String urlPrefix = "http://localhost:" + PORT; @@ -917,6 +928,7 @@ public void testRdfApiRequest() { } @Test + @Disabled void testRdfApiContent() { // Output from global API call. String resultBase = From 019726914a8f7ed056d9332188e78da4c4e6aa91 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 15:29:26 +0100 Subject: [PATCH 10/21] fixes to make csv and json based import/export equivalent --- .../src/components/forms/RowEdit.vue | 2 +- .../java/org/molgenis/emx2/json/Column.java | 9 ++- .../java/org/molgenis/emx2/json/Table.java | 4 +- .../java/org/molgenis/emx2/sql/SqlSchema.java | 64 +++---------------- .../WebApiSmokeTests.java | 23 ++----- .../HasLabelsDescriptionsAndSettings.java | 3 - 6 files changed, 27 insertions(+), 78 deletions(-) diff --git a/apps/molgenis-components/src/components/forms/RowEdit.vue b/apps/molgenis-components/src/components/forms/RowEdit.vue index 3d62170d2d..ac264efb13 100644 --- a/apps/molgenis-components/src/components/forms/RowEdit.vue +++ b/apps/molgenis-components/src/components/forms/RowEdit.vue @@ -188,7 +188,7 @@ export default { equals: await convertRowToPrimaryKey( this.internalValues[changedColumn.id], overlappingKey.refTableId, - overlappingKey.refSchemaId + overlappingKey.refSchemaId || this.schemaMetaData.schemaId ), }, }; diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java index c308a1e70e..cd3676ae3a 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java @@ -60,6 +60,7 @@ public Column(org.molgenis.emx2.Column column, TableMetadata table, boolean mini this.name = column.getName(); this.labels = column.getLabels().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.oldName = column.getOldName(); @@ -70,11 +71,13 @@ public Column(org.molgenis.emx2.Column column, TableMetadata table, boolean mini } if (column.isReference()) { if (column.getSchema().getDatabase() != null) { + if (!column.getRefSchemaName().equals(column.getSchemaName())) { + this.refSchemaId = column.getRefSchemaName(); + this.refSchemaName = column.getRefSchemaName(); + } this.refTableId = column.getRefTable().getIdentifier(); this.refLabelDefault = column.getRefLabelDefault(); } - this.refSchemaId = column.getRefSchemaName(); - this.refSchemaName = column.getRefSchemaName(); this.refTableName = column.getRefTableName(); if (column.getRefLinkColumn() != null) { if (column.getTable().getSchema().getDatabase() != null) { @@ -101,6 +104,7 @@ public Column(org.molgenis.emx2.Column column, TableMetadata table, boolean mini this.defaultValue = column.getDefaultValue(); this.descriptions = column.getDescriptions().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.semantics = column.getSemantics(); @@ -141,6 +145,7 @@ public org.molgenis.emx2.Column getColumnMetadata(TableMetadata tm) { c.setVisible(visible); c.setComputed(computed); c.setReadonly(readonly); + c.setProfiles(profiles); // ignore inherited return c; diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java index a40a151a00..e1cac03f74 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java @@ -41,6 +41,7 @@ public Table(TableMetadata tableMetadata, boolean minimal) { this.description = tableMetadata.getDescription(); this.labels = tableMetadata.getLabels().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.id = tableMetadata.getIdentifier(); @@ -52,6 +53,7 @@ public Table(TableMetadata tableMetadata, boolean minimal) { } this.descriptions = tableMetadata.getDescriptions().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.semantics = tableMetadata.getSemantics(); @@ -59,8 +61,6 @@ public Table(TableMetadata tableMetadata, boolean minimal) { tableMetadata.getSettings().entrySet().stream() .map(entry -> new Setting(entry.getKey(), entry.getValue())) .toList(); - this.schemaName = tableMetadata.getSchemaName(); - this.schemaId = tableMetadata.getSchema().getName(); // todo? getIdentifier? for (org.molgenis.emx2.Column column : tableMetadata.getColumns()) { this.columns.add(new Column(column, tableMetadata, minimal)); } diff --git a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java index 6376c7dbb9..44d5cb27c3 100644 --- a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java +++ b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java @@ -183,60 +183,16 @@ public void tx(Transaction transaction) { @Override public void discard(SchemaMetadata discardSchema) { - // check if all tables and columns are known - List errors = new ArrayList<>(); - for (TableMetadata discardTable : discardSchema.getTables()) { - TableMetadata existingTable = getMetadata().getTableMetadata(discardTable.getTableName()); - if (existingTable == null) { - errors.add("Table '" + discardTable.getTableName() + " not found"); - } else { - for (String discardColumn : discardTable.getLocalColumnNames()) { - if (!existingTable.getLocalColumnNames().contains(discardColumn)) - errors.add( - "Column '" + discardTable.getTableName() + "." + discardColumn + " not found"); - } - } - } - if (!errors.isEmpty()) { - throw new MolgenisException( - "Discard failed: Discard of tables out of schema " - + getMetadata().getName() - + " failed: " - + String.join("\n", errors)); - } - - // get all tables, sorted and use that as scaffold - tx(db -> discardTransaction((SqlDatabase) db, discardSchema.getName())); - this.getDatabase().getListener().schemaChanged(this.getName()); - } - - private static void discardTransaction(SqlDatabase db, String schemaName) { - Schema schema = db.getSchema(schemaName); - SchemaMetadata schemaMetadata = db.getSchema(schemaName).getMetadata(); - List tables = schemaMetadata.getTables(); - Collections.reverse(tables); - - // remove whole tables unless columns attached - for (TableMetadata existingTable : tables) { - // if no coluns then we delete whole table - if (schemaMetadata.getTableMetadata(existingTable.getTableName()) != null) { - TableMetadata discardTable = schemaMetadata.getTableMetadata(existingTable.getTableName()); - if (discardTable.getLocalColumnNames().isEmpty() - || discardTable - .getLocalColumnNames() - .containsAll(existingTable.getLocalColumnNames())) { - schema.dropTable(existingTable.getTableName()); - MetadataUtils.deleteTable(db.getJooq(), existingTable); - } else { - // or column names - for (String discardColumn : discardTable.getLocalColumnNames()) { - Column existingColumn = existingTable.getColumn(discardColumn); - existingTable.dropColumn(discardColumn); - MetadataUtils.deleteColumn(db.getJooq(), existingColumn); - } - } - } - } + // use migrate + SchemaMetadata mergeSchema = new SchemaMetadata(discardSchema); + mergeSchema + .getTables() + .forEach( + t -> { + t.drop(); + t.getColumns().forEach(c -> c.drop()); + }); + migrate(mergeSchema); } @Override diff --git a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java index 85b4610cac..4264a5496a 100644 --- a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java +++ b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java @@ -46,6 +46,8 @@ public class WebApiSmokeTests { public static final String DATA_PET_STORE = "/pet store/api/csv"; public static final String PET_SHOP_OWNER = "pet_shop_owner"; + public static final String PET_SHOP_VIEWER = "shopviewer"; + public static final String PET_SHOP_MANAGER = "shopmanager"; public static final String SYSTEM_PREFIX = "/" + SYSTEM_SCHEMA; public static final String TABLE_WITH_SPACES = "table with spaces"; public static final String PET_STORE_SCHEMA = "pet store"; @@ -91,6 +93,11 @@ public static void before() throws Exception { PET_STORE.getImportTask(schema, true).run(); // grant a user permission + db.setUserPassword(PET_SHOP_OWNER, PET_SHOP_OWNER); + db.setUserPassword(PET_SHOP_VIEWER, PET_SHOP_VIEWER); + db.setUserPassword(PET_SHOP_MANAGER, PET_SHOP_MANAGER); + schema.addMember(PET_SHOP_MANAGER, Privileges.MANAGER.toString()); + schema.addMember(PET_SHOP_VIEWER, Privileges.VIEWER.toString()); schema.addMember(PET_SHOP_OWNER, Privileges.OWNER.toString()); schema.addMember(ANONYMOUS, Privileges.VIEWER.toString()); db.grantCreateSchema(PET_SHOP_OWNER); @@ -108,7 +115,6 @@ public static void after() { } @Test - @Disabled public void testApiRoot() { String result = given() @@ -123,7 +129,6 @@ public void testApiRoot() { } @Test - @Disabled public void testCsvApi_zipUploadDownload() throws IOException { // get original schema String schemaCsv = @@ -160,7 +165,6 @@ public void testCsvApi_zipUploadDownload() throws IOException { } @Test - @Disabled public void testReports() throws IOException { // create a new schema for report Schema schema = db.dropCreateSchema("pet store reports"); @@ -251,7 +255,6 @@ public void testReports() throws IOException { } @Test - @Disabled public void testCsvApi_csvTableMetadataUpdate() throws IOException { // fresh schema for testing @@ -322,7 +325,6 @@ private void addUpdateTableAndCompare(String header, String tableMeta, String ex } @Test - @Disabled public void testCsvApi_csvUploadDownload() throws IOException { // create a new schema for complete csv data round trip db.dropCreateSchema(CSV_TEST_SCHEMA); @@ -392,7 +394,6 @@ private String[] toSortedArray(String string) { } @Test - @Disabled public void testCsvApi_tableFilter() { String result = given() @@ -445,7 +446,6 @@ private byte[] getContentAsByteArray(String fileType, String path) { } @Test - @Disabled public void testJsonYamlApi() { String schemaJson = given().sessionId(SESSION_ID).when().get("/pet store/api/json").asString(); @@ -502,7 +502,6 @@ public void testJsonYamlApi() { } @Test - @Disabled public void testExcelApi() throws IOException, InterruptedException { // download json schema @@ -586,7 +585,6 @@ private File createTempFile(byte[] zipContents, String extension) throws IOExcep } @Test - @Disabled public void testCsvApi_tableCsvUploadDownload() { String path = "/pet store/api/csv/Tag"; @@ -607,7 +605,6 @@ public void testCsvApi_tableCsvUploadDownload() { } @Test - @Disabled public void testGraphqlApi() { String path = "/api/graphql"; @@ -718,7 +715,6 @@ public void testGraphqlApi() { } @Test - @Disabled public void testBootstrapThemeService() { // should success String css = given().when().get("/pet store/tables/theme.css?primaryColor=123123").asString(); @@ -730,7 +726,6 @@ public void testBootstrapThemeService() { } @Test - @Disabled public void testMolgenisWebservice_redirectToFirstMenuItem() { given() .redirects() @@ -790,7 +785,6 @@ public void testMolgenisWebservice_redirectToFirstMenuItem() { } @Test - @Disabled public void testTokenBasedAuth() throws JsonProcessingException { // check if we can use temporary token @@ -875,13 +869,11 @@ public void testTokenBasedAuth() throws JsonProcessingException { } @Test - @Disabled public void testMolgenisWebservice_robotsDotTxt() { when().get("/robots.txt").then().statusCode(200).body(equalTo("User-agent: *\nAllow: /")); } @Test - @Disabled public void testRdfApiRequest() { final String urlPrefix = "http://localhost:" + PORT; @@ -928,7 +920,6 @@ public void testRdfApiRequest() { } @Test - @Disabled void testRdfApiContent() { // Output from global API call. String resultBase = diff --git a/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java b/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java index 93fc64c9ab..35a75c798c 100644 --- a/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java +++ b/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java @@ -29,9 +29,6 @@ public T setLabel(String label) { public T setLabel(String label, String locale) { Objects.requireNonNull(locale); - if (label == null || label.trim().equals("")) { - this.labels.remove(locale); - } this.labels.put(locale, label); return (T) this; } From 4d1499cb532dd7974df7475a6bfe57104c123f04 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 16:37:08 +0100 Subject: [PATCH 11/21] add missing fix --- .../molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java index ca27d09477..8d9c33f8cd 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java @@ -55,11 +55,7 @@ public void test() throws IOException { } @Test - void testCrossSchemaTablesAreInSchemaEndpoint() throws IOException { - String result = - execute("{_schema{tables{name,id,schemaName,schemaId}}}").at("/_schema").toString(); - assertTrue(result.contains(schemaName2)); - + void testThatSeemingSelfReferenceWorksFix4264() throws IOException { // test that seemingly self reference works // when table name in schema1 and schema2 have same name // test fix https://github.com/molgenis/molgenis-emx2/issues/4264 From 3ff79c94a6a55633c161911bd4f5d1a035afa46d Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 19:50:27 +0100 Subject: [PATCH 12/21] remove unnecessary schemaid/name filter --- apps/schema/src/utils.ts | 10 ++-------- apps/tables/src/components/ListTables.vue | 22 +++++++++------------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/apps/schema/src/utils.ts b/apps/schema/src/utils.ts index 57de62252e..078cc4a5f7 100644 --- a/apps/schema/src/utils.ts +++ b/apps/schema/src/utils.ts @@ -63,10 +63,7 @@ export function addOldNamesAndRemoveMeta(rawSchema: any) { //normal tables let tables = !schema.tables ? [] - : schema.tables.filter( - (table) => - table.tableType !== "ONTOLOGIES" && table.schemaName === schema.name - ); + : schema.tables.filter((table) => table.tableType !== "ONTOLOGIES"); tables.forEach((t) => { t.oldName = t.name; if (t.columns) { @@ -83,10 +80,7 @@ export function addOldNamesAndRemoveMeta(rawSchema: any) { }); schema.ontologies = !schema.tables ? [] - : schema.tables.filter( - (table) => - table.tableType === "ONTOLOGIES" && table.schemaName === schema.name - ); + : schema.tables.filter((table) => table.tableType === "ONTOLOGIES"); //set old name so we can delete them properly schema.ontologies.forEach((o) => { o.oldName = o.name; diff --git a/apps/tables/src/components/ListTables.vue b/apps/tables/src/components/ListTables.vue index 67171c7f74..7e23a9e3cf 100644 --- a/apps/tables/src/components/ListTables.vue +++ b/apps/tables/src/components/ListTables.vue @@ -63,20 +63,16 @@ export default { } if (this.search && this.search.trim().length > 0) { let terms = this.search.toLowerCase().split(" "); - return this.schema.tables - .filter((table) => table.schemaId === this.schema.id) - .filter((table) => - terms.every( - (term) => - table.label.toLowerCase().includes(term) || - (table.description && - table.description.toLowerCase().includes(term)) - ) - ); - } else { - return this.schema.tables.filter( - (table) => table.schemaId === this.schema.id + return this.schema.tables.filter((table) => + terms.every( + (term) => + table.label.toLowerCase().includes(term) || + (table.description && + table.description.toLowerCase().includes(term)) + ) ); + } else { + return this.schema.tables; } }, tables() { From bb7f8969f6a920832434032535333698fe6b3961 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 20:30:24 +0100 Subject: [PATCH 13/21] remove unnecessary schemaid/name filter --- apps/tailwind-components/composables/fetchTableData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tailwind-components/composables/fetchTableData.ts b/apps/tailwind-components/composables/fetchTableData.ts index 7b8e03310b..38522c4876 100644 --- a/apps/tailwind-components/composables/fetchTableData.ts +++ b/apps/tailwind-components/composables/fetchTableData.ts @@ -69,7 +69,7 @@ export const getColumnIds = async ( const metaData = await fetchMetadata(schemaId); const columns = metaData.tables.find( - (table) => table.id === tableId && table.schemaId === schemaId + (table) => table.id === tableId )?.columns || []; let gqlFields = ""; From 758e839b24ca63f24c88e9298cea502b79a3b4ab Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 21:09:12 +0100 Subject: [PATCH 14/21] remove table.schemaName and table.schemaId from interfaces --- apps/molgenis-components/src/client/client.ts | 2 -- apps/schema/src/utils.ts | 2 -- apps/tables/src/App.vue | 2 +- apps/ui/pages/[schema]/index.vue | 2 +- .../graphql/GraphqlSchemaFieldFactory.java | 12 ------------ .../java/org/molgenis/emx2/json/Schema.java | 1 - .../java/org/molgenis/emx2/json/Table.java | 18 ------------------ 7 files changed, 2 insertions(+), 37 deletions(-) diff --git a/apps/molgenis-components/src/client/client.ts b/apps/molgenis-components/src/client/client.ts index af45bca358..10d9db17bc 100644 --- a/apps/molgenis-components/src/client/client.ts +++ b/apps/molgenis-components/src/client/client.ts @@ -167,12 +167,10 @@ const metadataQuery = `{ _schema { id, tables { - schemaId, id, label, description, tableType, - schemaId, semantics, columns { id, diff --git a/apps/schema/src/utils.ts b/apps/schema/src/utils.ts index 078cc4a5f7..abf9df93bd 100644 --- a/apps/schema/src/utils.ts +++ b/apps/schema/src/utils.ts @@ -11,7 +11,6 @@ export const schemaQuery = gql` name tables { name - schemaName tableType inheritName labels { @@ -199,7 +198,6 @@ export function addTableIdsLabelsDescription(originalTable: ITableMetaData) { table.id = convertToPascalCase(table.name); table.label = getLocalizedLabel(table); table.description = getLocalizedDescription(table, "en"); - table.schemaId = table.schemaName; table.inheritId = convertToPascalCase(table.inheritName); table.columns = table.columns.map((column) => { column.id = convertToCamelCase(column.name); diff --git a/apps/tables/src/App.vue b/apps/tables/src/App.vue index ae4077c5b2..ffbff26043 100644 --- a/apps/tables/src/App.vue +++ b/apps/tables/src/App.vue @@ -43,7 +43,7 @@ export default { this.error = null; request( "graphql", - "{_schema{id,label,tables{id,label,tableType,schemaId,description,columns{id,label,columnType,key,refTableId,required,description}}}}" + "{_schema{id,label,tables{id,label,tableType,description,columns{id,label,columnType,key,refTableId,required,description}}}}" ) .then((data) => { this.schema = data._schema; diff --git a/apps/ui/pages/[schema]/index.vue b/apps/ui/pages/[schema]/index.vue index 16a042905d..7c3abf050f 100644 --- a/apps/ui/pages/[schema]/index.vue +++ b/apps/ui/pages/[schema]/index.vue @@ -26,7 +26,7 @@ const { data } = await useFetch>(`/${schema}/graphql`, { key: "databases", method: "POST", body: { - query: `{_schema{id,label,tables{id,label,tableType,schemaId,description}}}`, + query: `{_schema{id,label,tables{id,label,tableType,description}}}`, }, }); diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java index 749df2d313..9748569f60 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java @@ -282,14 +282,6 @@ public class GraphqlSchemaFieldFactory { GraphQLFieldDefinition.newFieldDefinition() .name(GraphqlConstants.ID) .type(Scalars.GraphQLString)) - .field( - GraphQLFieldDefinition.newFieldDefinition() - .name(GraphqlConstants.SCHEMA_NAME) - .type(Scalars.GraphQLString)) - .field( - GraphQLFieldDefinition.newFieldDefinition() - .name(GraphqlConstants.SCHEMA_ID) - .type(Scalars.GraphQLString)) .field( GraphQLFieldDefinition.newFieldDefinition() .name(GraphqlConstants.INHERIT_NAME) @@ -481,10 +473,6 @@ public class GraphqlSchemaFieldFactory { GraphQLInputObjectField.newInputObjectField() .name(TABLE_TYPE) .type(Scalars.GraphQLString)) - .field( - GraphQLInputObjectField.newInputObjectField() - .name(SCHEMA_NAME) - .type(Scalars.GraphQLString)) .build(); public GraphqlSchemaFieldFactory() { diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java index 9b25df5306..c4c5a455aa 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java @@ -44,7 +44,6 @@ public SchemaMetadata getSchemaMetadata() { .filter(d -> d.value() != null) .collect(Collectors.toMap(Setting::key, Setting::value))); for (Table t : this.tables) { - if (s.getName() == null) s.setName(t.getSchemaName()); TableMetadata tm = s.create(table(t.getName())); tm.setInheritName(t.getInheritName()); tm.setSettings( diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java index e1cac03f74..b8417fe489 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java @@ -17,8 +17,6 @@ public class Table { private String inheritName; private List labels = new ArrayList<>(); private List descriptions = new ArrayList<>(); - private String schemaName; - private String schemaId; private Collection unique = new ArrayList<>(); private Collection columns = new ArrayList<>(); private List settings = new ArrayList<>(); @@ -132,14 +130,6 @@ public void setSettings(List settings) { this.settings = settings; } - public String getSchemaName() { - return schemaName; - } - - public void setSchemaName(String schemaName) { - this.schemaName = schemaName; - } - public String[] getSemantics() { return semantics; } @@ -204,14 +194,6 @@ public void setDescription(String description) { this.description = description; } - public String getSchemaId() { - return schemaId; - } - - public void setSchemaId(String schemaId) { - this.schemaId = schemaId; - } - public String[] getProfiles() { return profiles; } From c4fd0a13a9df1986a94c56f964a170a0226d0478 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 21:16:39 +0100 Subject: [PATCH 15/21] remove table.schemaId from types --- apps/metadata-utils/src/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/metadata-utils/src/types.ts b/apps/metadata-utils/src/types.ts index 2aab5dfeb6..c31dd39a4f 100644 --- a/apps/metadata-utils/src/types.ts +++ b/apps/metadata-utils/src/types.ts @@ -76,7 +76,6 @@ export interface ITableMetaData { description?: string; tableType: string; columns: IColumn[]; - schemaId: string; semantics?: string[]; settings?: ISetting[]; } From 4499c58c8e6c9aacb3a99ca233a36f5fb2848452 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 22:08:24 +0100 Subject: [PATCH 16/21] also here --- apps/nuxt3-ssr/gql/metadata.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/nuxt3-ssr/gql/metadata.js b/apps/nuxt3-ssr/gql/metadata.js index 44b1900fcd..526e5c6f91 100644 --- a/apps/nuxt3-ssr/gql/metadata.js +++ b/apps/nuxt3-ssr/gql/metadata.js @@ -9,7 +9,6 @@ export default gql` label tableType description - schemaId semantics columns { id From 9c3b2b172e7d78697e722dc50a9df0d1c47b68dc Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 22:58:52 +0100 Subject: [PATCH 17/21] heading should not be in data map --- apps/tailwind-components/components/form/Fields.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/tailwind-components/components/form/Fields.vue b/apps/tailwind-components/components/form/Fields.vue index 4ef4bd18c5..943e61fb3f 100644 --- a/apps/tailwind-components/components/form/Fields.vue +++ b/apps/tailwind-components/components/form/Fields.vue @@ -43,7 +43,11 @@ const chapters = computed(() => { }); const dataMap = reactive( - Object.fromEntries(props.metadata.columns.map((column) => [column.id, ""])) + Object.fromEntries( + props.metadata.columns + .filter((column) => column.columnType !== "HEADING") + .map((column) => [column.id, ""]) + ) ); const errorMap = reactive( From d14cc1f4b1e752e30913f9bf193aa619b8229070 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sat, 11 Jan 2025 23:51:09 +0100 Subject: [PATCH 18/21] heading shouldn't be in form errorMap --- apps/tailwind-components/components/form/Fields.vue | 6 +++++- e2e/tests/tailwind-components/form/renderForm.spec.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/tailwind-components/components/form/Fields.vue b/apps/tailwind-components/components/form/Fields.vue index 943e61fb3f..475ab8ddd2 100644 --- a/apps/tailwind-components/components/form/Fields.vue +++ b/apps/tailwind-components/components/form/Fields.vue @@ -51,7 +51,11 @@ const dataMap = reactive( ); const errorMap = reactive( - Object.fromEntries(props.metadata.columns.map((column) => [column.id, []])) + Object.fromEntries( + props.metadata.columns + .filter((column) => column.columnType !== "HEADING") + .map((column) => [column.id, []]) + ) ); const numberOffFieldsWithErrors = computed(() => diff --git a/e2e/tests/tailwind-components/form/renderForm.spec.ts b/e2e/tests/tailwind-components/form/renderForm.spec.ts index 0b4fc93199..5ad93557b0 100644 --- a/e2e/tests/tailwind-components/form/renderForm.spec.ts +++ b/e2e/tests/tailwind-components/form/renderForm.spec.ts @@ -13,5 +13,5 @@ test("it should update the model value when a field is filled out", async ({ pag await page.goto(`${route}Form.story`); await page.getByLabel('name').click(); await page.getByLabel('name').fill('test'); - await expect(page.getByRole('main')).toContainText('dataMap: { "name": "test", "category": "", "photoUrls": "", "details": "", "status": "", "tags": "", "weight": "", "orders": "", "mg_draft": "", "mg_insertedBy": "", "mg_insertedOn": "", "mg_updatedBy": "", "mg_updatedOn": "" } errorMap: { "name": [], "category": [], "photoUrls": [], "details": [], "status": [], "tags": [], "weight": [], "orders": [], "mg_draft": [], "mg_insertedBy": [], "mg_insertedOn": [], "mg_updatedBy": [], "mg_updatedOn": [] }'); + await expect(page.getByRole('main')).toContainText('dataMap: { "name": "test", "category": "", "photoUrls": "", "status": "", "tags": "", "weight": "", "orders": "", "mg_draft": "", "mg_insertedBy": "", "mg_insertedOn": "", "mg_updatedBy": "", "mg_updatedOn": ""} errorMap: { "name": [], "category": [], "photoUrls": [], "details": [], "status": [], "tags": [], "weight": [], "orders": [], "mg_draft": [], "mg_insertedBy": [], "mg_insertedOn": [], "mg_updatedBy": [], "mg_updatedOn": [] }'); }); \ No newline at end of file From d5989157666742b26a57e1ae1b0e74fec557e34c Mon Sep 17 00:00:00 2001 From: mswertz Date: Sun, 12 Jan 2025 00:13:18 +0100 Subject: [PATCH 19/21] fix test spec --- e2e/tests/tailwind-components/form/renderForm.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/tests/tailwind-components/form/renderForm.spec.ts b/e2e/tests/tailwind-components/form/renderForm.spec.ts index 5ad93557b0..d97491a3b4 100644 --- a/e2e/tests/tailwind-components/form/renderForm.spec.ts +++ b/e2e/tests/tailwind-components/form/renderForm.spec.ts @@ -13,5 +13,5 @@ test("it should update the model value when a field is filled out", async ({ pag await page.goto(`${route}Form.story`); await page.getByLabel('name').click(); await page.getByLabel('name').fill('test'); - await expect(page.getByRole('main')).toContainText('dataMap: { "name": "test", "category": "", "photoUrls": "", "status": "", "tags": "", "weight": "", "orders": "", "mg_draft": "", "mg_insertedBy": "", "mg_insertedOn": "", "mg_updatedBy": "", "mg_updatedOn": ""} errorMap: { "name": [], "category": [], "photoUrls": [], "details": [], "status": [], "tags": [], "weight": [], "orders": [], "mg_draft": [], "mg_insertedBy": [], "mg_insertedOn": [], "mg_updatedBy": [], "mg_updatedOn": [] }'); + await expect(page.getByRole('main')).toContainText('dataMap: { "name": "test", "category": "", "photoUrls": "", "status": "", "tags": "", "weight": "", "orders": "", "mg_draft": "", "mg_insertedBy": "", "mg_insertedOn": "", "mg_updatedBy": "", "mg_updatedOn": "" } errorMap: { "name": [], "category": [], "photoUrls": [], "status": [], "tags": [], "weight": [], "orders": [], "mg_draft": [], "mg_insertedBy": [], "mg_insertedOn": [], "mg_updatedBy": [], "mg_updatedOn": [] }'); }); \ No newline at end of file From 6d11dbd0ac2bd5f4e6adc72db62188b9e37b6ded Mon Sep 17 00:00:00 2001 From: mswertz Date: Sun, 12 Jan 2025 13:06:46 +0100 Subject: [PATCH 20/21] remove unneeded table.schemaId = schemaId filters --- apps/molgenis-components/src/client/client.ts | 6 ++---- apps/molgenis-components/src/client/queryBuilder.ts | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/molgenis-components/src/client/client.ts b/apps/molgenis-components/src/client/client.ts index 10d9db17bc..16e426caf8 100644 --- a/apps/molgenis-components/src/client/client.ts +++ b/apps/molgenis-components/src/client/client.ts @@ -62,8 +62,7 @@ const client: IClient = { ) => { const schemaMetaData = await fetchSchemaMetaData(schemaId); const tableMetaData = schemaMetaData.tables.find( - (table: ITableMetaData) => - table.id === tableId && table.schemaId === schemaMetaData.id + (table: ITableMetaData) => table.id === tableId ); const filter = tableMetaData?.columns ?.filter((column: IColumn) => column.key === 1) @@ -393,8 +392,7 @@ async function convertRowToPrimaryKey( ): Promise> { const schema = await fetchSchemaMetaData(schemaId); const tableMetadata = schema.tables.find( - (table: ITableMetaData) => - table.id === tableId && table.schemaId === schema.id + (table: ITableMetaData) => table.id === tableId ); if (!tableMetadata?.columns) { throw new Error("Empty columns in metadata"); diff --git a/apps/molgenis-components/src/client/queryBuilder.ts b/apps/molgenis-components/src/client/queryBuilder.ts index 16afa64364..807b1135c8 100644 --- a/apps/molgenis-components/src/client/queryBuilder.ts +++ b/apps/molgenis-components/src/client/queryBuilder.ts @@ -57,8 +57,6 @@ const getColumns = ( tableId: string, tableStore: ITableMetaData[] ) => { - const result = tableStore.find( - (table) => table.id === tableId && table.schemaId === schemaId - ); + const result = tableStore.find((table) => table.id === tableId); return result?.columns || []; }; From 5bfe46053ffdccaf5c16c103ee0471b309f0d715 Mon Sep 17 00:00:00 2001 From: mswertz Date: Sun, 12 Jan 2025 13:08:00 +0100 Subject: [PATCH 21/21] remove unneeded table.schemaId statements --- apps/schema/src/components/Schema.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/schema/src/components/Schema.vue b/apps/schema/src/components/Schema.vue index 98528e5751..1a30bf549f 100644 --- a/apps/schema/src/components/Schema.vue +++ b/apps/schema/src/components/Schema.vue @@ -188,7 +188,6 @@ export default { } }); tables.forEach((table) => { - delete table.schemaId; table.columns = table.columns ? table.columns.filter((column) => column.table === table.name) : [];