ingestron 0.17.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/NOTICE +3 -5
  2. package/README.md +26 -74
  3. package/THIRD_PARTY_NOTICES +148 -0
  4. package/dist/main.js +29708 -0
  5. package/package.json +32 -65
  6. package/project-templates/kafka/README.md +12 -0
  7. package/project-templates/kafka/connections/events.yaml +8 -0
  8. package/project-templates/kafka/contracts/page_views.yaml +13 -0
  9. package/project-templates/kafka/contracts/purchases.yaml +13 -0
  10. package/project-templates/kafka/flows/events.yaml +10 -0
  11. package/project-templates/kafka/project.yaml +10 -0
  12. package/project-templates/kafka/standard.yaml +4 -0
  13. package/project-templates/kafka/template.yaml +3 -0
  14. package/project-templates/minimal/README.md +10 -0
  15. package/project-templates/minimal/connections/shop.yaml +7 -0
  16. package/project-templates/minimal/contracts/orders.yaml +14 -0
  17. package/project-templates/minimal/flows/orders.yaml +6 -0
  18. package/project-templates/minimal/project.yaml +11 -0
  19. package/project-templates/minimal/standard.yaml +4 -0
  20. package/project-templates/minimal/template.yaml +7 -0
  21. package/project-templates/private-files/README.md +29 -0
  22. package/project-templates/private-files/connections/share.yaml +10 -0
  23. package/project-templates/private-files/contracts/sales.yaml +14 -0
  24. package/project-templates/private-files/contracts/stock.yaml +14 -0
  25. package/project-templates/private-files/flows/stores.yaml +9 -0
  26. package/project-templates/private-files/platform.yaml +11 -0
  27. package/project-templates/private-files/project.yaml +19 -0
  28. package/project-templates/private-files/standard.yaml +11 -0
  29. package/project-templates/private-files/template.yaml +10 -0
  30. package/project-templates/private-sql-server/README.md +25 -0
  31. package/project-templates/private-sql-server/connections/erp.yaml +10 -0
  32. package/project-templates/private-sql-server/contracts/customers.yaml +14 -0
  33. package/project-templates/private-sql-server/contracts/invoices.yaml +15 -0
  34. package/project-templates/private-sql-server/flows/erp.yaml +13 -0
  35. package/project-templates/private-sql-server/platform.yaml +11 -0
  36. package/project-templates/private-sql-server/project.yaml +19 -0
  37. package/project-templates/private-sql-server/standard.yaml +17 -0
  38. package/project-templates/private-sql-server/template.yaml +10 -0
  39. package/project-templates/pyspark/README.md +12 -0
  40. package/project-templates/pyspark/connections/billing.yaml +7 -0
  41. package/project-templates/pyspark/contracts/invoices.yaml +16 -0
  42. package/project-templates/pyspark/contracts/monthly_revenue.yaml +14 -0
  43. package/project-templates/pyspark/flows/billing.yaml +6 -0
  44. package/project-templates/pyspark/project.yaml +11 -0
  45. package/project-templates/pyspark/standard.yaml +4 -0
  46. package/project-templates/pyspark/template.yaml +3 -0
  47. package/project-templates/pyspark/transforms/monthly_revenue.py +10 -0
  48. package/project-templates/pyspark/transforms/monthly_revenue.yaml +10 -0
  49. package/project-templates/retail/README.md +22 -0
  50. package/project-templates/retail/connections/shop.yaml +8 -0
  51. package/project-templates/retail/contracts/customers.yaml +12 -0
  52. package/project-templates/retail/contracts/daily_sales.yaml +19 -0
  53. package/project-templates/retail/contracts/orders.yaml +16 -0
  54. package/project-templates/retail/flows/shop.yaml +18 -0
  55. package/project-templates/retail/platform.yaml +21 -0
  56. package/project-templates/retail/project.yaml +18 -0
  57. package/project-templates/retail/standard.yaml +15 -0
  58. package/project-templates/retail/template.yaml +10 -0
  59. package/project-templates/retail/transforms/daily_sales.sql +7 -0
  60. package/project-templates/retail/transforms/daily_sales.yaml +7 -0
  61. package/project-templates/salesforce/README.md +6 -0
  62. package/project-templates/salesforce/connections/salesforce.yaml +7 -0
  63. package/project-templates/salesforce/contracts/accounts.yaml +13 -0
  64. package/project-templates/salesforce/contracts/opportunities.yaml +14 -0
  65. package/project-templates/salesforce/flows/salesforce.yaml +7 -0
  66. package/project-templates/salesforce/project.yaml +9 -0
  67. package/project-templates/salesforce/standard.yaml +4 -0
  68. package/project-templates/salesforce/template.yaml +3 -0
  69. package/project-templates/sql-server/README.md +17 -0
  70. package/project-templates/sql-server/connections/erp.yaml +8 -0
  71. package/project-templates/sql-server/contracts/customer_balances.yaml +13 -0
  72. package/project-templates/sql-server/contracts/customers.yaml +13 -0
  73. package/project-templates/sql-server/contracts/invoices.yaml +14 -0
  74. package/project-templates/sql-server/flows/erp.yaml +13 -0
  75. package/project-templates/sql-server/platform.yaml +6 -0
  76. package/project-templates/sql-server/project.yaml +13 -0
  77. package/project-templates/sql-server/standard.yaml +9 -0
  78. package/project-templates/sql-server/template.yaml +3 -0
  79. package/project-templates/sql-server/transforms/customer_balances.sql +5 -0
  80. package/project-templates/sql-server/transforms/customer_balances.yaml +6 -0
  81. package/recipes/connections/adls-gen2.yaml +7 -0
  82. package/recipes/connections/amazon-rds-oracle.yaml +9 -0
  83. package/recipes/connections/amazon-rds-sqlserver.yaml +9 -0
  84. package/recipes/connections/amazon-redshift.yaml +10 -0
  85. package/recipes/connections/amazon-s3.yaml +8 -0
  86. package/recipes/connections/azure-blob.yaml +7 -0
  87. package/recipes/connections/azure-cosmos-db-mongodb.yaml +8 -0
  88. package/recipes/connections/azure-cosmos-db-nosql.yaml +8 -0
  89. package/recipes/connections/azure-cosmos-postgresql.yaml +10 -0
  90. package/recipes/connections/azure-data-explorer.yaml +8 -0
  91. package/recipes/connections/azure-databricks-delta.yaml +9 -0
  92. package/recipes/connections/azure-files.yaml +8 -0
  93. package/recipes/connections/azure-mysql.yaml +7 -0
  94. package/recipes/connections/azure-postgresql.yaml +10 -0
  95. package/recipes/connections/azure-sql-database.yaml +9 -0
  96. package/recipes/connections/azure-sql-managed-instance.yaml +9 -0
  97. package/recipes/connections/azure-synapse.yaml +9 -0
  98. package/recipes/connections/azure-table-storage.yaml +7 -0
  99. package/recipes/connections/cassandra.yaml +9 -0
  100. package/recipes/connections/dataverse.yaml +9 -0
  101. package/recipes/connections/db2.yaml +7 -0
  102. package/recipes/connections/dynamics-365.yaml +9 -0
  103. package/recipes/connections/dynamics-ax.yaml +11 -0
  104. package/recipes/connections/dynamics-crm.yaml +9 -0
  105. package/recipes/connections/fabric-lakehouse.yaml +8 -0
  106. package/recipes/connections/fabric-warehouse.yaml +9 -0
  107. package/recipes/connections/files.yaml +9 -0
  108. package/recipes/connections/ftp.yaml +9 -0
  109. package/recipes/connections/google-ads.yaml +12 -0
  110. package/recipes/connections/google-bigquery.yaml +8 -0
  111. package/recipes/connections/google-cloud-storage.yaml +8 -0
  112. package/recipes/connections/greenplum.yaml +10 -0
  113. package/recipes/connections/hdfs.yaml +9 -0
  114. package/recipes/connections/hive.yaml +11 -0
  115. package/recipes/connections/http.yaml +7 -0
  116. package/recipes/connections/hubspot.yaml +10 -0
  117. package/recipes/connections/impala.yaml +11 -0
  118. package/recipes/connections/informix.yaml +9 -0
  119. package/recipes/connections/jira.yaml +9 -0
  120. package/recipes/connections/mariadb.yaml +10 -0
  121. package/recipes/connections/microsoft-365.yaml +10 -0
  122. package/recipes/connections/microsoft-access.yaml +9 -0
  123. package/recipes/connections/mongodb-atlas.yaml +8 -0
  124. package/recipes/connections/mongodb.yaml +8 -0
  125. package/recipes/connections/mysql.yaml +10 -0
  126. package/recipes/connections/netezza.yaml +11 -0
  127. package/recipes/connections/odata.yaml +9 -0
  128. package/recipes/connections/odbc.yaml +9 -0
  129. package/recipes/connections/oracle-cloud-storage.yaml +9 -0
  130. package/recipes/connections/oracle.yaml +9 -0
  131. package/recipes/connections/postgresql.yaml +10 -0
  132. package/recipes/connections/presto.yaml +11 -0
  133. package/recipes/connections/quickbooks.yaml +10 -0
  134. package/recipes/connections/rest.yaml +12 -0
  135. package/recipes/connections/s3-compatible.yaml +9 -0
  136. package/recipes/connections/salesforce-service-cloud.yaml +10 -0
  137. package/recipes/connections/salesforce.yaml +10 -0
  138. package/recipes/connections/sap-bw-mdx.yaml +11 -0
  139. package/recipes/connections/sap-bw-open-hub.yaml +11 -0
  140. package/recipes/connections/sap-c4c.yaml +9 -0
  141. package/recipes/connections/sap-ecc.yaml +9 -0
  142. package/recipes/connections/sap-hana.yaml +7 -0
  143. package/recipes/connections/sap-table.yaml +11 -0
  144. package/recipes/connections/servicenow.yaml +9 -0
  145. package/recipes/connections/sftp.yaml +10 -0
  146. package/recipes/connections/sharepoint-online-list.yaml +10 -0
  147. package/recipes/connections/shopify.yaml +8 -0
  148. package/recipes/connections/snowflake.yaml +11 -0
  149. package/recipes/connections/spark.yaml +11 -0
  150. package/recipes/connections/sqlserver.yaml +9 -0
  151. package/recipes/connections/square.yaml +10 -0
  152. package/recipes/connections/sybase.yaml +10 -0
  153. package/recipes/connections/teradata.yaml +9 -0
  154. package/recipes/connections/vertica.yaml +10 -0
  155. package/recipes/connections/web-table.yaml +7 -0
  156. package/recipes/connections/xero.yaml +10 -0
  157. package/recipes/contracts/records.yaml +12 -0
  158. package/recipes/contracts/salesforce-account.yaml +12 -0
  159. package/recipes/flows/adls-gen2.yaml +14 -0
  160. package/recipes/flows/amazon-rds-oracle.yaml +12 -0
  161. package/recipes/flows/amazon-rds-sqlserver.yaml +12 -0
  162. package/recipes/flows/amazon-redshift.yaml +12 -0
  163. package/recipes/flows/amazon-s3.yaml +14 -0
  164. package/recipes/flows/azure-blob.yaml +14 -0
  165. package/recipes/flows/azure-cosmos-db-mongodb.yaml +12 -0
  166. package/recipes/flows/azure-cosmos-db-nosql.yaml +12 -0
  167. package/recipes/flows/azure-cosmos-postgresql.yaml +12 -0
  168. package/recipes/flows/azure-data-explorer.yaml +13 -0
  169. package/recipes/flows/azure-databricks-delta.yaml +15 -0
  170. package/recipes/flows/azure-files.yaml +14 -0
  171. package/recipes/flows/azure-mysql.yaml +12 -0
  172. package/recipes/flows/azure-postgresql.yaml +12 -0
  173. package/recipes/flows/azure-sql-database.yaml +12 -0
  174. package/recipes/flows/azure-sql-managed-instance.yaml +12 -0
  175. package/recipes/flows/azure-synapse.yaml +12 -0
  176. package/recipes/flows/azure-table-storage.yaml +12 -0
  177. package/recipes/flows/cassandra.yaml +12 -0
  178. package/recipes/flows/dataverse.yaml +12 -0
  179. package/recipes/flows/db2.yaml +12 -0
  180. package/recipes/flows/dynamics-365.yaml +12 -0
  181. package/recipes/flows/dynamics-ax.yaml +12 -0
  182. package/recipes/flows/dynamics-crm.yaml +12 -0
  183. package/recipes/flows/fabric-lakehouse.yaml +14 -0
  184. package/recipes/flows/fabric-warehouse.yaml +14 -0
  185. package/recipes/flows/files.yaml +14 -0
  186. package/recipes/flows/ftp.yaml +14 -0
  187. package/recipes/flows/google-ads.yaml +13 -0
  188. package/recipes/flows/google-bigquery.yaml +12 -0
  189. package/recipes/flows/google-cloud-storage.yaml +14 -0
  190. package/recipes/flows/greenplum.yaml +12 -0
  191. package/recipes/flows/hdfs.yaml +14 -0
  192. package/recipes/flows/hive.yaml +12 -0
  193. package/recipes/flows/http.yaml +18 -0
  194. package/recipes/flows/hubspot.yaml +12 -0
  195. package/recipes/flows/impala.yaml +12 -0
  196. package/recipes/flows/informix.yaml +13 -0
  197. package/recipes/flows/jira.yaml +12 -0
  198. package/recipes/flows/mariadb.yaml +13 -0
  199. package/recipes/flows/microsoft-365.yaml +19 -0
  200. package/recipes/flows/microsoft-access.yaml +13 -0
  201. package/recipes/flows/mongodb-atlas.yaml +12 -0
  202. package/recipes/flows/mongodb.yaml +12 -0
  203. package/recipes/flows/mysql.yaml +12 -0
  204. package/recipes/flows/netezza.yaml +13 -0
  205. package/recipes/flows/odata.yaml +12 -0
  206. package/recipes/flows/odbc.yaml +13 -0
  207. package/recipes/flows/oracle-cloud-storage.yaml +14 -0
  208. package/recipes/flows/oracle.yaml +12 -0
  209. package/recipes/flows/postgresql.yaml +18 -0
  210. package/recipes/flows/presto.yaml +12 -0
  211. package/recipes/flows/quickbooks.yaml +12 -0
  212. package/recipes/flows/rest.yaml +21 -0
  213. package/recipes/flows/s3-compatible.yaml +14 -0
  214. package/recipes/flows/salesforce-service-cloud.yaml +12 -0
  215. package/recipes/flows/salesforce.yaml +13 -0
  216. package/recipes/flows/sap-bw-mdx.yaml +14 -0
  217. package/recipes/flows/sap-bw-open-hub.yaml +13 -0
  218. package/recipes/flows/sap-c4c.yaml +12 -0
  219. package/recipes/flows/sap-ecc.yaml +13 -0
  220. package/recipes/flows/sap-hana.yaml +14 -0
  221. package/recipes/flows/sap-table.yaml +13 -0
  222. package/recipes/flows/servicenow.yaml +12 -0
  223. package/recipes/flows/sftp.yaml +14 -0
  224. package/recipes/flows/sharepoint-online-list.yaml +12 -0
  225. package/recipes/flows/shopify.yaml +12 -0
  226. package/recipes/flows/snowflake.yaml +15 -0
  227. package/recipes/flows/spark.yaml +12 -0
  228. package/recipes/flows/sqlserver.yaml +12 -0
  229. package/recipes/flows/square.yaml +13 -0
  230. package/recipes/flows/sybase.yaml +13 -0
  231. package/recipes/flows/teradata.yaml +12 -0
  232. package/recipes/flows/vertica.yaml +12 -0
  233. package/recipes/flows/web-table.yaml +14 -0
  234. package/recipes/flows/xero.yaml +12 -0
  235. package/recipes/platform.yaml +29 -0
  236. package/recipes/project.yaml +10 -0
  237. package/recipes/sample.yaml +3 -0
  238. package/recipes/standard.yaml +15 -0
  239. package/schemas/NOTICE.md +7 -0
  240. package/schemas/connection.schema.yaml +37 -0
  241. package/schemas/flow.schema.yaml +125 -0
  242. package/schemas/odcs-v3.1.0.schema.json +2808 -0
  243. package/schemas/platform.schema.yaml +260 -0
  244. package/schemas/standard.schema.yaml +211 -0
  245. package/schemas/transform.schema.yaml +108 -0
  246. package/templates/apply-contract.py.liquid +58 -0
  247. package/templates/change-data.sql.liquid +20 -0
  248. package/templates/materialised-view.py.liquid +28 -0
  249. package/templates/materialised-view.sql.liquid +4 -0
  250. package/templates/read-files.liquid +7 -0
  251. package/templates/streaming-table.sql.liquid +3 -0
  252. package/templates/table.liquid +17 -0
  253. package/CHANGELOG.md +0 -162
  254. package/SECURITY.md +0 -32
  255. package/THIRD_PARTY_NOTICES.md +0 -3678
  256. package/build/cli/cli/index.d.ts +0 -2
  257. package/build/cli/cli/index.js +0 -685
  258. package/build/cli/cli/operation-worker.d.ts +0 -1
  259. package/build/cli/cli/operation-worker.js +0 -5
  260. package/build/cli/cli/output.d.ts +0 -3
  261. package/build/cli/cli/output.js +0 -246
  262. package/build/cli/cli/plugin-browser.d.ts +0 -14
  263. package/build/cli/cli/plugin-browser.js +0 -74
  264. package/build/cli/cli/plugin-resolution.d.ts +0 -126
  265. package/build/cli/cli/plugin-resolution.js +0 -270
  266. package/build/cli/cli/presentation.d.ts +0 -12
  267. package/build/cli/cli/presentation.js +0 -57
  268. package/build/cli/cli/workflow-commands.d.ts +0 -15
  269. package/build/cli/cli/workflow-commands.js +0 -430
  270. package/build/cli/mcp/index.d.ts +0 -3
  271. package/build/cli/mcp/index.js +0 -67
  272. package/build/cli/version.d.ts +0 -2
  273. package/build/cli/version.js +0 -14
@@ -0,0 +1,10 @@
1
+ from pyspark.sql import functions as F
2
+
3
+
4
+ def transform(tables):
5
+ invoices = tables["invoices"]
6
+ return (
7
+ invoices.where(F.col("status") == "paid")
8
+ .groupBy(F.date_trunc("month", "issued_at").alias("month"), "plan")
9
+ .agg(F.sum("amount").alias("revenue"), F.countDistinct("customer_id").alias("customers"))
10
+ )
@@ -0,0 +1,10 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Transform
3
+ id: monthly_revenue
4
+ inputs: [invoices]
5
+ transform:
6
+ uses: pyspark
7
+ code: ${file:monthly_revenue.py}
8
+ contract: billing.monthly_revenue
9
+ expectations:
10
+ - { name: revenue_not_negative, check: revenue >= 0, action: fail }
@@ -0,0 +1,22 @@
1
+ # Retail example
2
+
3
+ A complete project: web shop files brought into bronze, orders kept current
4
+ from change records, and a silver table of daily sales.
5
+
6
+ | File | What it shows |
7
+ | ----------------------------- | ------------------------------------------------------------------ |
8
+ | `project.yaml` | Values that differ between `dev` and `prod` |
9
+ | `standard.yaml` | The organisation's catalog naming, quality and a fixed setting |
10
+ | `platform.yaml` | Workspace, identity, tags, permissions, schedule and notifications |
11
+ | `connections/shop.yaml` | A files source whose path differs per environment |
12
+ | `flows/shop.yaml` | Change data (`mode: upsert`), CSV options and an expectation |
13
+ | `transforms/daily_sales.yaml` | SQL in its own file, reading two flow tables |
14
+ | `contracts/*.yaml` | ODCS contracts: types, keys and descriptions |
15
+
16
+ ```sh
17
+ pnpm ingestron plan --definitions examples/08-retail --out examples/08-retail/build
18
+ ```
19
+
20
+ The generated files for both environments are in [build/](build/).
21
+ For editor help, run `ingestron schemas` in this folder and add the printed
22
+ setting to VS Code.
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: shop
4
+ description: Files the web shop exports every hour.
5
+ connector: files
6
+ connectivity: public
7
+ settings:
8
+ path: ${values.storage}/shop
@@ -0,0 +1,12 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: shop.customers
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: customers
8
+ logicalType: object
9
+ description: Web shop customers.
10
+ properties:
11
+ - { name: id, logicalType: integer, required: true, primaryKey: true }
12
+ - { name: email, logicalType: string, required: true }
@@ -0,0 +1,19 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: shop.daily_sales
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: daily_sales
8
+ logicalType: object
9
+ description: Order totals per customer and day.
10
+ properties:
11
+ - {
12
+ name: email,
13
+ logicalType: string,
14
+ required: true,
15
+ primaryKey: true,
16
+ primaryKeyPosition: 1,
17
+ }
18
+ - { name: day, logicalType: date, required: true, primaryKey: true, primaryKeyPosition: 2 }
19
+ - { name: total, logicalType: number, physicalType: "DECIMAL(18,2)" }
@@ -0,0 +1,16 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: shop.orders
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: orders
8
+ logicalType: object
9
+ description: One row per order, kept current.
10
+ properties:
11
+ - { name: id, logicalType: integer, required: true, primaryKey: true }
12
+ - { name: customer_id, logicalType: integer, required: true }
13
+ - { name: ordered_at, logicalType: timestamp, required: true }
14
+ - { name: total, logicalType: number, physicalType: "DECIMAL(18,2)" }
15
+ - { name: updated_at, logicalType: timestamp, required: true }
16
+ - { name: op, logicalType: string }
@@ -0,0 +1,18 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Flow
3
+ id: shop
4
+ description: Orders and customers from the web shop.
5
+ source: shop
6
+ tables:
7
+ orders:
8
+ object: orders
9
+ contract: shop.orders
10
+ store:
11
+ with: { mode: upsert, sequence_by: updated_at, delete_when: "op = 'D'", except_columns: [op] }
12
+ expectations:
13
+ - { name: positive_total, check: total >= 0 }
14
+ customers:
15
+ object: customers
16
+ contract: shop.customers
17
+ ingest:
18
+ with: { format: csv, options: { header: true } }
@@ -0,0 +1,21 @@
1
+ # Where this project's assets go. Values differ per environment.
2
+ apiVersion: ingestron.io/v1
3
+ kind: Platform
4
+ id: lakehouse
5
+ workspace:
6
+ host: ${values.host}
7
+ run_as:
8
+ service_principal_name: 7f3c2a10-0000-4000-8000-000000000001
9
+ tags:
10
+ team: sales
11
+ environment: ${environment.name}
12
+ permissions:
13
+ - group_name: sales-engineers
14
+ level: CAN_MANAGE
15
+ - group_name: sales-analysts
16
+ level: CAN_VIEW
17
+ schedule:
18
+ cron: 0 0 5 * * ?
19
+ timezone: Pacific/Auckland
20
+ notifications:
21
+ on_failure: [sales-data@example.com]
@@ -0,0 +1,18 @@
1
+ id: retail
2
+ name: Retail sales
3
+ values:
4
+ host: https://adb-1111111111111111.1.azuredatabricks.net
5
+ storage: abfss://landing@retaildev.dfs.core.windows.net
6
+ environments:
7
+ dev: {}
8
+ prod:
9
+ values:
10
+ host: https://adb-2222222222222222.2.azuredatabricks.net
11
+ storage: abfss://landing@retailprod.dfs.core.windows.net
12
+ imports:
13
+ - standard.yaml
14
+ - platform.yaml
15
+ - connections/*.yaml
16
+ - flows/*.yaml
17
+ - transforms/*.yaml
18
+ - contracts/*.yaml
@@ -0,0 +1,15 @@
1
+ # How the organisation builds data products. Shared by every project.
2
+ apiVersion: ingestron.io/v1
3
+ kind: Standard
4
+ id: acme
5
+ packs: [databricks@1]
6
+ naming:
7
+ catalog: "{{ environment }}_sales"
8
+ quality:
9
+ required: drop
10
+ store:
11
+ settings:
12
+ streaming-table:
13
+ properties: { delta.enableChangeDataFeed: "true" }
14
+ fixed:
15
+ streaming-table: { cluster_by: auto }
@@ -0,0 +1,10 @@
1
+ # Used by `ingestron init --template retail`.
2
+ title: Retail
3
+ summary: "A complete project: files into bronze, orders kept current from change records, and daily sales in silver."
4
+ questions:
5
+ - value: host
6
+ ask: "Databricks workspace URL"
7
+ default: https://adb-1111111111111111.1.azuredatabricks.net
8
+ - value: storage
9
+ ask: "Storage account URL for the landing files"
10
+ default: abfss://landing@retaildev.dfs.core.windows.net
@@ -0,0 +1,7 @@
1
+ SELECT
2
+ c.email,
3
+ DATE(o.ordered_at) AS day,
4
+ SUM(o.total) AS total
5
+ FROM {{ tables.orders }} AS o
6
+ JOIN {{ tables.customers }} AS c ON c.id = o.customer_id
7
+ GROUP BY c.email, DATE(o.ordered_at)
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Transform
3
+ id: daily_sales
4
+ description: Order totals per customer and day.
5
+ inputs: [orders, customers]
6
+ code: ${file:daily_sales.sql}
7
+ contract: shop.daily_sales
@@ -0,0 +1,6 @@
1
+ # Salesforce
2
+
3
+ Two Salesforce objects through a Unity Catalog connection. SaaS sources need
4
+ no gateway: [one ingestion pipeline](build/dev/resources/crm_salesforce_ingestion.pipeline.yml)
5
+ writes `accounts` and `opportunities`, keyed by `Id`, with only the
6
+ contract's fields.
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: salesforce
4
+ connector: salesforce
5
+ connectivity: public
6
+ settings:
7
+ uc_connection: salesforce_prod
@@ -0,0 +1,13 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: crm.accounts
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: accounts
8
+ logicalType: object
9
+ description: Salesforce accounts.
10
+ properties:
11
+ - { name: Id, logicalType: string, required: true, primaryKey: true }
12
+ - { name: Name, logicalType: string }
13
+ - { name: Industry, logicalType: string }
@@ -0,0 +1,14 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: crm.opportunities
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: opportunities
8
+ logicalType: object
9
+ description: Salesforce opportunities.
10
+ properties:
11
+ - { name: Id, logicalType: string, required: true, primaryKey: true }
12
+ - { name: AccountId, logicalType: string }
13
+ - { name: Amount, logicalType: number }
14
+ - { name: StageName, logicalType: string }
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Flow
3
+ id: salesforce
4
+ source: salesforce
5
+ tables:
6
+ accounts: { object: Account, contract: crm.accounts }
7
+ opportunities: { object: Opportunity, contract: crm.opportunities }
@@ -0,0 +1,9 @@
1
+ # Salesforce objects ingested with Lakeflow Connect; no gateway is needed.
2
+ id: crm
3
+ environments:
4
+ dev: {}
5
+ imports:
6
+ - standard.yaml
7
+ - connections/*.yaml
8
+ - flows/*.yaml
9
+ - contracts/*.yaml
@@ -0,0 +1,4 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Standard
3
+ id: crm
4
+ packs: [databricks@1]
@@ -0,0 +1,3 @@
1
+ # Used by `ingestron init --template salesforce`.
2
+ title: Salesforce through Lakeflow Connect
3
+ summary: Two Salesforce objects through a Unity Catalog connection, keyed and limited to the contract's fields.
@@ -0,0 +1,17 @@
1
+ # SQL Server
2
+
3
+ The ERP database is reachable from the workspace over private networking
4
+ (`connectivity: workspace`), so the pack ingests it with Lakeflow Connect:
5
+
6
+ - [a gateway](build/prod/resources/erp_erp_gateway.pipeline.yml) that captures
7
+ changes continuously, with the cluster policy from the standard;
8
+ - [an ingestion pipeline](build/prod/resources/erp_erp_ingestion.pipeline.yml)
9
+ that writes `customers` (SCD type 1) and `invoices` (SCD type 2, from
10
+ `mode: history`), each with only its contract's columns;
11
+ - [our pipeline](build/prod/src/erp/silver/customer_balances.sql), whose
12
+ transform reads both, using the current invoice versions;
13
+ - [a job](build/prod/resources/erp_refresh.job.yml) that refreshes ingestion
14
+ first and our pipeline after it.
15
+
16
+ The Unity Catalog connection `erp_sqlserver_<environment>` must exist; the
17
+ definitions name it but hold no credentials.
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: erp
4
+ description: The ERP's SQL Server, reachable from the workspace through ExpressRoute.
5
+ connector: sqlserver
6
+ connectivity: workspace
7
+ settings:
8
+ uc_connection: erp_sqlserver_${environment.name} # created by an administrator beforehand
@@ -0,0 +1,13 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: erp.customer_balances
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: customer_balances
8
+ logicalType: object
9
+ description: Open balance per customer.
10
+ properties:
11
+ - { name: customer_id, logicalType: integer, required: true, primaryKey: true }
12
+ - { name: name, logicalType: string }
13
+ - { name: balance, logicalType: number, physicalType: "DECIMAL(18,2)" }
@@ -0,0 +1,13 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: erp.customers
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: customers
8
+ logicalType: object
9
+ description: ERP customers.
10
+ properties:
11
+ - { name: customer_id, logicalType: integer, required: true, primaryKey: true }
12
+ - { name: name, logicalType: string }
13
+ - { name: country, logicalType: string }
@@ -0,0 +1,14 @@
1
+ apiVersion: v3.1.0
2
+ kind: DataContract
3
+ id: erp.invoices
4
+ version: 1.0.0
5
+ status: active
6
+ schema:
7
+ - name: invoices
8
+ logicalType: object
9
+ description: ERP invoices with every past version.
10
+ properties:
11
+ - { name: invoice_id, logicalType: integer, required: true, primaryKey: true }
12
+ - { name: customer_id, logicalType: integer, required: true }
13
+ - { name: amount, logicalType: number, physicalType: "DECIMAL(18,2)" }
14
+ - { name: status, logicalType: string }
@@ -0,0 +1,13 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Flow
3
+ id: erp
4
+ source: erp
5
+ tables:
6
+ customers:
7
+ object: erp.dbo.Customers
8
+ contract: erp.customers
9
+ invoices:
10
+ object: erp.dbo.Invoices
11
+ contract: erp.invoices
12
+ ingest:
13
+ with: { mode: history } # keep every version of an invoice
@@ -0,0 +1,6 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Platform
3
+ id: lakehouse
4
+ schedule:
5
+ cron: 0 0 * * * ?
6
+ timezone: Pacific/Auckland
@@ -0,0 +1,13 @@
1
+ # A SQL Server database reached over private networking from the workspace,
2
+ # ingested with Lakeflow Connect, then summarised by our own pipeline.
3
+ id: erp
4
+ environments:
5
+ dev: {}
6
+ prod: {}
7
+ imports:
8
+ - standard.yaml
9
+ - platform.yaml
10
+ - connections/*.yaml
11
+ - flows/*.yaml
12
+ - transforms/*.yaml
13
+ - contracts/*.yaml
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Standard
3
+ id: erp
4
+ packs: [databricks@1]
5
+ naming:
6
+ catalog: erp_{{ environment }}
7
+ ingest:
8
+ settings:
9
+ lakeflow-connect: { gateway_policy_id: 0011AABBCCDDEEFF }
@@ -0,0 +1,3 @@
1
+ # Used by `ingestron init --template sql-server`.
2
+ title: SQL Server through Lakeflow Connect
3
+ summary: A gateway and an ingestion pipeline for SQL Server, then the pipeline that reads the ingested tables.
@@ -0,0 +1,5 @@
1
+ SELECT c.customer_id, c.name, SUM(i.amount) AS balance
2
+ FROM {{ tables.customers }} AS c
3
+ JOIN {{ tables.invoices }} AS i ON i.customer_id = c.customer_id
4
+ WHERE i.__END_AT IS NULL AND i.status = 'open'
5
+ GROUP BY c.customer_id, c.name
@@ -0,0 +1,6 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Transform
3
+ id: customer_balances
4
+ inputs: [customers, invoices]
5
+ code: ${file:customer_balances.sql}
6
+ contract: erp.customer_balances
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: adls_gen2
4
+ connector: adls-gen2
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: amazon_rds_oracle
4
+ connector: amazon-rds-oracle
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ user: "reader"
9
+ password: "${secret:source-password}"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: amazon_rds_sqlserver
4
+ connector: amazon-rds-sqlserver
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ user: "reader"
9
+ password: "${secret:source-password}"
@@ -0,0 +1,10 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: amazon_redshift
4
+ connector: amazon-redshift
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ database: "sales"
9
+ user: "reader"
10
+ password: "${secret:source-password}"
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: amazon_s3
4
+ connector: amazon-s3
5
+ connectivity: private
6
+ settings:
7
+ access_key: "synthetic-access_key"
8
+ secret_key: "${secret:source-secret-key}"
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_blob
4
+ connector: azure-blob
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_cosmos_db_mongodb
4
+ connector: azure-cosmos-db-mongodb
5
+ connectivity: private
6
+ settings:
7
+ connection_string: "${secret:source-connection-string}"
8
+ database: "sales"
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_cosmos_db_nosql
4
+ connector: azure-cosmos-db-nosql
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
8
+ database: "sales"
@@ -0,0 +1,10 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_cosmos_postgresql
4
+ connector: azure-cosmos-postgresql
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ database: "sales"
9
+ user: "reader"
10
+ password: "${secret:source-password}"
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_data_explorer
4
+ connector: azure-data-explorer
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
8
+ database: "sales"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_databricks_delta
4
+ connector: azure-databricks-delta
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
8
+ cluster_id: "synthetic-cluster_id"
9
+ workspace_resource_id: "synthetic-workspace_resource_id"
@@ -0,0 +1,8 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_files
4
+ connector: azure-files
5
+ connectivity: private
6
+ settings:
7
+ connection_string: "${secret:source-connection-string}"
8
+ share: "synthetic-share"
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_mysql
4
+ connector: azure-mysql
5
+ connectivity: private
6
+ settings:
7
+ connection_string: "${secret:source-connection-string}"
@@ -0,0 +1,10 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_postgresql
4
+ connector: azure-postgresql
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ database: "sales"
9
+ user: "reader"
10
+ password: "${secret:source-password}"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_sql_database
4
+ connector: azure-sql-database
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ user: "reader"
9
+ password: "${secret:source-password}"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_sql_managed_instance
4
+ connector: azure-sql-managed-instance
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ user: "reader"
9
+ password: "${secret:source-password}"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_synapse
4
+ connector: azure-synapse
5
+ connectivity: private
6
+ settings:
7
+ server: "source.example.test"
8
+ user: "reader"
9
+ password: "${secret:source-password}"
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: azure_table_storage
4
+ connector: azure-table-storage
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: cassandra
4
+ connector: cassandra
5
+ connectivity: private
6
+ settings:
7
+ host: "source.example.test"
8
+ user: "reader"
9
+ password: "${secret:source-password}"
@@ -0,0 +1,9 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: dataverse
4
+ connector: dataverse
5
+ connectivity: private
6
+ settings:
7
+ url: "https://source.example.test"
8
+ client_id: "synthetic-client"
9
+ client_secret: "${secret:source-client-secret}"
@@ -0,0 +1,7 @@
1
+ apiVersion: ingestron.io/v1
2
+ kind: Connection
3
+ id: db2
4
+ connector: db2
5
+ connectivity: private
6
+ settings:
7
+ connection_string: "${secret:source-connection-string}"