From c1a250886a7ae53613ab1c308a516ff07b05908e Mon Sep 17 00:00:00 2001 From: pdesmarets Date: Tue, 25 Feb 2025 17:05:23 +0100 Subject: [PATCH 1/6] Added descriptions and faker samples --- confluent/Confluent demo.hck.json | 194 +++++++++++++++++++++--------- 1 file changed, 138 insertions(+), 56 deletions(-) diff --git a/confluent/Confluent demo.hck.json b/confluent/Confluent demo.hck.json index 3fcd560..4c064ec 100644 --- a/confluent/Confluent demo.hck.json +++ b/confluent/Confluent demo.hck.json @@ -7,16 +7,24 @@ "type": "object", "properties": [ { + "GUID": "f0a8dffb-4801-48e6-b38a-09429dcb411d", "name": "orderID", - "hackoladeMeta": {}, + "type": "reference", + "$ref": "#model/definitions/identifier", + "refType": "model", + "ref": "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c", + "refIdPath": [ + "f5be81af-4748-4d0a-9512-e4ec7f56b6cc", + "5f8b7759-fd55-49ab-b8ee-dd63a2831d27", + "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c" + ], "isActivated": true, "required": true, "primaryKey": false, - "type": "string", - "GUID": "f0a8dffb-4801-48e6-b38a-09429dcb411d", - "logicalType": "uuid", + "hackoladeMeta": {}, + "refDescription": "This is a unique identifier for each order. It serves as the primary key for the table, ensuring that each order can be easily referenced or retrieved. ", "error": { - "name": false + "refDescription": false } }, { @@ -39,7 +47,8 @@ "logicalType": "date", "error": { "default": true - } + }, + "fakerFunction": "faker.date.recent({ days: 10 })" } ], "isActivated": true, @@ -48,6 +57,7 @@ "hackoladeMeta": {}, "required": false, "default": null, + "description": "This column stores the date (and sometimes the time) when the order was placed. It’s important for tracking order history, delivery timelines, and for analyzing purchasing patterns (e.g., peak sales periods or customer behavior).", "error": {} }, { @@ -91,6 +101,8 @@ "childType": "number", "type": "numeric", "GUID": "283c0014-b32c-44ee-bb8e-9f58da1827f1", + "sample": 1, + "description": "The lineNum is used to distinguish individual items in an order. Since an order can consist of multiple products, lineNum helps to number each product in the order (usually sequentially). This allows for easy organization of the products, especially when there are multiple items ordered. It’s often used in conjunction with orderID to identify specific line items in a given order.", "error": {} }, { @@ -105,9 +117,9 @@ ], "isActivated": true, "error": { - "name": false, - "code": false - } + "refDescription": false + }, + "refDescription": "This column represents the specific product being ordered. It could store a reference to the productID from the product table, or it could directly store the product name or SKU (Stock Keeping Unit), depending on the system’s design. The product column is used to identify which item is being purchased in each line of the order." }, { "name": "quantity", @@ -121,6 +133,8 @@ "childType": "number", "type": "numeric", "GUID": "81f414a6-6ba3-431d-a926-f8e233d08297", + "sample": 12, + "description": "This column indicates the number of units of the product being ordered in a particular line. It is crucial for inventory management, sales reporting, and determining the total value of an order. If a customer orders multiple quantities of the same product, this field would reflect that.", "error": {} }, { @@ -135,6 +149,8 @@ "childType": "number", "type": "numeric", "GUID": "1d650548-d6bc-44b9-a9cf-b670e776c362", + "sample": 56.32, + "description": "The unitPrice represents the price per unit of the product at the time the order is placed. This value is important for calculating the total cost of the product line (quantity * unitPrice). The unitPrice might reflect any discounts, promotions, or pricing tiers available to the customer at the time of purchase.", "error": {} } ], @@ -169,7 +185,8 @@ "schemaNameStrategy": "TopicRecordNameStrategy", "confluentSubjectName": "orders", "confluentCompatibility": "BACKWARD", - "schemaTopic": "onlineShop" + "schemaTopic": "onlineShop", + "description": "This record contains information about individual orders placed by customers. Each record represents an order, which could consist of one or more line items, each corresponding to a specific product being purchased. It helps track customer purchases, manage inventory, and provide data for invoicing and reporting.\n\n" }, { "GUID": "6a474d94-c083-4c1a-811e-be8fa14a9f61", @@ -177,20 +194,21 @@ "type": "object", "properties": [ { + "GUID": "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e", "name": "customerID", - "hackoladeMeta": {}, + "type": "reference", + "$ref": "#model/definitions/identifier", + "refType": "model", + "ref": "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c", + "refIdPath": [ + "f5be81af-4748-4d0a-9512-e4ec7f56b6cc", + "5f8b7759-fd55-49ab-b8ee-dd63a2831d27", + "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c" + ], "isActivated": true, "required": true, "primaryKey": false, - "type": "string", - "GUID": "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e", - "logicalType": "uuid", - "error": { - "name": false - }, - "childRelationships": [ - "2afed7cb-ee71-49cb-942e-e4413eca8b4e" - ] + "hackoladeMeta": {} }, { "name": "firstName", @@ -200,9 +218,9 @@ "primaryKey": false, "type": "string", "GUID": "85656d1d-be08-435a-8d4c-77b421d52e29", - "error": { - "name": false - } + "fakerFunction": "faker.person.firstName()", + "description": "This column holds the customer's first name. It is part of the personal information that helps identify the customer. This field can be useful for customer interactions, marketing purposes, or for personalizing communications (e.g., emails, invoices).", + "error": {} }, { "name": "lastName", @@ -212,9 +230,9 @@ "primaryKey": false, "type": "string", "GUID": "590a9df6-ede1-4da4-8cbb-521f21062cc5", - "error": { - "name": false - } + "fakerFunction": "faker.person.lastName()", + "description": "This column stores the customer's last name (or surname). Like the first name, the last name is an important piece of the customer's identity. It is typically used in combination with the first name to uniquely identify individuals and personalize communications.", + "error": {} }, { "name": "address", @@ -229,7 +247,10 @@ { "type": "string", "GUID": "f1cf0410-d109-4798-af45-e682533b7906", - "error": {} + "error": { + "default": true + }, + "fakerFunction": "faker.location.streetAddress()" } ], "isActivated": true, @@ -238,7 +259,6 @@ "hackoladeMeta": {}, "required": false, "default": null, - "error": {}, "sources": [ { "GUID": "2275f6ad-094f-4416-a6be-171e42cec582", @@ -248,7 +268,9 @@ "GUID": "80a23c31-8874-4428-b033-14e701909a82", "lineageSourceGUID": "d5efd02c-7a53-498d-b751-b311a55fba28" } - ] + ], + "description": "The address column stores the physical address of the customer, which could include details like street name, city, state, postal code, and country. This is important for shipping products, billing purposes, or maintaining accurate contact records. In some cases, this could be broken down into multiple columns (e.g., street, city, zip code) depending on the database structure.", + "error": {} }, { "name": "creationDate", @@ -268,7 +290,10 @@ "type": "numeric", "GUID": "2058670b-4dad-44ba-b0f5-98debee249e4", "logicalType": "local-timestamp-millis", - "error": {} + "error": { + "default": true + }, + "fakerFunction": "faker.date.anytime()" } ], "isActivated": true, @@ -277,9 +302,8 @@ "hackoladeMeta": {}, "required": false, "default": null, - "error": { - "name": false - } + "description": "This column records the date and time when the customer account was created. It is useful for tracking the age of customer accounts, determining customer activity, and analyzing trends (e.g., when customers tend to join or how long they've been active). This field is usually set automatically when a new customer is added to the system.", + "error": {} } ], "definitions": { @@ -299,7 +323,8 @@ "tags": [ "PII", "Sensitive" - ] + ], + "description": "This record contains essential information about the customers, including personal details and the data related to their account or registration. It helps manage customer profiles, track account creation, and enables businesses to reach out or interact with their customers." }, { "GUID": "48e20d0f-104d-4ab3-a224-95150064e7dc", @@ -307,18 +332,25 @@ "type": "object", "properties": [ { + "GUID": "96056a84-348e-41c7-af7b-13849ed6ebb5", "name": "productID", - "hackoladeMeta": {}, + "type": "reference", + "$ref": "#model/definitions/identifier", + "refType": "model", + "ref": "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c", + "refIdPath": [ + "f5be81af-4748-4d0a-9512-e4ec7f56b6cc", + "5f8b7759-fd55-49ab-b8ee-dd63a2831d27", + "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c" + ], "isActivated": true, "required": true, "primaryKey": false, - "type": "string", - "GUID": "96056a84-348e-41c7-af7b-13849ed6ebb5", - "logicalType": "uuid", - "error": {}, - "childRelationships": [ - "9143bfdc-ef60-4e72-a611-b8be3802fdf0" - ] + "hackoladeMeta": {}, + "refDescription": "This is a unique identifier for each product in the table. It is typically a primary key, ensuring that each product is distinct and easily retrievable. It may be an auto-incremented integer or a unique alphanumeric code depending on the system design.", + "error": { + "refDescription": false + } }, { "name": "partNumber", @@ -328,9 +360,9 @@ "primaryKey": false, "type": "string", "GUID": "64c495cf-2db2-4b90-a6c0-0d3ff9683b9b", - "error": { - "name": false - } + "fakerFunction": "faker.commerce.isbn(10)", + "description": "The part number is a unique code or reference used to identify a specific version of a product, often assigned by manufacturers or suppliers. It allows users to distinguish between different products that might have similar descriptions but are technically different (e.g., different colors, sizes, or models). This is commonly used in inventory management systems or parts catalogs.", + "error": {} }, { "name": "description", @@ -340,6 +372,8 @@ "primaryKey": false, "type": "string", "GUID": "68c43be1-b675-49eb-84d7-3e4f4cde3a9e", + "fakerFunction": "faker.commerce.productName()", + "description": "This column holds a textual description of the product. It provides more detailed information such as the product's features, specifications, intended use, or any other relevant data that helps users or customers understand what the product is. The description can vary in length, depending on the detail level required by the business or system.", "error": {} } ], @@ -356,7 +390,8 @@ "schemaNameStrategy": "TopicRecordNameStrategy", "schemaTopic": "onlineShop", "confluentSubjectName": "products", - "confluentCompatibility": "BACKWARD" + "confluentCompatibility": "BACKWARD", + "description": "This record contains information about products in the inventory, catalog, or any system that deals with physical or digital items. It contains key attributes to uniquely identify each product, manage product details, and provide descriptions that help in understanding the products." } ], "buckets": [ @@ -377,7 +412,10 @@ "show": true, "isActivated": true, "indexes": [], - "GUID": "5170915a-415c-433e-abe8-388433feb49c" + "GUID": "5170915a-415c-433e-abe8-388433feb49c", + "hackoladeMeta": { + "validationErrors": {} + } } ], "views": [], @@ -434,6 +472,9 @@ "right", "left" ] + }, + "hackoladeMeta": { + "validationErrors": {} } }, { @@ -461,7 +502,9 @@ "parentCollection": "48e20d0f-104d-4ab3-a224-95150064e7dc", "childCollection": "e2eb848c-cda5-47aa-8d53-e210eef7afbe", "GUID": "9143bfdc-ef60-4e72-a611-b8be3802fdf0", - "hackoladeMeta": {}, + "hackoladeMeta": { + "validationErrors": {} + }, "hackoladeStyles": { "GUID": "f2d8fc30-daac-4acc-88fb-c4c8f5f3b246", "autoPositioning": true, @@ -518,11 +561,40 @@ "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce": "product", "85d9c4ff-450e-4651-aef5-21aff5241139": "customer", "2afed7cb-ee71-49cb-942e-e4413eca8b4e": "fk_customer_customerID_to_order_customer", - "9143bfdc-ef60-4e72-a611-b8be3802fdf0": "fk_product_productID_to_order_orderLines.product" + "9143bfdc-ef60-4e72-a611-b8be3802fdf0": "fk_product_productID_to_order_orderLines.product", + "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c": "identifier" }, "definitions": { "type": "definitions", - "properties": [], + "properties": [ + { + "name": "identifier", + "hackoladeMeta": {}, + "isActivated": true, + "required": true, + "primaryKey": false, + "type": "string", + "GUID": "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c", + "definitionRefs": [ + [ + "6a474d94-c083-4c1a-811e-be8fa14a9f61", + "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e" + ], + [ + "48e20d0f-104d-4ab3-a224-95150064e7dc", + "96056a84-348e-41c7-af7b-13849ed6ebb5" + ], + [ + "e2eb848c-cda5-47aa-8d53-e210eef7afbe", + "f0a8dffb-4801-48e6-b38a-09429dcb411d" + ] + ], + "logicalType": "uuid", + "fakerFunction": "faker.string.uuid()", + "description": "Unique identifier to be used as a primary key. In UUID format", + "error": {} + } + ], "GUID": "5f8b7759-fd55-49ab-b8ee-dd63a2831d27" }, "polyglotDefinitions": { @@ -546,20 +618,21 @@ "schemaRegistryType": "Confluent Schema Registry", "hackoladeMeta": { "validationErrors": { - "schemaRegistryType": false + "schemaRegistryUrl": false } }, - "lastModifTS": "2025-02-24T18:18:57.731Z", + "lastModifTS": "2025-02-25T16:05:01.693Z", "persistenceSchemaVersion": "8", "isCreatedByPlugin": true, "pluginInformation": { "pluginName": "Avro", - "pluginVersion": "0.2.9", + "pluginVersion": "0.2.10", "pluginEngineVersion": "1.0.0" }, "applicationInformation": { "version": "8.0.2" }, + "schemaRegistryUrl": "https://psrc-4v1qj.eu-central-1.aws.confluent.cloud", "settings": { "centralPane": { "dbLevel": { @@ -576,7 +649,7 @@ "GUID": "6a474d94-c083-4c1a-811e-be8fa14a9f61", "x": 1534, "y": 1109, - "width": 228, + "width": 257, "height": 123, "color": {} }, @@ -584,7 +657,7 @@ "GUID": "48e20d0f-104d-4ab3-a224-95150064e7dc", "x": 1544, "y": 1275, - "width": 222, + "width": 251, "height": 87, "color": {} } @@ -625,9 +698,18 @@ "autoWidth": true, "autoHeight": true, "GUID": "6a474d94-c083-4c1a-811e-be8fa14a9f61" + }, + { + "autoWidth": true, + "autoHeight": true, + "GUID": "48e20d0f-104d-4ab3-a224-95150064e7dc" } ], - "relationshipUpdateDisabled": false + "relationshipUpdateDisabled": false, + "displayOptions": { + "dndHandles": false, + "hideRelationshipName": true + } }, "collectionLevel": {}, "changed": false From 6cb78d28d72851c207bf83b8f264ab0ad45b5ba3 Mon Sep 17 00:00:00 2001 From: pdesmarets Date: Wed, 26 Feb 2025 10:36:02 +0100 Subject: [PATCH 2/6] Add model name --- confluent/Confluent demo.hck.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/confluent/Confluent demo.hck.json b/confluent/Confluent demo.hck.json index 4c064ec..bba30c9 100644 --- a/confluent/Confluent demo.hck.json +++ b/confluent/Confluent demo.hck.json @@ -1,5 +1,5 @@ { - "modelName": "New model", + "modelName": "Ordering System", "collections": [ { "GUID": "e2eb848c-cda5-47aa-8d53-e210eef7afbe", @@ -117,9 +117,10 @@ ], "isActivated": true, "error": { - "refDescription": false + "nullable": false }, - "refDescription": "This column represents the specific product being ordered. It could store a reference to the productID from the product table, or it could directly store the product name or SKU (Stock Keeping Unit), depending on the system’s design. The product column is used to identify which item is being purchased in each line of the order." + "refDescription": "This column represents the specific product being ordered. It could store a reference to the productID from the product table, or it could directly store the product name or SKU (Stock Keeping Unit), depending on the system’s design. The product column is used to identify which item is being purchased in each line of the order.", + "nullable": false }, { "name": "quantity", @@ -618,10 +619,10 @@ "schemaRegistryType": "Confluent Schema Registry", "hackoladeMeta": { "validationErrors": { - "schemaRegistryUrl": false + "modelName": false } }, - "lastModifTS": "2025-02-25T16:05:01.693Z", + "lastModifTS": "2025-02-26T06:27:00.249Z", "persistenceSchemaVersion": "8", "isCreatedByPlugin": true, "pluginInformation": { From 046cdb5040f52e6f1fe9cdd075ce35697d5560ea Mon Sep 17 00:00:00 2001 From: pdesmarets Date: Fri, 28 Feb 2025 12:01:52 +0100 Subject: [PATCH 3/6] Added business names --- confluent/Confluent demo.hck.json | 304 +++++++++++++++++++++--------- 1 file changed, 216 insertions(+), 88 deletions(-) diff --git a/confluent/Confluent demo.hck.json b/confluent/Confluent demo.hck.json index bba30c9..4bfe5a9 100644 --- a/confluent/Confluent demo.hck.json +++ b/confluent/Confluent demo.hck.json @@ -2,13 +2,15 @@ "modelName": "Ordering System", "collections": [ { + "code": "order", "GUID": "e2eb848c-cda5-47aa-8d53-e210eef7afbe", "collectionName": "order", "type": "object", "properties": [ { + "code": "orderId", "GUID": "f0a8dffb-4801-48e6-b38a-09429dcb411d", - "name": "orderID", + "name": "Order ID", "type": "reference", "$ref": "#model/definitions/identifier", "refType": "model", @@ -21,14 +23,18 @@ "isActivated": true, "required": true, "primaryKey": false, - "hackoladeMeta": {}, "refDescription": "This is a unique identifier for each order. It serves as the primary key for the table, ensuring that each order can be easily referenced or retrieved. ", "error": { - "refDescription": false + "name": false, + "code": false + }, + "hackoladeMeta": { + "namingConvention": "code" } }, { - "name": "orderDate", + "code": "orderDate", + "name": "Order Date", "type": "multiple", "properties": [], "multipleTypes": [ @@ -54,13 +60,19 @@ "isActivated": true, "primaryKey": false, "GUID": "a32d7f72-588e-43dc-a034-8a85a6b0cbd2", - "hackoladeMeta": {}, "required": false, "default": null, "description": "This column stores the date (and sometimes the time) when the order was placed. It’s important for tracking order history, delivery timelines, and for analyzing purchasing patterns (e.g., peak sales periods or customer behavior).", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { + "code": "customer", "GUID": "85d9c4ff-450e-4651-aef5-21aff5241139", "name": "customer", "type": "reference", @@ -71,27 +83,26 @@ "6a474d94-c083-4c1a-811e-be8fa14a9f61" ], "isActivated": true, - "error": { - "name": false, - "code": false + "error": {}, + "hackoladeMeta": { + "namingConvention": "code" } }, { + "code": "orderlines", "name": "orderLines", - "hackoladeMeta": {}, "isActivated": true, "required": true, "properties": [ { - "hackoladeMeta": {}, + "code": "orderLine", "isActivated": true, "required": true, - "subtype": "map", "primaryKey": false, "properties": [ { - "name": "lineNum", - "hackoladeMeta": {}, + "code": "lineNum", + "name": "Line Num", "isActivated": true, "required": true, "exclusiveMinimum": false, @@ -103,9 +114,16 @@ "GUID": "283c0014-b32c-44ee-bb8e-9f58da1827f1", "sample": 1, "description": "The lineNum is used to distinguish individual items in an order. Since an order can consist of multiple products, lineNum helps to number each product in the order (usually sequentially). This allows for easy organization of the products, especially when there are multiple items ordered. It’s often used in conjunction with orderID to identify specific line items in a given order.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { + "code": "product", "GUID": "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce", "name": "product", "type": "reference", @@ -116,15 +134,17 @@ "48e20d0f-104d-4ab3-a224-95150064e7dc" ], "isActivated": true, - "error": { - "nullable": false - }, + "error": {}, "refDescription": "This column represents the specific product being ordered. It could store a reference to the productID from the product table, or it could directly store the product name or SKU (Stock Keeping Unit), depending on the system’s design. The product column is used to identify which item is being purchased in each line of the order.", - "nullable": false + "nullable": false, + "dependencies": [], + "hackoladeMeta": { + "namingConvention": "code" + } }, { - "name": "quantity", - "hackoladeMeta": {}, + "code": "quantity", + "name": "Quantity", "isActivated": true, "required": true, "exclusiveMinimum": false, @@ -136,11 +156,17 @@ "GUID": "81f414a6-6ba3-431d-a926-f8e233d08297", "sample": 12, "description": "This column indicates the number of units of the product being ordered in a particular line. It is crucial for inventory management, sales reporting, and determining the total value of an order. If a customer orders multiple quantities of the same product, this field would reflect that.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { - "name": "unitPrice", - "hackoladeMeta": {}, + "code": "unitPrice", + "name": "Unit Price", "isActivated": true, "required": true, "exclusiveMinimum": false, @@ -152,15 +178,25 @@ "GUID": "1d650548-d6bc-44b9-a9cf-b670e776c362", "sample": 56.32, "description": "The unitPrice represents the price per unit of the product at the time the order is placed. This value is important for calculating the total cost of the product line (quantity * unitPrice). The unitPrice might reflect any discounts, promotions, or pricing tiers available to the customer at the time of purchase.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } } ], "additionalProperties": false, - "childType": "map", + "childType": "record", "type": "document", - "GUID": "ba79efd0-9cf0-4d04-bd35-6cea11e542f0", + "GUID": "71d70559-ef92-44c0-ac9e-7fbc6324286f", "arrayItem": true, - "error": {} + "name": "Order Line", + "error": {}, + "hackoladeMeta": { + "namingConvention": "code" + } } ], "primaryKey": false, @@ -170,7 +206,10 @@ "type": "array", "error": {}, "GUID": "6830e97f-dca8-4600-a3e9-c525c2693c35", - "metaProps": [] + "metaProps": [], + "hackoladeMeta": { + "namingConvention": "code" + } } ], "definitions": { @@ -182,21 +221,26 @@ "additionalProperties": false, "collectionUsers": [], "bucketId": "5170915a-415c-433e-abe8-388433feb49c", - "hackoladeMeta": {}, "schemaNameStrategy": "TopicRecordNameStrategy", "confluentSubjectName": "orders", "confluentCompatibility": "BACKWARD", "schemaTopic": "onlineShop", - "description": "This record contains information about individual orders placed by customers. Each record represents an order, which could consist of one or more line items, each corresponding to a specific product being purchased. It helps track customer purchases, manage inventory, and provide data for invoicing and reporting.\n\n" + "description": "This record contains information about individual orders placed by customers. Each record represents an order, which could consist of one or more line items, each corresponding to a specific product being purchased. It helps track customer purchases, manage inventory, and provide data for invoicing and reporting.\n\n", + "hackoladeMeta": { + "validationErrors": {}, + "namingConvention": "code" + } }, { + "code": "customer", "GUID": "6a474d94-c083-4c1a-811e-be8fa14a9f61", "collectionName": "customer", "type": "object", "properties": [ { + "code": "customerId", "GUID": "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e", - "name": "customerID", + "name": "Customer ID", "type": "reference", "$ref": "#model/definitions/identifier", "refType": "model", @@ -209,11 +253,27 @@ "isActivated": true, "required": true, "primaryKey": false, - "hackoladeMeta": {} + "childRelationships": [ + "2afed7cb-ee71-49cb-942e-e4413eca8b4e" + ], + "relationshipType": "Foreign Key", + "parentRelationship": "2afed7cb-ee71-49cb-942e-e4413eca8b4e", + "foreignCollection": "6a474d94-c083-4c1a-811e-be8fa14a9f61", + "foreignField": [ + "6a474d94-c083-4c1a-811e-be8fa14a9f61", + "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e" + ], + "error": { + "name": false, + "code": false + }, + "hackoladeMeta": { + "namingConvention": "code" + } }, { - "name": "firstName", - "hackoladeMeta": {}, + "code": "firstName", + "name": "First Name", "isActivated": true, "required": true, "primaryKey": false, @@ -221,11 +281,17 @@ "GUID": "85656d1d-be08-435a-8d4c-77b421d52e29", "fakerFunction": "faker.person.firstName()", "description": "This column holds the customer's first name. It is part of the personal information that helps identify the customer. This field can be useful for customer interactions, marketing purposes, or for personalizing communications (e.g., emails, invoices).", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { - "name": "lastName", - "hackoladeMeta": {}, + "code": "lastName", + "name": "Last Name", "isActivated": true, "required": true, "primaryKey": false, @@ -233,10 +299,17 @@ "GUID": "590a9df6-ede1-4da4-8cbb-521f21062cc5", "fakerFunction": "faker.person.lastName()", "description": "This column stores the customer's last name (or surname). Like the first name, the last name is an important piece of the customer's identity. It is typically used in combination with the first name to uniquely identify individuals and personalize communications.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { - "name": "address", + "code": "address", + "name": "Address", "type": "multiple", "properties": [], "multipleTypes": [ @@ -257,7 +330,6 @@ "isActivated": true, "primaryKey": false, "GUID": "30fba81b-ce05-43c2-9bf6-e60b5b656357", - "hackoladeMeta": {}, "required": false, "default": null, "sources": [ @@ -271,10 +343,17 @@ } ], "description": "The address column stores the physical address of the customer, which could include details like street name, city, state, postal code, and country. This is important for shipping products, billing purposes, or maintaining accurate contact records. In some cases, this could be broken down into multiple columns (e.g., street, city, zip code) depending on the database structure.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { - "name": "creationDate", + "code": "creationDate", + "name": "Creation Date", "type": "multiple", "properties": [], "multipleTypes": [ @@ -300,11 +379,16 @@ "isActivated": true, "primaryKey": false, "GUID": "5a61cfb6-5df5-43d2-93c2-6f1cbe082cea", - "hackoladeMeta": {}, "required": false, "default": null, "description": "This column records the date and time when the customer account was created. It is useful for tracking the age of customer accounts, determining customer activity, and analyzing trends (e.g., when customers tend to join or how long they've been active). This field is usually set automatically when a new customer is added to the system.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } } ], "definitions": { @@ -316,7 +400,6 @@ "additionalProperties": false, "collectionUsers": [], "bucketId": "5170915a-415c-433e-abe8-388433feb49c", - "hackoladeMeta": {}, "schemaNameStrategy": "TopicRecordNameStrategy", "schemaTopic": "onlineShop", "confluentSubjectName": "customers", @@ -325,16 +408,22 @@ "PII", "Sensitive" ], - "description": "This record contains essential information about the customers, including personal details and the data related to their account or registration. It helps manage customer profiles, track account creation, and enables businesses to reach out or interact with their customers." + "description": "This record contains essential information about the customers, including personal details and the data related to their account or registration. It helps manage customer profiles, track account creation, and enables businesses to reach out or interact with their customers.", + "hackoladeMeta": { + "validationErrors": {}, + "namingConvention": "code" + } }, { + "code": "product", "GUID": "48e20d0f-104d-4ab3-a224-95150064e7dc", "collectionName": "product", "type": "object", "properties": [ { + "code": "productId", "GUID": "96056a84-348e-41c7-af7b-13849ed6ebb5", - "name": "productID", + "name": "Product ID", "type": "reference", "$ref": "#model/definitions/identifier", "refType": "model", @@ -347,15 +436,28 @@ "isActivated": true, "required": true, "primaryKey": false, - "hackoladeMeta": {}, "refDescription": "This is a unique identifier for each product in the table. It is typically a primary key, ensuring that each product is distinct and easily retrievable. It may be an auto-incremented integer or a unique alphanumeric code depending on the system design.", "error": { - "refDescription": false + "name": false, + "code": false + }, + "childRelationships": [ + "9143bfdc-ef60-4e72-a611-b8be3802fdf0" + ], + "relationshipType": "Foreign Key", + "parentRelationship": "9143bfdc-ef60-4e72-a611-b8be3802fdf0", + "foreignCollection": "48e20d0f-104d-4ab3-a224-95150064e7dc", + "foreignField": [ + "48e20d0f-104d-4ab3-a224-95150064e7dc", + "96056a84-348e-41c7-af7b-13849ed6ebb5" + ], + "hackoladeMeta": { + "namingConvention": "code" } }, { - "name": "partNumber", - "hackoladeMeta": {}, + "code": "partNumber", + "name": "Part Number", "isActivated": true, "required": true, "primaryKey": false, @@ -363,11 +465,17 @@ "GUID": "64c495cf-2db2-4b90-a6c0-0d3ff9683b9b", "fakerFunction": "faker.commerce.isbn(10)", "description": "The part number is a unique code or reference used to identify a specific version of a product, often assigned by manufacturers or suppliers. It allows users to distinguish between different products that might have similar descriptions but are technically different (e.g., different colors, sizes, or models). This is commonly used in inventory management systems or parts catalogs.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } }, { - "name": "description", - "hackoladeMeta": {}, + "code": "description", + "name": "Description", "isActivated": true, "required": true, "primaryKey": false, @@ -375,7 +483,13 @@ "GUID": "68c43be1-b675-49eb-84d7-3e4f4cde3a9e", "fakerFunction": "faker.commerce.productName()", "description": "This column holds a textual description of the product. It provides more detailed information such as the product's features, specifications, intended use, or any other relevant data that helps users or customers understand what the product is. The description can vary in length, depending on the detail level required by the business or system.", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } } ], "definitions": { @@ -387,16 +501,20 @@ "additionalProperties": false, "collectionUsers": [], "bucketId": "5170915a-415c-433e-abe8-388433feb49c", - "hackoladeMeta": {}, "schemaNameStrategy": "TopicRecordNameStrategy", "schemaTopic": "onlineShop", "confluentSubjectName": "products", "confluentCompatibility": "BACKWARD", - "description": "This record contains information about products in the inventory, catalog, or any system that deals with physical or digital items. It contains key attributes to uniquely identify each product, manage product details, and provide descriptions that help in understanding the products." + "description": "This record contains information about products in the inventory, catalog, or any system that deals with physical or digital items. It contains key attributes to uniquely identify each product, manage product details, and provide descriptions that help in understanding the products.", + "hackoladeMeta": { + "validationErrors": {}, + "namingConvention": "code" + } } ], "buckets": [ { + "code": "hckdemo", "name": "HCKdemo", "type": "bucket", "collectionIds": [ @@ -415,7 +533,8 @@ "indexes": [], "GUID": "5170915a-415c-433e-abe8-388433feb49c", "hackoladeMeta": { - "validationErrors": {} + "validationErrors": {}, + "namingConvention": "code" } } ], @@ -453,15 +572,15 @@ "dataType": "", "shape": [ { - "x": 1394, + "x": 1393, "y": 1193 }, { - "x": 1464, + "x": 1463.5, "y": 1193 }, { - "x": 1464, + "x": 1463.5, "y": 1170.5 }, { @@ -492,7 +611,7 @@ [ "e2eb848c-cda5-47aa-8d53-e210eef7afbe", "6830e97f-dca8-4600-a3e9-c525c2693c35", - "ba79efd0-9cf0-4d04-bd35-6cea11e542f0", + "71d70559-ef92-44c0-ac9e-7fbc6324286f", "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce", "48e20d0f-104d-4ab3-a224-95150064e7dc", "96056a84-348e-41c7-af7b-13849ed6ebb5" @@ -515,15 +634,15 @@ "dataType": "", "shape": [ { - "x": 1394, + "x": 1393, "y": 1306 }, { - "x": 1469, + "x": 1468.5, "y": 1306 }, { - "x": 1469, + "x": 1468.5, "y": 1318.5 }, { @@ -543,34 +662,35 @@ "idToNameHashTable": { "5170915a-415c-433e-abe8-388433feb49c": "HCKdemo", "e2eb848c-cda5-47aa-8d53-e210eef7afbe": "order", - "f0a8dffb-4801-48e6-b38a-09429dcb411d": "orderID", - "a32d7f72-588e-43dc-a034-8a85a6b0cbd2": "orderDate", + "f0a8dffb-4801-48e6-b38a-09429dcb411d": "Order ID", + "a32d7f72-588e-43dc-a034-8a85a6b0cbd2": "Order Date", "6830e97f-dca8-4600-a3e9-c525c2693c35": "orderLines", "6a474d94-c083-4c1a-811e-be8fa14a9f61": "customer", - "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e": "customerID", - "85656d1d-be08-435a-8d4c-77b421d52e29": "firstName", - "590a9df6-ede1-4da4-8cbb-521f21062cc5": "lastName", - "30fba81b-ce05-43c2-9bf6-e60b5b656357": "address", - "5a61cfb6-5df5-43d2-93c2-6f1cbe082cea": "creationDate", - "283c0014-b32c-44ee-bb8e-9f58da1827f1": "lineNum", - "81f414a6-6ba3-431d-a926-f8e233d08297": "quantity", - "1d650548-d6bc-44b9-a9cf-b670e776c362": "unitPrice", + "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e": "Customer ID", + "85656d1d-be08-435a-8d4c-77b421d52e29": "First Name", + "590a9df6-ede1-4da4-8cbb-521f21062cc5": "Last Name", + "30fba81b-ce05-43c2-9bf6-e60b5b656357": "Address", + "5a61cfb6-5df5-43d2-93c2-6f1cbe082cea": "Creation Date", "48e20d0f-104d-4ab3-a224-95150064e7dc": "product", - "96056a84-348e-41c7-af7b-13849ed6ebb5": "productID", - "64c495cf-2db2-4b90-a6c0-0d3ff9683b9b": "partNumber", - "68c43be1-b675-49eb-84d7-3e4f4cde3a9e": "description", - "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce": "product", + "96056a84-348e-41c7-af7b-13849ed6ebb5": "Product ID", + "64c495cf-2db2-4b90-a6c0-0d3ff9683b9b": "Part Number", + "68c43be1-b675-49eb-84d7-3e4f4cde3a9e": "Description", "85d9c4ff-450e-4651-aef5-21aff5241139": "customer", "2afed7cb-ee71-49cb-942e-e4413eca8b4e": "fk_customer_customerID_to_order_customer", "9143bfdc-ef60-4e72-a611-b8be3802fdf0": "fk_product_productID_to_order_orderLines.product", - "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c": "identifier" + "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c": "Identifier", + "1d650548-d6bc-44b9-a9cf-b670e776c362": "Unit Price", + "81f414a6-6ba3-431d-a926-f8e233d08297": "Quantity", + "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce": "product", + "283c0014-b32c-44ee-bb8e-9f58da1827f1": "Line Num", + "71d70559-ef92-44c0-ac9e-7fbc6324286f": "Order Line" }, "definitions": { "type": "definitions", "properties": [ { - "name": "identifier", - "hackoladeMeta": {}, + "code": "identifier", + "name": "Identifier", "isActivated": true, "required": true, "primaryKey": false, @@ -593,7 +713,13 @@ "logicalType": "uuid", "fakerFunction": "faker.string.uuid()", "description": "Unique identifier to be used as a primary key. In UUID format", - "error": {} + "hackoladeMeta": { + "namingConvention": "code" + }, + "error": { + "name": false, + "code": false + } } ], "GUID": "5f8b7759-fd55-49ab-b8ee-dd63a2831d27" @@ -620,9 +746,10 @@ "hackoladeMeta": { "validationErrors": { "modelName": false - } + }, + "namingConvention": "code" }, - "lastModifTS": "2025-02-26T06:27:00.249Z", + "lastModifTS": "2025-02-28T11:01:35.965Z", "persistenceSchemaVersion": "8", "isCreatedByPlugin": true, "pluginInformation": { @@ -631,9 +758,10 @@ "pluginEngineVersion": "1.0.0" }, "applicationInformation": { - "version": "8.0.2" + "version": "8.0.3" }, "schemaRegistryUrl": "https://psrc-4v1qj.eu-central-1.aws.confluent.cloud", + "code": "orderingSystem", "settings": { "centralPane": { "dbLevel": { @@ -642,7 +770,7 @@ "GUID": "e2eb848c-cda5-47aa-8d53-e210eef7afbe", "x": 1080, "y": 1080, - "width": 314, + "width": 313, "height": 339, "color": {} }, From 56c66ace5e817b39eeb6cdbf47cc83aeb9fc94ad Mon Sep 17 00:00:00 2001 From: pdesmarets Date: Fri, 28 Feb 2025 12:33:46 +0100 Subject: [PATCH 4/6] Adjusted instructions to use Hackolade Studio --- README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 521a222..b8bdcf9 100644 --- a/README.md +++ b/README.md @@ -12,29 +12,39 @@ An online user documentation can be found [here](https://hackolade.com/help/Hubu Hackolade reserves the right to remove any inappropriate content from this repository, or any content that would negatively affect the platform. ## How to load your models to this repository +This repository is configured with a "Fork & Pull" strategy, very common in open-source, and also in [inner-source](https://hackolade.com/help/Workingwithforks.html). But instead of having a maintainer review your models, we enabled an automatic merge of your models, so you could automatically see your models in the Hub a few seconds after having submitted your Pull Request (see step 4 below.) + Follow these steps in order to add models to this repository 1. **Fork the repository** + This step cannot be done in Hackolade Studio. It must be made in GitHub. + Click on this fork button to copy this repository in your own GitHub account. This will open a form like the following You don't have to change anything, just click `Create fork` -1. Clone the new repository on your workstation by using your favorite Git tool or even better by using [Hackolade Studio](https://hackolade.com/help/Repository.html) to do so +1. Clone the new repository on your workstation by using your favorite Git tool or even better by using [Hackolade Studio](https://hackolade.com/help/Clonearemoterepository.html) to do so > Since this a is a public repository, make sure to not add any confidential models > We advise each organization to create its own folder, separate from others -1. When you are done, push the models on the forked repository +1. When you are done, [commit and push the model(s)](https://hackolade.com/help/Commitlocalchanges.html) on the forked repository. + +1. In Hackolade Studio, [submit a Pull Request from the fork](https://hackolade.com/help/Workingwithforks.html#Submit%20a%20Pull%20Request%20from%20a%20fork). + +1. After a few seconds, your pull request should be merged into the main repository, be replicated with the Hub database, and be visible on https://hub.hackolade.com + +As an alternative to step 4, you can manually do this on GitHub: -1. On the Github page, click on `Contribute` and `Open pull request` like shown on the picure below +4 alt. On the GitHub page, click on `Contribute` and `Open pull request` like shown on the picture below - + -1. On the pull request page, give a title to your pull request and then click `Create pull request` +5 alt. On the pull request page, give a title to your pull request and then click `Create pull request` - + -1. After a few seconds, your pull request should be merged into the main repository and be visible on https://hub.hackolade.com +6 alt. After a few seconds, your pull request should be merged into the main repository, be replicated with the Hub database, and be visible on https://hub.hackolade.com From b95a46dc5c695715160d0cc57b9632033167b928 Mon Sep 17 00:00:00 2001 From: pdesmarets Date: Fri, 28 Feb 2025 14:10:27 +0100 Subject: [PATCH 5/6] Adjusted business names --- confluent/Confluent demo.hck.json | 38 ++++++++++++++++++------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/confluent/Confluent demo.hck.json b/confluent/Confluent demo.hck.json index 4bfe5a9..30e0fcb 100644 --- a/confluent/Confluent demo.hck.json +++ b/confluent/Confluent demo.hck.json @@ -89,8 +89,8 @@ } }, { - "code": "orderlines", - "name": "orderLines", + "code": "OrderLines", + "name": "order Lines", "isActivated": true, "required": true, "properties": [ @@ -123,9 +123,9 @@ } }, { - "code": "product", + "code": "Product", "GUID": "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce", - "name": "product", + "name": "Product", "type": "reference", "$ref": "#/definitions/product", "refType": "collectionReference", @@ -134,7 +134,10 @@ "48e20d0f-104d-4ab3-a224-95150064e7dc" ], "isActivated": true, - "error": {}, + "error": { + "name": false, + "code": false + }, "refDescription": "This column represents the specific product being ordered. It could store a reference to the productID from the product table, or it could directly store the product name or SKU (Stock Keeping Unit), depending on the system’s design. The product column is used to identify which item is being purchased in each line of the order.", "nullable": false, "dependencies": [], @@ -204,11 +207,14 @@ "uniqueItems": false, "childType": "array", "type": "array", - "error": {}, "GUID": "6830e97f-dca8-4600-a3e9-c525c2693c35", "metaProps": [], "hackoladeMeta": { "namingConvention": "code" + }, + "error": { + "name": false, + "code": false } } ], @@ -572,15 +578,15 @@ "dataType": "", "shape": [ { - "x": 1393, + "x": 1397, "y": 1193 }, { - "x": 1463.5, + "x": 1465.5, "y": 1193 }, { - "x": 1463.5, + "x": 1465.5, "y": 1170.5 }, { @@ -634,15 +640,15 @@ "dataType": "", "shape": [ { - "x": 1393, + "x": 1397, "y": 1306 }, { - "x": 1468.5, + "x": 1470.5, "y": 1306 }, { - "x": 1468.5, + "x": 1470.5, "y": 1318.5 }, { @@ -664,7 +670,7 @@ "e2eb848c-cda5-47aa-8d53-e210eef7afbe": "order", "f0a8dffb-4801-48e6-b38a-09429dcb411d": "Order ID", "a32d7f72-588e-43dc-a034-8a85a6b0cbd2": "Order Date", - "6830e97f-dca8-4600-a3e9-c525c2693c35": "orderLines", + "6830e97f-dca8-4600-a3e9-c525c2693c35": "order Lines", "6a474d94-c083-4c1a-811e-be8fa14a9f61": "customer", "bb3df3b1-f9fa-4aab-8b1a-f7ed43bf5e4e": "Customer ID", "85656d1d-be08-435a-8d4c-77b421d52e29": "First Name", @@ -681,7 +687,7 @@ "14ca098f-1a6e-44ab-81e0-9d9bd27dae4c": "Identifier", "1d650548-d6bc-44b9-a9cf-b670e776c362": "Unit Price", "81f414a6-6ba3-431d-a926-f8e233d08297": "Quantity", - "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce": "product", + "c4b72ef8-a56f-4aa2-baf4-3d54b74694ce": "Product", "283c0014-b32c-44ee-bb8e-9f58da1827f1": "Line Num", "71d70559-ef92-44c0-ac9e-7fbc6324286f": "Order Line" }, @@ -749,7 +755,7 @@ }, "namingConvention": "code" }, - "lastModifTS": "2025-02-28T11:01:35.965Z", + "lastModifTS": "2025-02-28T13:10:02.910Z", "persistenceSchemaVersion": "8", "isCreatedByPlugin": true, "pluginInformation": { @@ -770,7 +776,7 @@ "GUID": "e2eb848c-cda5-47aa-8d53-e210eef7afbe", "x": 1080, "y": 1080, - "width": 313, + "width": 317, "height": 339, "color": {} }, From d76bb485b27dd5c7d071f10ae71325c11d0c65d4 Mon Sep 17 00:00:00 2001 From: pdesmarets Date: Fri, 28 Feb 2025 19:14:58 +0100 Subject: [PATCH 6/6] Fine-tuned instructions --- README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b8bdcf9..6df8c54 100644 --- a/README.md +++ b/README.md @@ -3,41 +3,43 @@ This repository contains Hackolade data models that can be viewed on https://hub The Hackolade Enterprise Model Hub is a metadata collaboration platform providing a unified and central access to your Hackolade Studio data models stored in one or more Git repositories. It empowers business teams, governance teams, and other stakeholders to collaborate effectively in order to promote a shared understanding of the context and meaning of data. -Feel free to explore at your leisure. It even allows you to [load your own models](#how-to-load-your-models-to-this-repository) into the repository, and view them in the Hub. We advise each organization to create its own folder, separate from others. The models and model changes you would push into the repository are auto-merged, then automatically replicated to the Hub database. They should appear in a few seconds. +Feel free to explore at your leisure. It even allows you to [load your own models](#how-to-load-your-models-to-this-repository) into the repository, and view them in the Hub. We advise each organization to create its own folder, separate from others. The models and model changes you push into the repository are auto-merged, then automatically replicated to the Hub database. They should appear in just a few seconds. -An online user documentation can be found [here](https://hackolade.com/help/Hubuserinterface.html). +The online user documentation for the Hub can be found [here](https://hackolade.com/help/Hubuserinterface.html). -**WARNING:** the Hackolade Model Hub is totally open to anyone, so we strongly suggest to refrain from loading any confidential models. +**WARNING:** this demo of Hackolade Model Hub is open to anyone, so you should refrain from loading any confidential models. Hackolade reserves the right to remove any inappropriate content from this repository, or any content that would negatively affect the platform. ## How to load your models to this repository -This repository is configured with a "Fork & Pull" strategy, very common in open-source, and also in [inner-source](https://hackolade.com/help/Workingwithforks.html). But instead of having a maintainer review your models, we enabled an automatic merge of your models, so you could automatically see your models in the Hub a few seconds after having submitted your Pull Request (see step 4 below.) +You may explore the Hub with models already present in the repo. Loading your own models is optional, but the experience is more meaningful with your own models and terminology. + +This repository is configured with a "Fork & Pull" strategy, very common in open-source, and also in [inner-source](https://hackolade.com/help/Workingwithforks.html). But instead of having a maintainer review your models, we enabled an automatic merge of your models, so you could quickly see your models in the Hub, soon after submitting your Pull Request (see step 4 below.) Follow these steps in order to add models to this repository 1. **Fork the repository** - This step cannot be done in Hackolade Studio. It must be made in GitHub. + This step cannot be done in Hackolade Studio. It must be made in GitHub, and requires that you have a [GitHub account](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) (free.) - Click on this fork button to copy this repository in your own GitHub account. This will open a form like the following + Click on this fork button to copy the repository in your own GitHub account. This will open a form like the following You don't have to change anything, just click `Create fork` -1. Clone the new repository on your workstation by using your favorite Git tool or even better by using [Hackolade Studio](https://hackolade.com/help/Clonearemoterepository.html) to do so +1. Clone the new repository on your workstation with [Hackolade Studio](https://hackolade.com/help/Clonearemoterepository.html), or alternatively with you favorite Git client. > Since this a is a public repository, make sure to not add any confidential models > We advise each organization to create its own folder, separate from others -1. When you are done, [commit and push the model(s)](https://hackolade.com/help/Commitlocalchanges.html) on the forked repository. +1. Create new models or save existing models in the forked repo, then [commit and push the model(s)](https://hackolade.com/help/Commitlocalchanges.html). -1. In Hackolade Studio, [submit a Pull Request from the fork](https://hackolade.com/help/Workingwithforks.html#Submit%20a%20Pull%20Request%20from%20a%20fork). +1. Still in Hackolade Studio, [submit a Pull Request from the fork](https://hackolade.com/help/Workingwithforks.html#Submit%20a%20Pull%20Request%20from%20a%20fork). -1. After a few seconds, your pull request should be merged into the main repository, be replicated with the Hub database, and be visible on https://hub.hackolade.com +1. After a few seconds, your pull request should be merged into the main repository, replicated with the Hub database, then visible on https://hub.hackolade.com -As an alternative to step 4, you can manually do this on GitHub: +As an alternative to step 4, you can manually do this in GitHub screens: 4 alt. On the GitHub page, click on `Contribute` and `Open pull request` like shown on the picture below @@ -47,4 +49,4 @@ As an alternative to step 4, you can manually do this on GitHub: -6 alt. After a few seconds, your pull request should be merged into the main repository, be replicated with the Hub database, and be visible on https://hub.hackolade.com +6 alt. After a few seconds, your pull request should be merged into the main repository, replicated with the Hub database, then visible on https://hub.hackolade.com