[{"data":1,"prerenderedAt":1044},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fsources\u002Fflow-outputs":3,"docs-nav":832},{"id":4,"title":5,"body":6,"description":16,"extension":824,"meta":825,"navigation":827,"path":828,"seo":829,"stem":830,"__hash__":831},"docs\u002Fdocs\u002Fsources\u002Fflow-outputs.md","Flow and SQL script results",{"type":7,"value":8,"toc":806},"minimark",[9,13,17,22,129,132,136,141,147,215,227,234,245,249,252,275,290,296,300,303,306,309,313,330,341,345,360,364,368,382,476,482,486,494,581,604,608,611,651,658,662,716,723,727,762,766,802],[10,11,5],"h1",{"id":12},"flow-and-sql-script-results",[14,15,16],"p",{},"A flow, a SQL script or a saved Python or R script can write its result into a\ndatasource of the catalog, where other flows, saved views, scripts, the Viewer and the AI\nassistant read it like any other. The first write creates the datasource; every later\nwrite replaces its data and keeps its id, so whatever reads it keeps working. This is\nhow cleaned, joined and aggregated tables are shared.",[18,19,21],"h2",{"id":20},"at-a-glance","At a glance",[23,24,25,44],"table",{},[26,27,28],"thead",{},[29,30,31,35,38,41],"tr",{},[32,33,34],"th",{},"Writer",[32,36,37],{},"Where it is set",[32,39,40],{},"When it writes",[32,42,43],{},"Overwrites an existing datasource",[45,46,47,71,91,112],"tbody",{},[29,48,49,53,61,68],{},[50,51,52],"td",{},"Flow, Output node",[50,54,55,56,60],{},"Output node, destination ",[57,58,59],"strong",{},"Tabularia Datasource",": name, folder, description, «Overwrite if it already exists», «Order by»",[50,62,63,64,67],{},"At every run: ",[57,65,66],{},"Run"," in the editor, «Run now with the production engine» in the Flows page, the flow's schedule, a flow group",[50,69,70],{},"Only with «Overwrite if it already exists» ticked",[29,72,73,76,85,88],{},[50,74,75],{},"Flow without Output nodes",[50,77,78,80,81,84],{},[57,79,66],{}," → ",[57,82,83],{},"Publish the output as a datasource",": name, folder, description",[50,86,87],{},"That run",[50,89,90],{},"Never: an existing name is refused",[29,92,93,96,103,109],{},[50,94,95],{},"SQL script",[50,97,98,99,102],{},"The ",[57,100,101],{},"Datasource"," card beside the editor: name and folder",[50,104,105,108],{},[57,106,107],{},"Refresh now",", the script's schedule, a flow group",[50,110,111],{},"Always",[29,113,114,117,123,126],{},[50,115,116],{},"Saved Python or R script",[50,118,119,122],{},[57,120,121],{},"Also publish it as a datasource"," on the script's page",[50,124,125],{},"At every run of the script",[50,127,128],{},"As chosen: «Replace it at every run»",[14,130,131],{},"Written datasources carry the tag «flow» in the Datasources page. They have no refresh\nbutton: they change when their writer runs.",[18,133,135],{"id":134},"how-it-works","How it works",[137,138,140],"h3",{"id":139},"the-output-node-tabularia-datasource","The Output node «Tabularia Datasource»",[14,142,143,144,146],{},"An Output node at the end of a chain, with destination ",[57,145,59],{},", has:",[23,148,149,159],{},[26,150,151],{},[29,152,153,156],{},[32,154,155],{},"Field",[32,157,158],{},"Meaning",[45,160,161,169,177,185,193,201],{},[29,162,163,166],{},[50,164,165],{},"Datasource name",[50,167,168],{},"The name in the catalog. Unique in its folder.",[29,170,171,174],{},[50,172,173],{},"Folder",[50,175,176],{},"Where the datasource lives, and so who can read it.",[29,178,179,182],{},[50,180,181],{},"Description (optional)",[50,183,184],{},"Written on the datasource at every run.",[29,186,187,190],{},[50,188,189],{},"Overwrite if it already exists",[50,191,192],{},"Ticked: a datasource with this name in the folder gets the new data, keeping its id and name. Not ticked: a run finding the name taken is refused before it starts («There is already a datasource … in this folder»).",[29,194,195,198],{},[50,196,197],{},"Order by",[50,199,200],{},"Columns, in order: the result is sorted before it is written, and the datasource keeps them as its sort keys.",[29,202,203,206],{},[50,204,205],{},"Also copy the file to external S3",[50,207,208,209,214],{},"A copy of the same Parquet file to an S3 connection, at a fixed key or one with ",[210,211,213],"a",{"href":212},"\u002Fdocs\u002Fplaceholders","placeholders",". If the copy fails the run still succeeds, and the error is in the run's history.",[14,216,217,218,220,221,223,224,226],{},"The flow must be saved: Output nodes run through the run history. ",[57,219,66],{}," launches one\nrun per Output node; the run reads the flow's sources, computes the chain on a worker\nand writes a new Parquet file. When the flow has no Output node, ",[57,222,66],{}," offers\n",[57,225,83],{}," for the result of its last step instead.",[14,228,229],{},[230,231],"img",{"alt":232,"src":233},"The Output node of Margin by Category and Month selected in the editor: destination Tabularia Datasource, name, folder Private tables, Overwrite if it already exists ticked, the order-by columns","\u002Fmedia\u002Fguide\u002Fsources\u002Foutput-node-datasource.png",[14,235,236],{},[237,238,239,240,244],"em",{},"The Output node of the sample flow «Margin by Category and Month»: it publishes the datasource of the same name in ",[241,242,243],"code",{},"Sample \u002F Private tables",", overwriting it at every run.",[137,246,248],{"id":247},"what-an-overwrite-does","What an overwrite does",[14,250,251],{},"At the end of a successful run the datasource is pointed at the new file in one step:",[253,254,255,263,266,272],"ul",{},[256,257,258,259,262],"li",{},"its ",[57,260,261],{},"id and name stay",", so flows, saved views, SQL scripts and saved Python or R\nscripts that read it keep working;",[256,264,265],{},"its rows, columns, description and sort keys are those of this run;",[256,267,258,268,271],{},[57,269,270],{},"field descriptions stay",", for the columns that are still there;",[256,273,274],{},"the previous file is deleted after a grace period, since a run that started earlier\nmay still be reading it.",[14,276,277,280,281,284,285,289],{},[57,278,279],{},"The data contract is checked first."," When the datasource has a contract, the worker\nevaluates it on the new data before anything is replaced; a failing rule of severity\n",[237,282,283],{},"error"," refuses the data, the datasource keeps the last good snapshot and the run says\nwhich rule failed. See ",[210,286,288],{"href":287},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",".",[14,291,292,295],{},[57,293,294],{},"The later read wins."," When two runs write the same datasource and overlap, the one\nthat started later wins, even if the other finishes after it: a run that read older data\nnever replaces newer data.",[137,297,299],{"id":298},"who-may-overwrite-what","Who may overwrite what",[14,301,302],{},"Only datasources that a flow or a script wrote can be overwritten. A datasource imported\nfrom a database, a file folder, SharePoint or an API is never replaced by a flow or a\nscript: the run is refused before it starts («… is a datasource of kind «database»: a\nflow cannot overwrite it, choose another name»). An import keeps its own refresh, its\nschedule and its connection.",[14,304,305],{},"Between writers there is no such barrier: a flow can overwrite a datasource a SQL script\nwrote, and the other way round. Give each written datasource one writer.",[14,307,308],{},"When the name is free at launch but another run takes it before this one ends, the\ndatasource is created as «name (xxxxxxxx)», with the start of the task's id.",[137,310,312],{"id":311},"sql-scripts","SQL scripts",[14,314,315,316,319,320,322,323,326,327,329],{},"A ",[210,317,95],{"href":318},"\u002Fdocs\u002Fsql-scripts"," keeps its whole result in a datasource: in the\n",[57,321,101],{}," card give it a name and a folder, ",[57,324,325],{},"Save",", then ",[57,328,107],{},". The\nsaved version is written, not the text in the editor. The script's engine computes it on\nthe catalog, or the database computes it when the script runs on a connection. The card\nshows the last write: when, how many rows, who started it, and why it failed.",[14,331,332,333,336,337,289],{},"A script always overwrites its datasource, under the same rules as a flow: the contract\nfirst, the id kept, never an imported datasource. Each write sets the datasource's\ndescription to «Written by the SQL script «name»» and clears its sort keys. ",[57,334,335],{},"Schedule","\nwrites it on a cron with the rights of whoever set it; in a flow group the script is a\ncell that writes in its step. The details are in\n",[210,338,340],{"href":339},"\u002Fdocs\u002Fsql-scripts#writing-the-result-into-a-datasource","Writing the result into a datasource",[137,342,344],{"id":343},"python-and-r-scripts","Python and R scripts",[14,346,347,348,351,352,355,356,289],{},"A saved script writes a Parquet file at ",[241,349,350],{},"TABULARIA_OUTPUT","; with ",[57,353,354],{},"Also publish it as a\ndatasource"," it becomes a datasource in the folder you choose, replaced at every run or\nnot. Its description says «Written by the saved script «name»». Scripting runs on\nKubernetes installations with scripting environments turned on: see\n",[210,357,359],{"href":358},"\u002Fdocs\u002Fscripting#output","Python and R",[18,361,363],{"id":362},"examples","Examples",[137,365,367],{"id":366},"a-flow-that-publishes-revenue-by-channel-every-morning","A flow that publishes revenue by channel, every morning",[14,369,370,371,374,375,378,379,381],{},"With the sample datasources ",[241,372,373],{},"orders"," and ",[241,376,377],{},"order_rows"," (folder ",[241,380,243],{},"):",[383,384,385,407,425,453,464],"ol",{},[256,386,387,390,391,394,395,374,397,399,400,403,404,289],{},[57,388,389],{},"New → New flow"," in ",[241,392,393],{},"Sample \u002F Flows",". Add two sources, ",[241,396,377],{},[241,398,373],{},",\njoin them on the order id, keep the orders whose ",[241,401,402],{},"stato"," is not ",[241,405,406],{},"annullato",[256,408,409,410,413,414,417,418,421,422,289],{},"Compute ",[241,411,412],{},"ricavo_netto = quantita * prezzo_unitario * (1 - sconto_pct \u002F 100)",", then\ngroup by ",[241,415,416],{},"canale"," and the month of ",[241,419,420],{},"data_ordine",", summing ",[241,423,424],{},"ricavo_netto",[256,426,427,428,431,432,434,435,438,439,442,443,446,447,449,450,452],{},"Add an ",[57,429,430],{},"Output"," node: ",[57,433,59],{},", name ",[241,436,437],{},"revenue_by_channel_month",",\nfolder ",[241,440,441],{},"Sample \u002F Public tables",", description ",[237,444,445],{},"Net revenue by sales channel and\nmonth, cancelled orders excluded",", ",[57,448,189],{}," ticked,\n",[57,451,197],{}," the month column.",[256,454,455,456,458,459,461,462,289],{},"Save, ",[57,457,66],{},". ",[241,460,437],{}," appears in ",[241,463,441],{},[256,465,466,467,470,471,374,473,475],{},"Schedule the flow (",[241,468,469],{},"0 6 * * *","), or put it in a flow group after a step that\nrefreshes ",[241,472,373],{},[241,474,377],{},", so it always reads the morning's data.",[14,477,478,479,481],{},"People with VIEW on ",[241,480,441],{}," read the result without seeing the order\nlines it comes from.",[137,483,485],{"id":484},"a-sql-script-that-keeps-the-cancelled-orders-by-depot","A SQL script that keeps the cancelled orders by depot",[14,487,488,390,491,493],{},[57,489,490],{},"New → SQL script",[241,492,393],{},", on the catalog:",[495,496,501],"pre",{"className":497,"code":498,"language":499,"meta":500,"style":500},"language-sql shiki shiki-themes github-dark-dimmed github-light","SELECT deposito, canale, count(*) AS ordini_annullati\nFROM \"orders\"\nWHERE stato = 'annullato'\nGROUP BY deposito, canale\nORDER BY ordini_annullati DESC\n","sql","",[241,502,503,535,545,560,569],{"__ignoreMap":500},[504,505,508,512,516,520,523,526,529,532],"span",{"class":506,"line":507},"line",1,[504,509,511],{"class":510},"s6PUj","SELECT",[504,513,515],{"class":514},"ssh_m"," deposito, canale, ",[504,517,519],{"class":518},"swcJU","count",[504,521,522],{"class":514},"(",[504,524,525],{"class":510},"*",[504,527,528],{"class":514},") ",[504,530,531],{"class":510},"AS",[504,533,534],{"class":514}," ordini_annullati\n",[504,536,538,541],{"class":506,"line":537},2,[504,539,540],{"class":510},"FROM",[504,542,544],{"class":543},"sXfbr"," \"orders\"\n",[504,546,548,551,554,557],{"class":506,"line":547},3,[504,549,550],{"class":510},"WHERE",[504,552,553],{"class":514}," stato ",[504,555,556],{"class":510},"=",[504,558,559],{"class":543}," 'annullato'\n",[504,561,563,566],{"class":506,"line":562},4,[504,564,565],{"class":510},"GROUP BY",[504,567,568],{"class":514}," deposito, canale\n",[504,570,572,575,578],{"class":506,"line":571},5,[504,573,574],{"class":510},"ORDER BY",[504,576,577],{"class":514}," ordini_annullati ",[504,579,580],{"class":510},"DESC\n",[14,582,583,584,586,587,590,591,458,593,326,595,458,597,599,600,603],{},"In the ",[57,585,101],{}," card: name ",[241,588,589],{},"cancelled_orders_by_depot",", folder\n",[241,592,441],{},[57,594,325],{},[57,596,107],{},[57,598,335],{}," ",[241,601,602],{},"30 6 * * *","\nwrites it again every morning, after the orders are refreshed.",[137,605,607],{"id":606},"calling-it-from-outside","Calling it from outside",[14,609,610],{},"A scheduler of your own can run the flow and so rewrite its datasource, with a token of\nan account that has RUN on the flow's folder and EDIT on the datasource's:",[495,612,616],{"className":613,"code":614,"language":615,"meta":500,"style":500},"language-bash shiki shiki-themes github-dark-dimmed github-light","curl -X POST -H \"Authorization: Bearer tab_…\" \\\n  https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fflows\u002F42\u002Frun-now\n# 202 {\"run_id\": 1234}: then GET \u002Fruns\u002F1234\n","bash",[241,617,618,640,645],{"__ignoreMap":500},[504,619,620,624,627,630,633,636],{"class":506,"line":507},[504,621,623],{"class":622},"sqRhv","curl",[504,625,626],{"class":518}," -X",[504,628,629],{"class":543}," POST",[504,631,632],{"class":518}," -H",[504,634,635],{"class":543}," \"Authorization: Bearer tab_…\"",[504,637,639],{"class":638},"sxsTv"," \\\n",[504,641,642],{"class":506,"line":537},[504,643,644],{"class":543},"  https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fflows\u002F42\u002Frun-now\n",[504,646,647],{"class":506,"line":547},[504,648,650],{"class":649},"sgHix","# 202 {\"run_id\": 1234}: then GET \u002Fruns\u002F1234\n",[14,652,653,654,289],{},"See ",[210,655,657],{"href":656},"\u002Fdocs\u002Fapi","API",[18,659,661],{"id":660},"permissions","Permissions",[23,663,664,674],{},[26,665,666],{},[29,667,668,671],{},[32,669,670],{},"To",[32,672,673],{},"You need",[45,675,676,684,692,700,708],{},[29,677,678,681],{},[50,679,680],{},"Write a datasource from a flow",[50,682,683],{},"RUN on the flow's folder and EDIT on the datasource's folder (and VIEW on what the flow reads)",[29,685,686,689],{},[50,687,688],{},"Write it from a SQL script",[50,690,691],{},"RUN on the script's folder and EDIT on the datasource's folder; the datasources the SQL names readable, or CONNECT on the script's connection",[29,693,694,697],{},[50,695,696],{},"Choose the folder of a SQL script's datasource",[50,698,699],{},"EDIT on that folder",[29,701,702,705],{},[50,703,704],{},"Read the result",[50,706,707],{},"VIEW on the datasource's folder only: not on the flow, the script or their sources",[29,709,710,713],{},[50,711,712],{},"Rename, describe, move, delete the datasource",[50,714,715],{},"EDIT on its folder",[14,717,718,719,722],{},"Scheduled runs and writes act with the rights of whoever set the schedule, checked again\nevery time. Every write of a SQL script is in the audit log (",[241,720,721],{},"sql_script.publish","), with\nits SQL; every flow run is in the run history.",[18,724,726],{"id":725},"limits-and-good-to-know","Limits and good to know",[253,728,729,735,741,747,753,759],{},[256,730,731,734],{},[57,732,733],{},"Settings live on the writer."," The description and the sort keys of a written\ndatasource are set again at every write, from the Output node (or, for a SQL script,\nto the fixed description and no sort keys). Change them on the node; a description\nedited in the Datasources page lasts until the next write. Field descriptions are kept.",[256,736,737,740],{},[57,738,739],{},"A scheduled flow needs «Overwrite if it already exists»",": without it, the first run\ncreates the datasource and every later run is refused because the name is taken.",[256,742,743,746],{},[57,744,745],{},"No refresh from the Datasources page",": refresh, schedule and «Datasources to\nrefresh» in a flow group are for imported datasources. A written one is updated by\nrunning its writer.",[256,748,749,752],{},[57,750,751],{},"Deleting the flow"," keeps the datasources it published: they stay as they were, and\nnothing updates them any more.",[256,754,755,758],{},[57,756,757],{},"One file per write",": the whole result is written again each time; a write never\nappends to the previous data.",[256,760,761],{},"A datasource used by saved views cannot be deleted until the views are.",[18,763,765],{"id":764},"related","Related",[253,767,768,775,782,789,797],{},[256,769,770,774],{},[210,771,773],{"href":772},"\u002Fdocs\u002Fsources","All sources",": snapshots, descriptions, contracts, permissions.",[256,776,777,781],{},[210,778,780],{"href":779},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",": sources, operations, Output nodes.",[256,783,784,374,786,289],{},[210,785,312],{"href":318},[210,787,359],{"href":788},"\u002Fdocs\u002Fscripting",[256,790,791,374,795,289],{},[210,792,794],{"href":793},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",[210,796,288],{"href":287},[256,798,799,289],{},[210,800,661],{"href":801},"\u002Fdocs\u002Fgovernance\u002Fpermissions",[803,804,805],"style",{},"html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .sxsTv, html code.shiki .sxsTv{--shiki-default:#F47067;--shiki-light:#005CC5}html pre.shiki code .sgHix, html code.shiki .sgHix{--shiki-default:#768390;--shiki-light:#6A737D}",{"title":500,"searchDepth":537,"depth":547,"links":807},[808,809,816,821,822,823],{"id":20,"depth":537,"text":21},{"id":134,"depth":537,"text":135,"children":810},[811,812,813,814,815],{"id":139,"depth":547,"text":140},{"id":247,"depth":547,"text":248},{"id":298,"depth":547,"text":299},{"id":311,"depth":547,"text":312},{"id":343,"depth":547,"text":344},{"id":362,"depth":537,"text":363,"children":817},[818,819,820],{"id":366,"depth":547,"text":367},{"id":484,"depth":547,"text":485},{"id":606,"depth":547,"text":607},{"id":660,"depth":537,"text":661},{"id":725,"depth":537,"text":726},{"id":764,"depth":537,"text":765},"md",{"source":826},"docs\u002Fsources\u002Fflow-outputs.md",true,"\u002Fdocs\u002Fsources\u002Fflow-outputs",{"title":5,"description":16},"docs\u002Fsources\u002Fflow-outputs","zjBtinbiu8tFn2axSGUHdDjSBrPBUNDEFBMRNQXuzF4",[833,852,899,928,960,988,1010,1036],{"title":834,"icon":835,"intro":836,"items":837},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[838,840,843,846,849],{"path":839,"title":834},"\u002Fdocs\u002Fgetting-started",{"path":841,"title":842},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":844,"title":845},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":847,"title":848},"\u002Fdocs\u002Fconcepts","Concepts",{"path":850,"title":851},"\u002Fdocs\u002Foverview","Overview (README)",{"title":853,"icon":854,"intro":855,"items":856},"Capabilities","capabilities","What you can build: visual flows, analysis on any step, AI questions, pixel-perfect reports, dashboards, Python, R and SQL scripts, containers and the orchestration that ties them together.",[857,860,861,864,867,870,873,876,877,878,881,884,887,888,891,893,896],{"path":858,"title":859},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":779,"title":780},{"path":862,"title":863},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":865,"title":866},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":868,"title":869},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":871,"title":872},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":874,"title":875},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":788,"title":359},{"path":318,"title":312},{"path":879,"title":880},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":882,"title":883},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":885,"title":886},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":793,"title":794},{"path":889,"title":890},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":212,"title":892},"Dynamic dates",{"path":894,"title":895},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":897,"title":898},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":900,"icon":901,"intro":902,"items":903},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[904,905,908,911,914,917,920,923,926],{"path":772,"title":773},{"path":906,"title":907},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":909,"title":910},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":912,"title":913},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":915,"title":916},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":918,"title":919},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":921,"title":922},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":924,"title":925},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":828,"title":927},"Results of flows and scripts",{"title":929,"icon":930,"intro":931,"items":932},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[933,936,939,942,945,947,948,950,951,954,957],{"path":934,"title":935},"\u002Fdocs\u002Fconnections","All connections",{"path":937,"title":938},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":940,"title":941},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":943,"title":944},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":915,"title":946},"SFTP servers",{"path":918,"title":919},{"path":921,"title":949},"SharePoint",{"path":924,"title":925},{"path":952,"title":953},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":955,"title":956},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":958,"title":959},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":961,"icon":962,"intro":963,"items":964},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[965,968,971,973,976,979,982,985],{"path":966,"title":967},"\u002Fdocs\u002Fintegrations","All integrations",{"path":969,"title":970},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":656,"title":972},"API, tokens and webhooks",{"path":974,"title":975},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":977,"title":978},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":980,"title":981},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":983,"title":984},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":986,"title":987},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":989,"icon":990,"intro":991,"items":992},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[993,996,997,1000,1001,1004,1007],{"path":994,"title":995},"\u002Fdocs\u002Fgovernance","Overview",{"path":801,"title":661},{"path":998,"title":999},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":287,"title":288},{"path":1002,"title":1003},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1005,"title":1006},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1008,"title":1009},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":1011,"icon":1012,"intro":1013,"items":1014},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1015,1018,1021,1024,1027,1030,1033],{"path":1016,"title":1017},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1019,"title":1020},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1022,"title":1023},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1025,"title":1026},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1028,"title":1029},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1031,"title":1032},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1034,"title":1035},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1037,"icon":1038,"intro":1039,"items":1040},"Reference","reference","Release process and the remaining reference pages.",[1041],{"path":1042,"title":1043},"\u002Fdocs\u002Frelease-process","Release process",1793656371947]