[{"data":1,"prerenderedAt":3302},["ShallowReactive",2],{"authors":3,"article-2024-01-25-monitoring-de-la-complexite-des-models-dbt":331},[4,23,35,48,61,73,85,98,111,124,136,148,161,173,185,197,209,221,233,245,258,270,282,295,307,319],{"id":5,"title":6,"body":7,"description":11,"extension":14,"meta":15,"name":16,"navigation":17,"path":18,"readingTime":19,"seo":20,"stem":21,"__hash__":22},"authors\u002Fauthors\u002Falexandre-guillon.md","Software Engineer",{"type":8,"value":9,"toc":10},"minimark",[],{"title":11,"searchDepth":12,"depth":12,"links":13},"",2,[],"md",{},"Alexandre Guillon",true,"\u002Fauthors\u002Falexandre-guillon",1,{"title":6,"description":11},"authors\u002Falexandre-guillon","4tf48mjyjFNqItOHaulICbrjeCyMag1o6801uHeTz98",{"id":24,"title":6,"body":25,"description":11,"extension":14,"meta":29,"name":30,"navigation":17,"path":31,"readingTime":19,"seo":32,"stem":33,"__hash__":34},"authors\u002Fauthors\u002Falexis-ablain.md",{"type":8,"value":26,"toc":27},[],{"title":11,"searchDepth":12,"depth":12,"links":28},[],{},"Alexis Ablain","\u002Fauthors\u002Falexis-ablain",{"title":6,"description":11},"authors\u002Falexis-ablain","_SIAtB7f-39e5t3GiJof81NP47s6MGo2n4gaHkTy1uQ",{"id":36,"title":37,"body":38,"description":11,"extension":14,"meta":42,"name":43,"navigation":17,"path":44,"readingTime":19,"seo":45,"stem":46,"__hash__":47},"authors\u002Fauthors\u002Faxel-shaita.md","Engineering Manager",{"type":8,"value":39,"toc":40},[],{"title":11,"searchDepth":12,"depth":12,"links":41},[],{},"Axel Shaïta","\u002Fauthors\u002Faxel-shaita",{"title":37,"description":11},"authors\u002Faxel-shaita","fK0argUhsBkWLjpTAhY13oYLVzQthcEYkCEdtHWmIgE",{"id":49,"title":50,"body":51,"description":11,"extension":14,"meta":55,"name":56,"navigation":17,"path":57,"readingTime":19,"seo":58,"stem":59,"__hash__":60},"authors\u002Fauthors\u002Fbaptiste-faure.md","Head of Talent Acquisition",{"type":8,"value":52,"toc":53},[],{"title":11,"searchDepth":12,"depth":12,"links":54},[],{},"Baptiste Faure","\u002Fauthors\u002Fbaptiste-faure",{"title":50,"description":11},"authors\u002Fbaptiste-faure","ELisToYtcgHmgdVWZkCclTPV6exZtfyXqhpx1jjbJHs",{"id":62,"title":6,"body":63,"description":11,"extension":14,"meta":67,"name":68,"navigation":17,"path":69,"readingTime":19,"seo":70,"stem":71,"__hash__":72},"authors\u002Fauthors\u002Fbenjamin-bouillot.md",{"type":8,"value":64,"toc":65},[],{"title":11,"searchDepth":12,"depth":12,"links":66},[],{},"Benjamin Bouillot","\u002Fauthors\u002Fbenjamin-bouillot",{"title":6,"description":11},"authors\u002Fbenjamin-bouillot","tbhCFZyfTt7ZM5b5YgqQ2nhgnSTl8BweaQQryc87fHo",{"id":74,"title":37,"body":75,"description":11,"extension":14,"meta":79,"name":80,"navigation":17,"path":81,"readingTime":19,"seo":82,"stem":83,"__hash__":84},"authors\u002Fauthors\u002Fcedric-nicoloso.md",{"type":8,"value":76,"toc":77},[],{"title":11,"searchDepth":12,"depth":12,"links":78},[],{},"Cédric Nicoloso","\u002Fauthors\u002Fcedric-nicoloso",{"title":37,"description":11},"authors\u002Fcedric-nicoloso","ibSoh4VZYiWYTuLOnZTedaAfcnvet1Q9H7ogW0LgorY",{"id":86,"title":87,"body":88,"description":11,"extension":14,"meta":92,"name":93,"navigation":17,"path":94,"readingTime":19,"seo":95,"stem":96,"__hash__":97},"authors\u002Fauthors\u002Fdavid-touzet.md","Staff Engineer",{"type":8,"value":89,"toc":90},[],{"title":11,"searchDepth":12,"depth":12,"links":91},[],{},"David Touzet","\u002Fauthors\u002Fdavid-touzet",{"title":87,"description":11},"authors\u002Fdavid-touzet","dHWwnQxb1Ubt-WwXWEODGEo9AFoq1cJUhfg3kdnYSBM",{"id":99,"title":100,"body":101,"description":11,"extension":14,"meta":105,"name":106,"navigation":17,"path":107,"readingTime":19,"seo":108,"stem":109,"__hash__":110},"authors\u002Fauthors\u002Feloise-chizat.md","Data Engineer",{"type":8,"value":102,"toc":103},[],{"title":11,"searchDepth":12,"depth":12,"links":104},[],{},"Eloïse Chizat","\u002Fauthors\u002Feloise-chizat",{"title":100,"description":11},"authors\u002Feloise-chizat","Utd72Vm9qT4hh2ZbFi6a2_nXw5Wb494Ed_HL1ra5yw8",{"id":112,"title":113,"body":114,"description":11,"extension":14,"meta":118,"name":119,"navigation":17,"path":120,"readingTime":19,"seo":121,"stem":122,"__hash__":123},"authors\u002Fauthors\u002Femmanuel-auclair.md","Staff engineer",{"type":8,"value":115,"toc":116},[],{"title":11,"searchDepth":12,"depth":12,"links":117},[],{},"Emmanuel Auclair","\u002Fauthors\u002Femmanuel-auclair",{"title":113,"description":11},"authors\u002Femmanuel-auclair","MtsA8THNLEn0dTtYEIQaGwDuf7MjQL55IOeei5gugEg",{"id":125,"title":6,"body":126,"description":11,"extension":14,"meta":130,"name":131,"navigation":17,"path":132,"readingTime":19,"seo":133,"stem":134,"__hash__":135},"authors\u002Fauthors\u002Fhoreb-parraud.md",{"type":8,"value":127,"toc":128},[],{"title":11,"searchDepth":12,"depth":12,"links":129},[],{},"Horeb Parraud","\u002Fauthors\u002Fhoreb-parraud",{"title":6,"description":11},"authors\u002Fhoreb-parraud","ajjsnUX4ohZI-ghMdbb92q_taWDkKXVZSLZXoAeLQtg",{"id":137,"title":37,"body":138,"description":11,"extension":14,"meta":142,"name":143,"navigation":17,"path":144,"readingTime":19,"seo":145,"stem":146,"__hash__":147},"authors\u002Fauthors\u002Fhugo-contreras.md",{"type":8,"value":139,"toc":140},[],{"title":11,"searchDepth":12,"depth":12,"links":141},[],{},"Hugo Contreras","\u002Fauthors\u002Fhugo-contreras",{"title":37,"description":11},"authors\u002Fhugo-contreras","2nc3VMu9ASq9Z6Pwx2-7-Ye991Pww4p-UEDBQFfjF-Q",{"id":149,"title":150,"body":151,"description":11,"extension":14,"meta":155,"name":156,"navigation":17,"path":157,"readingTime":19,"seo":158,"stem":159,"__hash__":160},"authors\u002Fauthors\u002Fjulien-tassin.md","Head of Engineering",{"type":8,"value":152,"toc":153},[],{"title":11,"searchDepth":12,"depth":12,"links":154},[],{},"Julien Tassin","\u002Fauthors\u002Fjulien-tassin",{"title":150,"description":11},"authors\u002Fjulien-tassin","iUIHI7SITje38Jh9X9uvYs4-VsHx4eCdt6hAlyLFG_o",{"id":162,"title":6,"body":163,"description":11,"extension":14,"meta":167,"name":168,"navigation":17,"path":169,"readingTime":19,"seo":170,"stem":171,"__hash__":172},"authors\u002Fauthors\u002Flaurent-renard.md",{"type":8,"value":164,"toc":165},[],{"title":11,"searchDepth":12,"depth":12,"links":166},[],{},"Laurent Renard","\u002Fauthors\u002Flaurent-renard",{"title":6,"description":11},"authors\u002Flaurent-renard","5BP7Ed-pt1SQHjh0UJ1XUrlLTcdlFaDoKBCP4deHq8A",{"id":174,"title":6,"body":175,"description":11,"extension":14,"meta":179,"name":180,"navigation":17,"path":181,"readingTime":19,"seo":182,"stem":183,"__hash__":184},"authors\u002Fauthors\u002Fleo-martin.md",{"type":8,"value":176,"toc":177},[],{"title":11,"searchDepth":12,"depth":12,"links":178},[],{},"Léo Martin","\u002Fauthors\u002Fleo-martin",{"title":6,"description":11},"authors\u002Fleo-martin","eYxCHkRgbGDV7shKdTA9s7Tu0zGV4yDGFoKR5MHQntY",{"id":186,"title":6,"body":187,"description":11,"extension":14,"meta":191,"name":192,"navigation":17,"path":193,"readingTime":19,"seo":194,"stem":195,"__hash__":196},"authors\u002Fauthors\u002Floic-bousquet.md",{"type":8,"value":188,"toc":189},[],{"title":11,"searchDepth":12,"depth":12,"links":190},[],{},"Loïc Bousquet","\u002Fauthors\u002Floic-bousquet",{"title":6,"description":11},"authors\u002Floic-bousquet","ko12qZwiGL8XNjAoy9oWypPkIjr29Pbq7vhdtgldqeQ",{"id":198,"title":6,"body":199,"description":11,"extension":14,"meta":203,"name":204,"navigation":17,"path":205,"readingTime":19,"seo":206,"stem":207,"__hash__":208},"authors\u002Fauthors\u002Floic-poullain.md",{"type":8,"value":200,"toc":201},[],{"title":11,"searchDepth":12,"depth":12,"links":202},[],{},"Loïc Poullain","\u002Fauthors\u002Floic-poullain",{"title":6,"description":11},"authors\u002Floic-poullain","oRIyJhFRTqxy5dLCYQ2OnYZ1DB-gLDUM-85vTSYuTF0",{"id":210,"title":100,"body":211,"description":11,"extension":14,"meta":215,"name":216,"navigation":17,"path":217,"readingTime":19,"seo":218,"stem":219,"__hash__":220},"authors\u002Fauthors\u002Fmaud-lelu.md",{"type":8,"value":212,"toc":213},[],{"title":11,"searchDepth":12,"depth":12,"links":214},[],{},"Maud Lélu","\u002Fauthors\u002Fmaud-lelu",{"title":100,"description":11},"authors\u002Fmaud-lelu","MMbsCKuE41OMHusrl12FIEsI-Trx7l8Nn_ANhvj2_y4",{"id":222,"title":37,"body":223,"description":11,"extension":14,"meta":227,"name":228,"navigation":17,"path":229,"readingTime":19,"seo":230,"stem":231,"__hash__":232},"authors\u002Fauthors\u002Fnicolas-poirier.md",{"type":8,"value":224,"toc":225},[],{"title":11,"searchDepth":12,"depth":12,"links":226},[],{},"Nicolas Poirier","\u002Fauthors\u002Fnicolas-poirier",{"title":37,"description":11},"authors\u002Fnicolas-poirier","dXrJkYo8az4SN_D23aYc3fQ7z8s1dR2a0lt1ogjAjJs",{"id":234,"title":37,"body":235,"description":11,"extension":14,"meta":239,"name":240,"navigation":17,"path":241,"readingTime":19,"seo":242,"stem":243,"__hash__":244},"authors\u002Fauthors\u002Fraphael-sauget.md",{"type":8,"value":236,"toc":237},[],{"title":11,"searchDepth":12,"depth":12,"links":238},[],{},"Raphaël Sauget","\u002Fauthors\u002Fraphael-sauget",{"title":37,"description":11},"authors\u002Fraphael-sauget","Uri9bcq0QDuxRA0PbBoNtu7p_5L3dALu4kzcXVW0xyM",{"id":246,"title":247,"body":248,"description":11,"extension":14,"meta":252,"name":253,"navigation":17,"path":254,"readingTime":19,"seo":255,"stem":256,"__hash__":257},"authors\u002Fauthors\u002Fromain-koenig.md","Co-funder & Head of innovation",{"type":8,"value":249,"toc":250},[],{"title":11,"searchDepth":12,"depth":12,"links":251},[],{},"Romain Koenig","\u002Fauthors\u002Fromain-koenig",{"title":247,"description":11},"authors\u002Fromain-koenig","uyS8--eG2_ezyqRABcJnMJmQKKuSArhPWd14aUvFeEw",{"id":259,"title":37,"body":260,"description":11,"extension":14,"meta":264,"name":265,"navigation":17,"path":266,"readingTime":19,"seo":267,"stem":268,"__hash__":269},"authors\u002Fauthors\u002Fromaric-juniet.md",{"type":8,"value":261,"toc":262},[],{"title":11,"searchDepth":12,"depth":12,"links":263},[],{},"Romaric Juniet","\u002Fauthors\u002Fromaric-juniet",{"title":37,"description":11},"authors\u002Fromaric-juniet","4Zb2artgT-eo-PHLXi3xi4d5t7s6PfhUxeSfXIikSUY",{"id":271,"title":6,"body":272,"description":11,"extension":14,"meta":276,"name":277,"navigation":17,"path":278,"readingTime":19,"seo":279,"stem":280,"__hash__":281},"authors\u002Fauthors\u002Fstanyslas-bres.md",{"type":8,"value":273,"toc":274},[],{"title":11,"searchDepth":12,"depth":12,"links":275},[],{},"Stanyslas Bres","\u002Fauthors\u002Fstanyslas-bres",{"title":6,"description":11},"authors\u002Fstanyslas-bres","Xa0SahETuiN4q1jrmR2ych3moAqcZ2LbU7vSfEt2RuU",{"id":283,"title":284,"body":285,"description":11,"extension":14,"meta":289,"name":290,"navigation":17,"path":291,"readingTime":19,"seo":292,"stem":293,"__hash__":294},"authors\u002Fauthors\u002Ftalent-acquisition.md","Talent Acquisition",{"type":8,"value":286,"toc":287},[],{"title":11,"searchDepth":12,"depth":12,"links":288},[],{},"Équipe Talent Acquisition","\u002Fauthors\u002Ftalent-acquisition",{"description":11},"authors\u002Ftalent-acquisition","doDfE76txftQ4wIiKjJoDmSpyzSKk0tzlgVAp6-opAY",{"id":296,"title":6,"body":297,"description":11,"extension":14,"meta":301,"name":302,"navigation":17,"path":303,"readingTime":19,"seo":304,"stem":305,"__hash__":306},"authors\u002Fauthors\u002Fvictor-borg.md",{"type":8,"value":298,"toc":299},[],{"title":11,"searchDepth":12,"depth":12,"links":300},[],{},"Victor Borg","\u002Fauthors\u002Fvictor-borg",{"title":6,"description":11},"authors\u002Fvictor-borg","-Za-JweoiP6hyclue_WkxMXdRUDTczPGlJf6AZckjUc",{"id":308,"title":6,"body":309,"description":11,"extension":14,"meta":313,"name":314,"navigation":17,"path":315,"readingTime":19,"seo":316,"stem":317,"__hash__":318},"authors\u002Fauthors\u002Fvirgil-roger.md",{"type":8,"value":310,"toc":311},[],{"title":11,"searchDepth":12,"depth":12,"links":312},[],{},"Virgil Roger","\u002Fauthors\u002Fvirgil-roger",{"title":6,"description":11},"authors\u002Fvirgil-roger","DfVFe5j0bCgXeEr381ZYOM5DP4m-pWb93J9-m_muKJ0",{"id":320,"title":6,"body":321,"description":11,"extension":14,"meta":325,"name":326,"navigation":17,"path":327,"readingTime":19,"seo":328,"stem":329,"__hash__":330},"authors\u002Fauthors\u002Fyukan-zhao.md",{"type":8,"value":322,"toc":323},[],{"title":11,"searchDepth":12,"depth":12,"links":324},[],{},"Yukan Zhao","\u002Fauthors\u002Fyukan-zhao",{"title":6,"description":11},"authors\u002Fyukan-zhao","LRPHugtAJnWHsmHxy9_SR5Zas_C5p-GR_uHEs1Fhk_E",{"id":332,"title":333,"author":334,"body":335,"date":3292,"description":356,"extension":14,"lang":3293,"meta":3294,"navigation":17,"path":3295,"published":17,"readingTime":656,"seo":3296,"stem":3297,"tags":3298,"__hash__":3301},"articles\u002Farticles\u002F2024-01-25-monitoring-de-la-complexite-des-models-dbt.md","Monitoring de la complexité des models DBT","eloise-chizat",{"type":8,"value":336,"toc":3283},[337,354,357,362,379,393,402,408,415,421,424,429,432,436,439,458,465,468,472,978,981,3279],[338,339,340,341,348,349,353],"p",{},"Suite à la mise en place de notre nouvelle architecture en médaillon\n(",[342,343,347],"a",{"href":344,"rel":345},"https:\u002F\u002Ftech.indy.fr\u002F2024\u002F01\u002F25\u002Fmise-en-place-dune-archi-medaillon-sur-la-bi-chez-indy\u002F",[346],"nofollow","voir l'article ici","),\nnous nous sommes rendu compte qu’il nous fallait maintenant creuser le sujet de la complexité de\nnotre codebase. Au moment où j’écris cet article nous avons presque 400 modèles et 70 sources de\ndonnées ! Un ",[350,351,352],"code",{},"full-refresh"," (rafraichissement de tous les models sans prendre en compte\nl’incrémental) prend environ 2h, un run classique environ 20min.",[338,355,356],{},"Bien que le sujet soit encore en chantier, voici les premières étapes que nous avons mises en place.",[358,359,361],"h2",{"id":360},"complexité-des-lineages-dbt-project-evaluator","Complexité des lineages : DBT project evaluator",[338,363,364,365,370,371,374,375,378],{},"Notre première approche a été d’installer le package\n",[342,366,369],{"href":367,"rel":368},"https:\u002F\u002Fdbt-labs.github.io\u002Fdbt-project-evaluator\u002F0.8\u002F",[346],"DBT project evaluator"," : nous avions déjà un\nlinter de code, mais ici l’approche est plus structurelle et architecturale. Ce package propose\ndifférentes “guide lines” qui permettent d’avoir un projet propre et maintenable, en signalant par\nexemple les sources non utilisées, des modèles qui seraient à la fois parent et enfant d’un autre\nmodèle ou encore des mauvaises pratiques comme des ",[350,372,373],{},"join"," directement dans la couche ",[350,376,377],{},"bronze"," ou sur\nles sources.",[338,380,381,382,387,388,392],{},"Dans un premier temps, nous avons ajouté ce package uniquement en local, les règles simples ont été\ncorrigées, les cas que nous voulions garder tels quels ont été exclus\n",[342,383,386],{"href":384,"rel":385},"https:\u002F\u002Fdbt-labs.github.io\u002Fdbt-project-evaluator\u002F0.8\u002Fcustomization\u002Fexceptions\u002F",[346],"via le fichier"," de\n",[389,390,391],"em",{},"seeds"," prévu à cet effet. Chaque règle à été revue par l’équipe, été activée ou non, paramétrée le\ncas échéant.",[338,394,395,396,401],{},"Corriger\n",[342,397,400],{"href":398,"rel":399},"https:\u002F\u002Fdbt-labs.github.io\u002Fdbt-project-evaluator\u002F0.8\u002Frules\u002Fmodeling\u002F#rejoining-of-upstream-concepts",[346],"fct_rejoining_of_upstream_concepts","\nétait plus complexe. Nous avons listé les fichiers qui avaient cette alerte dans les exclusions,\npuis nous avons ajouté le package à la CI pour éviter que de nouveaux développements ne soulèvent\nd’autres alertes.",[338,403,404,405,407],{},"Depuis la mise en place de DBT project evaluator nous corrigeons petit à petit les modèles que nous\navons listé dans le fichier de ",[350,406,391],{},".",[409,410,412,413],"h3",{"id":411},"exemple-de-simplification-de-lineage-après-correction-dune-alerte-fct_rejoining_of_upstream_concepts","Exemple de simplification de lineage après correction d’une alerte ",[350,414,400],{},[338,416,417],{},[418,419],"img",{"alt":11,"src":420},"\u002Fimages\u002F286675973-b695b4a5-d435-45eb-b607-3ff3e2ddd482.png",[338,422,423],{},"Avant refacto",[338,425,426],{},[418,427],{"alt":11,"src":428},"\u002Fimages\u002F286676010-5a428dcd-e943-4237-baa2-8b8b77917d9d-1.png",[338,430,431],{},"Après refacto",[358,433,435],{"id":434},"complexité-du-code-sql-solution-maison","Complexité du code SQL : solution maison",[338,437,438],{},"Nous avons voulu partir sur un script Python, qui se base sur plusieurs indicateurs comme le nombre\nde colonne d’un modèle, l’occurence de mots clefs SQL et le nombre de modèles parents.",[338,440,441,442,445,446,449,450,453,454,457],{},"Nous avons défini une liste de mots clefs SQL et nous leur avons affecté une valeur en fonction de\nleur complexité. Ainsi, un ",[350,443,444],{},"WHERE"," vaudra 1 point alors qu’un ",[350,447,448],{},"UNNEST"," ou un ",[350,451,452],{},"LAG"," vaudra 3 points,\net qu’un ",[350,455,456],{},"OR"," en vaudra 0,1. Nous sommes parti d’un premier mot clef auquel nous avons donné une\nvaleur arbitraire, puis pour chaque mot clef nous avons convenu ensemble d’une valeur plus ou moins\nélevée en fonction des mots clefs déjà évalués. Nous n’avons bien évidement pas listés tous les mots\nclefs disponibles en SQL, mais uniquement les plus récurrents dans notre projet, c’est à dire\nenviron une quinzaine.",[338,459,460,461,464],{},"Le résultat de ce script est ajouté à titre indicatif sur chaque description de PR ",[389,462,463],{},"via"," la CI, les\nrésultats ne sont pour le moment pas sauvegardés pour un suivi plus précis.",[338,466,467],{},"Cet indicateur est pour le moment en phase de test, et nous permet notamment de valider certaines\nrefactorisations dont le but est de réduire la complexité. Nous ajoutons encore des mots clefs dans\nnotre liste quand un nouveau nous semble pertinent.",[409,469,471],{"id":470},"exemple-de-résultat-du-script-de-calcul-de-la-complexité","Exemple de résultat du script de calcul de la complexité",[473,474,478],"pre",{"className":475,"code":476,"language":477,"meta":11,"style":11},"language-sql shiki shiki-themes github-light github-dark","BEFORE public\u002Fcare\u002Fcare_working_days.sql nb_columns=8 sql=4.0 coupling=2 complexity=16\n\nAFTER public\u002Fcare\u002Fcare_working_days.sql nb_columns=8 sql=1.0 coupling=2 complexity=12\n\nBEFORE public\u002Fcare\u002Fcare_working_periods.sql nb_columns=2 sql=4.0 coupling=2 complexity=8\n\nAFTER public\u002Fcare\u002Fcare_working_periods.sql nb_columns=2 sql=4.0 coupling=2 complexity=8\n\nBEFORE public\u002Fsales\u002Fsales_cadence_hybride.sql nb_columns=10 sql=5.0 coupling=3 complexity=23\n\nAFTER public\u002Fsales\u002Fsales_cadence_hybride.sql nb_columns=10 sql=5.0 coupling=3 complexity=23\n\nBEFORE public\u002Findies\u002Fworking_days.sql nb_columns=6 sql=1.0 coupling=2 complexity=9\n\nAFTER public\u002Findies\u002Fworking_days.sql nb_columns=6 sql=1.0 coupling=1 complexity=8\n\nADDED silver\u002Fcare\u002Fsilver_care_working_days.sql nb_columns=8 sql=3.0 coupling=2 complexity=15\n\n-- nb models before=380 after=381 diff=1\n-- global complexity before=15305 after=15314 diff=9\n","sql",[350,479,480,544,549,597,602,649,654,699,704,755,760,805,810,859,864,909,914,960,965,972],{"__ignoreMap":11},[481,482,484,488,492,495,498,500,504,506,508,511,514,517,520,523,525,528,531,533,536,539,541],"span",{"class":483,"line":19},"line",[481,485,487],{"class":486},"szBVR","BEFORE",[481,489,491],{"class":490},"sVt8B"," public",[481,493,494],{"class":486},"\u002F",[481,496,497],{"class":490},"care",[481,499,494],{"class":486},[481,501,503],{"class":502},"sj4cs","care_working_days",[481,505,407],{"class":490},[481,507,477],{"class":502},[481,509,510],{"class":490}," nb_columns",[481,512,513],{"class":486},"=",[481,515,516],{"class":502},"8",[481,518,519],{"class":486}," sql=",[481,521,522],{"class":502},"4",[481,524,407],{"class":490},[481,526,527],{"class":502},"0",[481,529,530],{"class":490}," coupling",[481,532,513],{"class":486},[481,534,535],{"class":502},"2",[481,537,538],{"class":490}," complexity",[481,540,513],{"class":486},[481,542,543],{"class":502},"16\n",[481,545,546],{"class":483,"line":12},[481,547,548],{"emptyLinePlaceholder":17},"\n",[481,550,552,555,557,559,561,563,565,567,569,571,573,575,577,580,582,584,586,588,590,592,594],{"class":483,"line":551},3,[481,553,554],{"class":486},"AFTER",[481,556,491],{"class":490},[481,558,494],{"class":486},[481,560,497],{"class":490},[481,562,494],{"class":486},[481,564,503],{"class":502},[481,566,407],{"class":490},[481,568,477],{"class":502},[481,570,510],{"class":490},[481,572,513],{"class":486},[481,574,516],{"class":502},[481,576,519],{"class":486},[481,578,579],{"class":502},"1",[481,581,407],{"class":490},[481,583,527],{"class":502},[481,585,530],{"class":490},[481,587,513],{"class":486},[481,589,535],{"class":502},[481,591,538],{"class":490},[481,593,513],{"class":486},[481,595,596],{"class":502},"12\n",[481,598,600],{"class":483,"line":599},4,[481,601,548],{"emptyLinePlaceholder":17},[481,603,605,607,609,611,613,615,618,620,622,624,626,628,630,632,634,636,638,640,642,644,646],{"class":483,"line":604},5,[481,606,487],{"class":486},[481,608,491],{"class":490},[481,610,494],{"class":486},[481,612,497],{"class":490},[481,614,494],{"class":486},[481,616,617],{"class":502},"care_working_periods",[481,619,407],{"class":490},[481,621,477],{"class":502},[481,623,510],{"class":490},[481,625,513],{"class":486},[481,627,535],{"class":502},[481,629,519],{"class":486},[481,631,522],{"class":502},[481,633,407],{"class":490},[481,635,527],{"class":502},[481,637,530],{"class":490},[481,639,513],{"class":486},[481,641,535],{"class":502},[481,643,538],{"class":490},[481,645,513],{"class":486},[481,647,648],{"class":502},"8\n",[481,650,652],{"class":483,"line":651},6,[481,653,548],{"emptyLinePlaceholder":17},[481,655,657,659,661,663,665,667,669,671,673,675,677,679,681,683,685,687,689,691,693,695,697],{"class":483,"line":656},7,[481,658,554],{"class":486},[481,660,491],{"class":490},[481,662,494],{"class":486},[481,664,497],{"class":490},[481,666,494],{"class":486},[481,668,617],{"class":502},[481,670,407],{"class":490},[481,672,477],{"class":502},[481,674,510],{"class":490},[481,676,513],{"class":486},[481,678,535],{"class":502},[481,680,519],{"class":486},[481,682,522],{"class":502},[481,684,407],{"class":490},[481,686,527],{"class":502},[481,688,530],{"class":490},[481,690,513],{"class":486},[481,692,535],{"class":502},[481,694,538],{"class":490},[481,696,513],{"class":486},[481,698,648],{"class":502},[481,700,702],{"class":483,"line":701},8,[481,703,548],{"emptyLinePlaceholder":17},[481,705,707,709,711,713,716,718,721,723,725,727,729,732,734,737,739,741,743,745,748,750,752],{"class":483,"line":706},9,[481,708,487],{"class":486},[481,710,491],{"class":490},[481,712,494],{"class":486},[481,714,715],{"class":490},"sales",[481,717,494],{"class":486},[481,719,720],{"class":502},"sales_cadence_hybride",[481,722,407],{"class":490},[481,724,477],{"class":502},[481,726,510],{"class":490},[481,728,513],{"class":486},[481,730,731],{"class":502},"10",[481,733,519],{"class":486},[481,735,736],{"class":502},"5",[481,738,407],{"class":490},[481,740,527],{"class":502},[481,742,530],{"class":490},[481,744,513],{"class":486},[481,746,747],{"class":502},"3",[481,749,538],{"class":490},[481,751,513],{"class":486},[481,753,754],{"class":502},"23\n",[481,756,758],{"class":483,"line":757},10,[481,759,548],{"emptyLinePlaceholder":17},[481,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789,791,793,795,797,799,801,803],{"class":483,"line":762},11,[481,764,554],{"class":486},[481,766,491],{"class":490},[481,768,494],{"class":486},[481,770,715],{"class":490},[481,772,494],{"class":486},[481,774,720],{"class":502},[481,776,407],{"class":490},[481,778,477],{"class":502},[481,780,510],{"class":490},[481,782,513],{"class":486},[481,784,731],{"class":502},[481,786,519],{"class":486},[481,788,736],{"class":502},[481,790,407],{"class":490},[481,792,527],{"class":502},[481,794,530],{"class":490},[481,796,513],{"class":486},[481,798,747],{"class":502},[481,800,538],{"class":490},[481,802,513],{"class":486},[481,804,754],{"class":502},[481,806,808],{"class":483,"line":807},12,[481,809,548],{"emptyLinePlaceholder":17},[481,811,813,815,817,819,822,824,827,829,831,833,835,838,840,842,844,846,848,850,852,854,856],{"class":483,"line":812},13,[481,814,487],{"class":486},[481,816,491],{"class":490},[481,818,494],{"class":486},[481,820,821],{"class":490},"indies",[481,823,494],{"class":486},[481,825,826],{"class":502},"working_days",[481,828,407],{"class":490},[481,830,477],{"class":502},[481,832,510],{"class":490},[481,834,513],{"class":486},[481,836,837],{"class":502},"6",[481,839,519],{"class":486},[481,841,579],{"class":502},[481,843,407],{"class":490},[481,845,527],{"class":502},[481,847,530],{"class":490},[481,849,513],{"class":486},[481,851,535],{"class":502},[481,853,538],{"class":490},[481,855,513],{"class":486},[481,857,858],{"class":502},"9\n",[481,860,862],{"class":483,"line":861},14,[481,863,548],{"emptyLinePlaceholder":17},[481,865,867,869,871,873,875,877,879,881,883,885,887,889,891,893,895,897,899,901,903,905,907],{"class":483,"line":866},15,[481,868,554],{"class":486},[481,870,491],{"class":490},[481,872,494],{"class":486},[481,874,821],{"class":490},[481,876,494],{"class":486},[481,878,826],{"class":502},[481,880,407],{"class":490},[481,882,477],{"class":502},[481,884,510],{"class":490},[481,886,513],{"class":486},[481,888,837],{"class":502},[481,890,519],{"class":486},[481,892,579],{"class":502},[481,894,407],{"class":490},[481,896,527],{"class":502},[481,898,530],{"class":490},[481,900,513],{"class":486},[481,902,579],{"class":502},[481,904,538],{"class":490},[481,906,513],{"class":486},[481,908,648],{"class":502},[481,910,912],{"class":483,"line":911},16,[481,913,548],{"emptyLinePlaceholder":17},[481,915,917,920,922,924,926,929,931,933,935,937,939,941,943,945,947,949,951,953,955,957],{"class":483,"line":916},17,[481,918,919],{"class":490},"ADDED silver",[481,921,494],{"class":486},[481,923,497],{"class":490},[481,925,494],{"class":486},[481,927,928],{"class":502},"silver_care_working_days",[481,930,407],{"class":490},[481,932,477],{"class":502},[481,934,510],{"class":490},[481,936,513],{"class":486},[481,938,516],{"class":502},[481,940,519],{"class":486},[481,942,747],{"class":502},[481,944,407],{"class":490},[481,946,527],{"class":502},[481,948,530],{"class":490},[481,950,513],{"class":486},[481,952,535],{"class":502},[481,954,538],{"class":490},[481,956,513],{"class":486},[481,958,959],{"class":502},"15\n",[481,961,963],{"class":483,"line":962},18,[481,964,548],{"emptyLinePlaceholder":17},[481,966,968],{"class":483,"line":967},19,[481,969,971],{"class":970},"sJ8bj","-- nb models before=380 after=381 diff=1\n",[481,973,975],{"class":483,"line":974},20,[481,976,977],{"class":970},"-- global complexity before=15305 after=15314 diff=9\n",[338,979,980],{},"Et voici le code du script :",[473,982,986],{"className":983,"code":984,"language":985,"meta":11,"style":11},"language-py shiki shiki-themes github-light github-dark","import argparse\nimport json\nimport re\nfrom collections import Counter, defaultdict\n\nTOKEN_COSTS = {\n    \"AND\": 0.1,\n    \"COALESCE\": 1,\n    \"DISTINCT\": 1,\n    \"GREATEST\": 1,\n    \"GROUP\": 1,\n    \"JOIN\": 1,\n    \"LAG\": 3,\n    \"LEAD\": 3,\n    \"LEAST\": 1,\n    \"OR\": 0.1,\n    \"ORDER\": 1,\n    \"PARTITION\": 3,\n    \"SELECT\": 1,\n    \"UNNEST\": 3,\n    \"WHEN\": 0.5,\n    \"WHERE\": 1,\n};\n\ndef raw_sql_complexity(raw_sql):\n    raw_sql = re.sub(r\"\\W+\", \" \", raw_sql)\n    token_counts = Counter([token.upper() for token in raw_sql.split()])\n    return sum(token_counts.get(token, 0) * cost for token, cost in TOKEN_COSTS.items())\n\ndef analyze_manifest(manifest_file, coupling_factor=1.15, min_columns=10, max_columns=30, select=\"\"):\n    with open(manifest_file) as fin:\n        manifest_data = json.load(fin)\n\n    data = {}\n    selected_models = {}\n\n    if select:\n        if select[0] == \"+\":\n            # If 'select' has a '+' sign, we need to find the direct dependencies of the selected model\n            for key, node in manifest_data[\"nodes\"].items():\n                if select[1:] == node[\"name\"]:\n                    selected_models = set(node[\"depends_on\"][\"nodes\"])\n                    selected_models.add(node[\"unique_id\"])\n        else:\n            # Otherwise, we just need to find the model with the given name\n            selected_models = {select}\n\n    for key, node in manifest_data[\"nodes\"].items():\n        if node[\"package_name\"] != \"geppetto_dbt\" or node[\"resource_type\"] != \"model\":\n            continue\n\n        if (\n            select\n            and selected_models\n            and node[\"unique_id\"] not in selected_models\n            and node[\"name\"] not in selected_models\n        ):\n            continue\n\n        node_data = {\n            \"path\": node[\"path\"],\n            \"nb_columns\": len(node[\"columns\"]),\n            \"sql_complexity\": raw_sql_complexity(node[\"raw_code\"]),\n            \"inputs\": set(node[\"depends_on\"][\"nodes\"]),\n            \"outputs\": set(),\n        }\n        data[key] = node_data\n\n    # compute outputs\n    for key, node in data.items():\n        for dep in node[\"inputs\"]:\n            if dep in data:\n                data[dep][\"outputs\"].add(dep)\n\n    # compute coupling and global\n    for node in data.values():\n        node[\"coupling\"] = len(node[\"inputs\"]) + len(node[\"outputs\"])\n        node[\"complexity\"] = (node[\"sql_complexity\"] + node[\"nb_columns\"]) * coupling_factor ** node[\"coupling\"]\n    return data\n\ndef print_manifest_complexity(data):\n    for node in sorted(data.values(), key=lambda node: node[\"complexity\"]):\n        print(\n            f\"{node['path']:50}\\tnb_columns={node['nb_columns']}\\tsql={node['sql_complexity']:.1f}\\tcoupling={node['coupling']}\\tcomplexity={round(node['complexity'])}\"\n        )\n\n    print(\"---\")\n    print(f\"nb models => {len(data)}\")\n    print(\n        f\"global complexity{' of ' + args.select if args.select else ''} => {round(sum(node['complexity'] for node in data.values()))}\"\n    )\n\ndef print_diff_complexity(data_from, data_to):\n    all_data = defaultdict(lambda: {\"from\": None, \"to\": None})\n    for node in data_from.values():\n        all_data[node[\"path\"]][\"from\"] = node\n    for node in data_to.values():\n        all_data[node[\"path\"]][\"to\"] = node\n\n    def print_node(prefix, node):\n        print(\n            f\"{prefix}\\t{node['path']:50}\\tnb_columns={node['nb_columns']}\\tsql={node['sql_complexity']:.1f}\\tcoupling={node['coupling']}\\tcomplexity={round(node['complexity'])}\"\n        )\n\n    has_diff = False\n    for diff_nodes in all_data.values():\n        node_from, node_to = diff_nodes[\"from\"], diff_nodes[\"to\"]\n        if node_from == node_to:\n            continue\n        elif node_from is None:\n            print_node(\"ADDED\", node_to)\n        elif node_to is None:\n            print_node(\"DELETED\", node_from)\n        else:\n            print_node(\"BEFORE\", node_from)\n            print_node(\"AFTER\", node_to)\n        has_diff = True\n\n    if not has_diff:\n        print(\"No change on model DBT complexity\")\n    else:\n        print(\"---\")\n        print(f\"nb models before={len(data_from)} after={len(data_to)} diff={len(data_to) - len(data_from)}\")\n        global_before = round(sum(node[\"complexity\"] for node in data_from.values()))\n        global_after = round(sum(node[\"complexity\"] for node in data_to.values()))\n        print(f\"global complexity before={global_before} after={global_after} diff={global_after - global_before}\")\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        description=\"Analyze DBT project manifest and produce a complexity report\",\n    )\n    parser.add_argument(\"manifest\")\n    parser.add_argument(\"--coupling-factor\", type=float, default=1.15)\n    parser.add_argument(\"--min-columns\", type=int, default=10)\n    parser.add_argument(\"--max-columns\", type=int, default=30)\n    parser.add_argument(\"--select\", type=str, default=\"\")\n    parser.add_argument(\"--diff-from-manifest\", default=None, help=\"Print diff with this manifest\")\n    args = parser.parse_args()\n\n    if args.diff_from_manifest is not None:\n        data_from = analyze_manifest(\n            args.diff_from_manifest,\n            coupling_factor=args.coupling_factor,\n            min_columns=args.min_columns,\n            max_columns=args.max_columns,\n        )\n        data_to = analyze_manifest(\n            args.manifest,\n            coupling_factor=args.coupling_factor,\n            min_columns=args.min_columns,\n            max_columns=args.max_columns,\n        )\n        print_diff_complexity(data_from, data_to)\n    else:\n        data = analyze_manifest(\n            args.manifest,\n            coupling_factor=args.coupling_factor,\n            min_columns=args.min_columns,\n            max_columns=args.max_columns,\n            select=args.select,\n        )\n        print_manifest_complexity(data)\n","py",[350,987,988,996,1003,1010,1023,1027,1038,1053,1064,1075,1086,1097,1108,1119,1130,1141,1152,1163,1174,1185,1196,1209,1221,1231,1236,1249,1283,1306,1342,1347,1389,1407,1418,1423,1434,1444,1449,1458,1481,1487,1507,1531,1556,1567,1575,1581,1592,1597,1613,1648,1654,1659,1667,1673,1682,1701,1718,1724,1729,1734,1744,1759,1778,1792,1813,1826,1832,1843,1848,1854,1866,1884,1897,1909,1914,1920,1933,1966,2010,2018,2023,2034,2064,2073,2163,2169,2174,2189,2214,2221,2283,2289,2294,2305,2342,2354,2374,2386,2403,2408,2420,2427,2504,2509,2514,2525,2538,2558,2571,2576,2592,2604,2618,2629,2636,2646,2656,2667,2672,2683,2695,2703,2714,2764,2794,2823,2869,2874,2890,2901,2914,2919,2930,2959,2986,3012,3039,3067,3078,3083,3099,3110,3116,3127,3138,3149,3154,3164,3170,3179,3188,3197,3202,3208,3215,3225,3230,3239,3248,3257,3268,3273],{"__ignoreMap":11},[481,989,990,993],{"class":483,"line":19},[481,991,992],{"class":486},"import",[481,994,995],{"class":490}," argparse\n",[481,997,998,1000],{"class":483,"line":12},[481,999,992],{"class":486},[481,1001,1002],{"class":490}," json\n",[481,1004,1005,1007],{"class":483,"line":551},[481,1006,992],{"class":486},[481,1008,1009],{"class":490}," re\n",[481,1011,1012,1015,1018,1020],{"class":483,"line":599},[481,1013,1014],{"class":486},"from",[481,1016,1017],{"class":490}," collections ",[481,1019,992],{"class":486},[481,1021,1022],{"class":490}," Counter, defaultdict\n",[481,1024,1025],{"class":483,"line":604},[481,1026,548],{"emptyLinePlaceholder":17},[481,1028,1029,1032,1035],{"class":483,"line":651},[481,1030,1031],{"class":502},"TOKEN_COSTS",[481,1033,1034],{"class":486}," =",[481,1036,1037],{"class":490}," {\n",[481,1039,1040,1044,1047,1050],{"class":483,"line":656},[481,1041,1043],{"class":1042},"sZZnC","    \"AND\"",[481,1045,1046],{"class":490},": ",[481,1048,1049],{"class":502},"0.1",[481,1051,1052],{"class":490},",\n",[481,1054,1055,1058,1060,1062],{"class":483,"line":701},[481,1056,1057],{"class":1042},"    \"COALESCE\"",[481,1059,1046],{"class":490},[481,1061,579],{"class":502},[481,1063,1052],{"class":490},[481,1065,1066,1069,1071,1073],{"class":483,"line":706},[481,1067,1068],{"class":1042},"    \"DISTINCT\"",[481,1070,1046],{"class":490},[481,1072,579],{"class":502},[481,1074,1052],{"class":490},[481,1076,1077,1080,1082,1084],{"class":483,"line":757},[481,1078,1079],{"class":1042},"    \"GREATEST\"",[481,1081,1046],{"class":490},[481,1083,579],{"class":502},[481,1085,1052],{"class":490},[481,1087,1088,1091,1093,1095],{"class":483,"line":762},[481,1089,1090],{"class":1042},"    \"GROUP\"",[481,1092,1046],{"class":490},[481,1094,579],{"class":502},[481,1096,1052],{"class":490},[481,1098,1099,1102,1104,1106],{"class":483,"line":807},[481,1100,1101],{"class":1042},"    \"JOIN\"",[481,1103,1046],{"class":490},[481,1105,579],{"class":502},[481,1107,1052],{"class":490},[481,1109,1110,1113,1115,1117],{"class":483,"line":812},[481,1111,1112],{"class":1042},"    \"LAG\"",[481,1114,1046],{"class":490},[481,1116,747],{"class":502},[481,1118,1052],{"class":490},[481,1120,1121,1124,1126,1128],{"class":483,"line":861},[481,1122,1123],{"class":1042},"    \"LEAD\"",[481,1125,1046],{"class":490},[481,1127,747],{"class":502},[481,1129,1052],{"class":490},[481,1131,1132,1135,1137,1139],{"class":483,"line":866},[481,1133,1134],{"class":1042},"    \"LEAST\"",[481,1136,1046],{"class":490},[481,1138,579],{"class":502},[481,1140,1052],{"class":490},[481,1142,1143,1146,1148,1150],{"class":483,"line":911},[481,1144,1145],{"class":1042},"    \"OR\"",[481,1147,1046],{"class":490},[481,1149,1049],{"class":502},[481,1151,1052],{"class":490},[481,1153,1154,1157,1159,1161],{"class":483,"line":916},[481,1155,1156],{"class":1042},"    \"ORDER\"",[481,1158,1046],{"class":490},[481,1160,579],{"class":502},[481,1162,1052],{"class":490},[481,1164,1165,1168,1170,1172],{"class":483,"line":962},[481,1166,1167],{"class":1042},"    \"PARTITION\"",[481,1169,1046],{"class":490},[481,1171,747],{"class":502},[481,1173,1052],{"class":490},[481,1175,1176,1179,1181,1183],{"class":483,"line":967},[481,1177,1178],{"class":1042},"    \"SELECT\"",[481,1180,1046],{"class":490},[481,1182,579],{"class":502},[481,1184,1052],{"class":490},[481,1186,1187,1190,1192,1194],{"class":483,"line":974},[481,1188,1189],{"class":1042},"    \"UNNEST\"",[481,1191,1046],{"class":490},[481,1193,747],{"class":502},[481,1195,1052],{"class":490},[481,1197,1199,1202,1204,1207],{"class":483,"line":1198},21,[481,1200,1201],{"class":1042},"    \"WHEN\"",[481,1203,1046],{"class":490},[481,1205,1206],{"class":502},"0.5",[481,1208,1052],{"class":490},[481,1210,1212,1215,1217,1219],{"class":483,"line":1211},22,[481,1213,1214],{"class":1042},"    \"WHERE\"",[481,1216,1046],{"class":490},[481,1218,579],{"class":502},[481,1220,1052],{"class":490},[481,1222,1224,1227],{"class":483,"line":1223},23,[481,1225,1226],{"class":490},"}",[481,1228,1230],{"class":1229},"s7hpK",";\n",[481,1232,1234],{"class":483,"line":1233},24,[481,1235,548],{"emptyLinePlaceholder":17},[481,1237,1239,1242,1246],{"class":483,"line":1238},25,[481,1240,1241],{"class":486},"def",[481,1243,1245],{"class":1244},"sScJk"," raw_sql_complexity",[481,1247,1248],{"class":490},"(raw_sql):\n",[481,1250,1252,1255,1257,1260,1263,1266,1269,1272,1274,1277,1280],{"class":483,"line":1251},26,[481,1253,1254],{"class":490},"    raw_sql ",[481,1256,513],{"class":486},[481,1258,1259],{"class":490}," re.sub(",[481,1261,1262],{"class":486},"r",[481,1264,1265],{"class":1042},"\"",[481,1267,1268],{"class":502},"\\W",[481,1270,1271],{"class":486},"+",[481,1273,1265],{"class":1042},[481,1275,1276],{"class":490},", ",[481,1278,1279],{"class":1042},"\" \"",[481,1281,1282],{"class":490},", raw_sql)\n",[481,1284,1286,1289,1291,1294,1297,1300,1303],{"class":483,"line":1285},27,[481,1287,1288],{"class":490},"    token_counts ",[481,1290,513],{"class":486},[481,1292,1293],{"class":490}," Counter([token.upper() ",[481,1295,1296],{"class":486},"for",[481,1298,1299],{"class":490}," token ",[481,1301,1302],{"class":486},"in",[481,1304,1305],{"class":490}," raw_sql.split()])\n",[481,1307,1309,1312,1315,1318,1320,1323,1326,1329,1331,1334,1336,1339],{"class":483,"line":1308},28,[481,1310,1311],{"class":486},"    return",[481,1313,1314],{"class":502}," sum",[481,1316,1317],{"class":490},"(token_counts.get(token, ",[481,1319,527],{"class":502},[481,1321,1322],{"class":490},") ",[481,1324,1325],{"class":486},"*",[481,1327,1328],{"class":490}," cost ",[481,1330,1296],{"class":486},[481,1332,1333],{"class":490}," token, cost ",[481,1335,1302],{"class":486},[481,1337,1338],{"class":502}," TOKEN_COSTS",[481,1340,1341],{"class":490},".items())\n",[481,1343,1345],{"class":483,"line":1344},29,[481,1346,548],{"emptyLinePlaceholder":17},[481,1348,1350,1352,1355,1358,1360,1363,1366,1368,1370,1373,1375,1378,1381,1383,1386],{"class":483,"line":1349},30,[481,1351,1241],{"class":486},[481,1353,1354],{"class":1244}," analyze_manifest",[481,1356,1357],{"class":490},"(manifest_file, coupling_factor",[481,1359,513],{"class":486},[481,1361,1362],{"class":502},"1.15",[481,1364,1365],{"class":490},", min_columns",[481,1367,513],{"class":486},[481,1369,731],{"class":502},[481,1371,1372],{"class":490},", max_columns",[481,1374,513],{"class":486},[481,1376,1377],{"class":502},"30",[481,1379,1380],{"class":490},", select",[481,1382,513],{"class":486},[481,1384,1385],{"class":1042},"\"\"",[481,1387,1388],{"class":490},"):\n",[481,1390,1392,1395,1398,1401,1404],{"class":483,"line":1391},31,[481,1393,1394],{"class":486},"    with",[481,1396,1397],{"class":502}," open",[481,1399,1400],{"class":490},"(manifest_file) ",[481,1402,1403],{"class":486},"as",[481,1405,1406],{"class":490}," fin:\n",[481,1408,1410,1413,1415],{"class":483,"line":1409},32,[481,1411,1412],{"class":490},"        manifest_data ",[481,1414,513],{"class":486},[481,1416,1417],{"class":490}," json.load(fin)\n",[481,1419,1421],{"class":483,"line":1420},33,[481,1422,548],{"emptyLinePlaceholder":17},[481,1424,1426,1429,1431],{"class":483,"line":1425},34,[481,1427,1428],{"class":490},"    data ",[481,1430,513],{"class":486},[481,1432,1433],{"class":490}," {}\n",[481,1435,1437,1440,1442],{"class":483,"line":1436},35,[481,1438,1439],{"class":490},"    selected_models ",[481,1441,513],{"class":486},[481,1443,1433],{"class":490},[481,1445,1447],{"class":483,"line":1446},36,[481,1448,548],{"emptyLinePlaceholder":17},[481,1450,1452,1455],{"class":483,"line":1451},37,[481,1453,1454],{"class":486},"    if",[481,1456,1457],{"class":490}," select:\n",[481,1459,1461,1464,1467,1469,1472,1475,1478],{"class":483,"line":1460},38,[481,1462,1463],{"class":486},"        if",[481,1465,1466],{"class":490}," select[",[481,1468,527],{"class":502},[481,1470,1471],{"class":490},"] ",[481,1473,1474],{"class":486},"==",[481,1476,1477],{"class":1042}," \"+\"",[481,1479,1480],{"class":490},":\n",[481,1482,1484],{"class":483,"line":1483},39,[481,1485,1486],{"class":970},"            # If 'select' has a '+' sign, we need to find the direct dependencies of the selected model\n",[481,1488,1490,1493,1496,1498,1501,1504],{"class":483,"line":1489},40,[481,1491,1492],{"class":486},"            for",[481,1494,1495],{"class":490}," key, node ",[481,1497,1302],{"class":486},[481,1499,1500],{"class":490}," manifest_data[",[481,1502,1503],{"class":1042},"\"nodes\"",[481,1505,1506],{"class":490},"].items():\n",[481,1508,1510,1513,1515,1517,1520,1522,1525,1528],{"class":483,"line":1509},41,[481,1511,1512],{"class":486},"                if",[481,1514,1466],{"class":490},[481,1516,579],{"class":502},[481,1518,1519],{"class":490},":] ",[481,1521,1474],{"class":486},[481,1523,1524],{"class":490}," node[",[481,1526,1527],{"class":1042},"\"name\"",[481,1529,1530],{"class":490},"]:\n",[481,1532,1534,1537,1539,1542,1545,1548,1551,1553],{"class":483,"line":1533},42,[481,1535,1536],{"class":490},"                    selected_models ",[481,1538,513],{"class":486},[481,1540,1541],{"class":502}," set",[481,1543,1544],{"class":490},"(node[",[481,1546,1547],{"class":1042},"\"depends_on\"",[481,1549,1550],{"class":490},"][",[481,1552,1503],{"class":1042},[481,1554,1555],{"class":490},"])\n",[481,1557,1559,1562,1565],{"class":483,"line":1558},43,[481,1560,1561],{"class":490},"                    selected_models.add(node[",[481,1563,1564],{"class":1042},"\"unique_id\"",[481,1566,1555],{"class":490},[481,1568,1570,1573],{"class":483,"line":1569},44,[481,1571,1572],{"class":486},"        else",[481,1574,1480],{"class":490},[481,1576,1578],{"class":483,"line":1577},45,[481,1579,1580],{"class":970},"            # Otherwise, we just need to find the model with the given name\n",[481,1582,1584,1587,1589],{"class":483,"line":1583},46,[481,1585,1586],{"class":490},"            selected_models ",[481,1588,513],{"class":486},[481,1590,1591],{"class":490}," {select}\n",[481,1593,1595],{"class":483,"line":1594},47,[481,1596,548],{"emptyLinePlaceholder":17},[481,1598,1600,1603,1605,1607,1609,1611],{"class":483,"line":1599},48,[481,1601,1602],{"class":486},"    for",[481,1604,1495],{"class":490},[481,1606,1302],{"class":486},[481,1608,1500],{"class":490},[481,1610,1503],{"class":1042},[481,1612,1506],{"class":490},[481,1614,1616,1618,1620,1623,1625,1628,1631,1634,1636,1639,1641,1643,1646],{"class":483,"line":1615},49,[481,1617,1463],{"class":486},[481,1619,1524],{"class":490},[481,1621,1622],{"class":1042},"\"package_name\"",[481,1624,1471],{"class":490},[481,1626,1627],{"class":486},"!=",[481,1629,1630],{"class":1042}," \"geppetto_dbt\"",[481,1632,1633],{"class":486}," or",[481,1635,1524],{"class":490},[481,1637,1638],{"class":1042},"\"resource_type\"",[481,1640,1471],{"class":490},[481,1642,1627],{"class":486},[481,1644,1645],{"class":1042}," \"model\"",[481,1647,1480],{"class":490},[481,1649,1651],{"class":483,"line":1650},50,[481,1652,1653],{"class":486},"            continue\n",[481,1655,1657],{"class":483,"line":1656},51,[481,1658,548],{"emptyLinePlaceholder":17},[481,1660,1662,1664],{"class":483,"line":1661},52,[481,1663,1463],{"class":486},[481,1665,1666],{"class":490}," (\n",[481,1668,1670],{"class":483,"line":1669},53,[481,1671,1672],{"class":490},"            select\n",[481,1674,1676,1679],{"class":483,"line":1675},54,[481,1677,1678],{"class":486},"            and",[481,1680,1681],{"class":490}," selected_models\n",[481,1683,1685,1687,1689,1691,1693,1696,1699],{"class":483,"line":1684},55,[481,1686,1678],{"class":486},[481,1688,1524],{"class":490},[481,1690,1564],{"class":1042},[481,1692,1471],{"class":490},[481,1694,1695],{"class":486},"not",[481,1697,1698],{"class":486}," in",[481,1700,1681],{"class":490},[481,1702,1704,1706,1708,1710,1712,1714,1716],{"class":483,"line":1703},56,[481,1705,1678],{"class":486},[481,1707,1524],{"class":490},[481,1709,1527],{"class":1042},[481,1711,1471],{"class":490},[481,1713,1695],{"class":486},[481,1715,1698],{"class":486},[481,1717,1681],{"class":490},[481,1719,1721],{"class":483,"line":1720},57,[481,1722,1723],{"class":490},"        ):\n",[481,1725,1727],{"class":483,"line":1726},58,[481,1728,1653],{"class":486},[481,1730,1732],{"class":483,"line":1731},59,[481,1733,548],{"emptyLinePlaceholder":17},[481,1735,1737,1740,1742],{"class":483,"line":1736},60,[481,1738,1739],{"class":490},"        node_data ",[481,1741,513],{"class":486},[481,1743,1037],{"class":490},[481,1745,1747,1750,1753,1756],{"class":483,"line":1746},61,[481,1748,1749],{"class":1042},"            \"path\"",[481,1751,1752],{"class":490},": node[",[481,1754,1755],{"class":1042},"\"path\"",[481,1757,1758],{"class":490},"],\n",[481,1760,1762,1765,1767,1770,1772,1775],{"class":483,"line":1761},62,[481,1763,1764],{"class":1042},"            \"nb_columns\"",[481,1766,1046],{"class":490},[481,1768,1769],{"class":502},"len",[481,1771,1544],{"class":490},[481,1773,1774],{"class":1042},"\"columns\"",[481,1776,1777],{"class":490},"]),\n",[481,1779,1781,1784,1787,1790],{"class":483,"line":1780},63,[481,1782,1783],{"class":1042},"            \"sql_complexity\"",[481,1785,1786],{"class":490},": raw_sql_complexity(node[",[481,1788,1789],{"class":1042},"\"raw_code\"",[481,1791,1777],{"class":490},[481,1793,1795,1798,1800,1803,1805,1807,1809,1811],{"class":483,"line":1794},64,[481,1796,1797],{"class":1042},"            \"inputs\"",[481,1799,1046],{"class":490},[481,1801,1802],{"class":502},"set",[481,1804,1544],{"class":490},[481,1806,1547],{"class":1042},[481,1808,1550],{"class":490},[481,1810,1503],{"class":1042},[481,1812,1777],{"class":490},[481,1814,1816,1819,1821,1823],{"class":483,"line":1815},65,[481,1817,1818],{"class":1042},"            \"outputs\"",[481,1820,1046],{"class":490},[481,1822,1802],{"class":502},[481,1824,1825],{"class":490},"(),\n",[481,1827,1829],{"class":483,"line":1828},66,[481,1830,1831],{"class":490},"        }\n",[481,1833,1835,1838,1840],{"class":483,"line":1834},67,[481,1836,1837],{"class":490},"        data[key] ",[481,1839,513],{"class":486},[481,1841,1842],{"class":490}," node_data\n",[481,1844,1846],{"class":483,"line":1845},68,[481,1847,548],{"emptyLinePlaceholder":17},[481,1849,1851],{"class":483,"line":1850},69,[481,1852,1853],{"class":970},"    # compute outputs\n",[481,1855,1857,1859,1861,1863],{"class":483,"line":1856},70,[481,1858,1602],{"class":486},[481,1860,1495],{"class":490},[481,1862,1302],{"class":486},[481,1864,1865],{"class":490}," data.items():\n",[481,1867,1869,1872,1875,1877,1879,1882],{"class":483,"line":1868},71,[481,1870,1871],{"class":486},"        for",[481,1873,1874],{"class":490}," dep ",[481,1876,1302],{"class":486},[481,1878,1524],{"class":490},[481,1880,1881],{"class":1042},"\"inputs\"",[481,1883,1530],{"class":490},[481,1885,1887,1890,1892,1894],{"class":483,"line":1886},72,[481,1888,1889],{"class":486},"            if",[481,1891,1874],{"class":490},[481,1893,1302],{"class":486},[481,1895,1896],{"class":490}," data:\n",[481,1898,1900,1903,1906],{"class":483,"line":1899},73,[481,1901,1902],{"class":490},"                data[dep][",[481,1904,1905],{"class":1042},"\"outputs\"",[481,1907,1908],{"class":490},"].add(dep)\n",[481,1910,1912],{"class":483,"line":1911},74,[481,1913,548],{"emptyLinePlaceholder":17},[481,1915,1917],{"class":483,"line":1916},75,[481,1918,1919],{"class":970},"    # compute coupling and global\n",[481,1921,1923,1925,1928,1930],{"class":483,"line":1922},76,[481,1924,1602],{"class":486},[481,1926,1927],{"class":490}," node ",[481,1929,1302],{"class":486},[481,1931,1932],{"class":490}," data.values():\n",[481,1934,1936,1939,1942,1944,1946,1949,1951,1953,1956,1958,1960,1962,1964],{"class":483,"line":1935},77,[481,1937,1938],{"class":490},"        node[",[481,1940,1941],{"class":1042},"\"coupling\"",[481,1943,1471],{"class":490},[481,1945,513],{"class":486},[481,1947,1948],{"class":502}," len",[481,1950,1544],{"class":490},[481,1952,1881],{"class":1042},[481,1954,1955],{"class":490},"]) ",[481,1957,1271],{"class":486},[481,1959,1948],{"class":502},[481,1961,1544],{"class":490},[481,1963,1905],{"class":1042},[481,1965,1555],{"class":490},[481,1967,1969,1971,1974,1976,1978,1981,1984,1986,1988,1990,1993,1995,1997,2000,2003,2005,2007],{"class":483,"line":1968},78,[481,1970,1938],{"class":490},[481,1972,1973],{"class":1042},"\"complexity\"",[481,1975,1471],{"class":490},[481,1977,513],{"class":486},[481,1979,1980],{"class":490}," (node[",[481,1982,1983],{"class":1042},"\"sql_complexity\"",[481,1985,1471],{"class":490},[481,1987,1271],{"class":486},[481,1989,1524],{"class":490},[481,1991,1992],{"class":1042},"\"nb_columns\"",[481,1994,1955],{"class":490},[481,1996,1325],{"class":486},[481,1998,1999],{"class":490}," coupling_factor ",[481,2001,2002],{"class":486},"**",[481,2004,1524],{"class":490},[481,2006,1941],{"class":1042},[481,2008,2009],{"class":490},"]\n",[481,2011,2013,2015],{"class":483,"line":2012},79,[481,2014,1311],{"class":486},[481,2016,2017],{"class":490}," data\n",[481,2019,2021],{"class":483,"line":2020},80,[481,2022,548],{"emptyLinePlaceholder":17},[481,2024,2026,2028,2031],{"class":483,"line":2025},81,[481,2027,1241],{"class":486},[481,2029,2030],{"class":1244}," print_manifest_complexity",[481,2032,2033],{"class":490},"(data):\n",[481,2035,2037,2039,2041,2043,2046,2049,2053,2056,2059,2061],{"class":483,"line":2036},82,[481,2038,1602],{"class":486},[481,2040,1927],{"class":490},[481,2042,1302],{"class":486},[481,2044,2045],{"class":502}," sorted",[481,2047,2048],{"class":490},"(data.values(), ",[481,2050,2052],{"class":2051},"s4XuR","key",[481,2054,2055],{"class":486},"=lambda",[481,2057,2058],{"class":490}," node: node[",[481,2060,1973],{"class":1042},[481,2062,2063],{"class":490},"]):\n",[481,2065,2067,2070],{"class":483,"line":2066},83,[481,2068,2069],{"class":502},"        print",[481,2071,2072],{"class":490},"(\n",[481,2074,2076,2079,2081,2084,2087,2090,2093,2096,2099,2102,2104,2106,2109,2111,2113,2116,2118,2120,2123,2125,2128,2130,2133,2135,2137,2140,2142,2144,2147,2150,2152,2155,2158,2160],{"class":483,"line":2075},84,[481,2077,2078],{"class":486},"            f",[481,2080,1265],{"class":1042},[481,2082,2083],{"class":502},"{",[481,2085,2086],{"class":490},"node[",[481,2088,2089],{"class":1042},"'path'",[481,2091,2092],{"class":490},"]",[481,2094,2095],{"class":486},":50",[481,2097,2098],{"class":502},"}\\t",[481,2100,2101],{"class":1042},"nb_columns=",[481,2103,2083],{"class":502},[481,2105,2086],{"class":490},[481,2107,2108],{"class":1042},"'nb_columns'",[481,2110,2092],{"class":490},[481,2112,2098],{"class":502},[481,2114,2115],{"class":1042},"sql=",[481,2117,2083],{"class":502},[481,2119,2086],{"class":490},[481,2121,2122],{"class":1042},"'sql_complexity'",[481,2124,2092],{"class":490},[481,2126,2127],{"class":486},":.1f",[481,2129,2098],{"class":502},[481,2131,2132],{"class":1042},"coupling=",[481,2134,2083],{"class":502},[481,2136,2086],{"class":490},[481,2138,2139],{"class":1042},"'coupling'",[481,2141,2092],{"class":490},[481,2143,2098],{"class":502},[481,2145,2146],{"class":1042},"complexity=",[481,2148,2149],{"class":502},"{round",[481,2151,1544],{"class":490},[481,2153,2154],{"class":1042},"'complexity'",[481,2156,2157],{"class":490},"])",[481,2159,1226],{"class":502},[481,2161,2162],{"class":1042},"\"\n",[481,2164,2166],{"class":483,"line":2165},85,[481,2167,2168],{"class":490},"        )\n",[481,2170,2172],{"class":483,"line":2171},86,[481,2173,548],{"emptyLinePlaceholder":17},[481,2175,2177,2180,2183,2186],{"class":483,"line":2176},87,[481,2178,2179],{"class":502},"    print",[481,2181,2182],{"class":490},"(",[481,2184,2185],{"class":1042},"\"---\"",[481,2187,2188],{"class":490},")\n",[481,2190,2192,2194,2196,2199,2202,2205,2208,2210,2212],{"class":483,"line":2191},88,[481,2193,2179],{"class":502},[481,2195,2182],{"class":490},[481,2197,2198],{"class":486},"f",[481,2200,2201],{"class":1042},"\"nb models => ",[481,2203,2204],{"class":502},"{len",[481,2206,2207],{"class":490},"(data)",[481,2209,1226],{"class":502},[481,2211,1265],{"class":1042},[481,2213,2188],{"class":490},[481,2215,2217,2219],{"class":483,"line":2216},89,[481,2218,2179],{"class":502},[481,2220,2072],{"class":490},[481,2222,2224,2227,2230,2232,2235,2238,2241,2244,2246,2249,2252,2254,2257,2259,2261,2264,2266,2268,2270,2272,2274,2276,2279,2281],{"class":483,"line":2223},90,[481,2225,2226],{"class":486},"        f",[481,2228,2229],{"class":1042},"\"global complexity",[481,2231,2083],{"class":502},[481,2233,2234],{"class":1042},"' of '",[481,2236,2237],{"class":486}," +",[481,2239,2240],{"class":490}," args.select ",[481,2242,2243],{"class":486},"if",[481,2245,2240],{"class":490},[481,2247,2248],{"class":486},"else",[481,2250,2251],{"class":1042}," ''",[481,2253,1226],{"class":502},[481,2255,2256],{"class":1042}," => ",[481,2258,2149],{"class":502},[481,2260,2182],{"class":490},[481,2262,2263],{"class":502},"sum",[481,2265,1544],{"class":490},[481,2267,2154],{"class":1042},[481,2269,1471],{"class":490},[481,2271,1296],{"class":486},[481,2273,1927],{"class":490},[481,2275,1302],{"class":486},[481,2277,2278],{"class":490}," data.values()))",[481,2280,1226],{"class":502},[481,2282,2162],{"class":1042},[481,2284,2286],{"class":483,"line":2285},91,[481,2287,2288],{"class":490},"    )\n",[481,2290,2292],{"class":483,"line":2291},92,[481,2293,548],{"emptyLinePlaceholder":17},[481,2295,2297,2299,2302],{"class":483,"line":2296},93,[481,2298,1241],{"class":486},[481,2300,2301],{"class":1244}," print_diff_complexity",[481,2303,2304],{"class":490},"(data_from, data_to):\n",[481,2306,2308,2311,2313,2316,2319,2322,2325,2327,2330,2332,2335,2337,2339],{"class":483,"line":2307},94,[481,2309,2310],{"class":490},"    all_data ",[481,2312,513],{"class":486},[481,2314,2315],{"class":490}," defaultdict(",[481,2317,2318],{"class":486},"lambda",[481,2320,2321],{"class":490},": {",[481,2323,2324],{"class":1042},"\"from\"",[481,2326,1046],{"class":490},[481,2328,2329],{"class":502},"None",[481,2331,1276],{"class":490},[481,2333,2334],{"class":1042},"\"to\"",[481,2336,1046],{"class":490},[481,2338,2329],{"class":502},[481,2340,2341],{"class":490},"})\n",[481,2343,2345,2347,2349,2351],{"class":483,"line":2344},95,[481,2346,1602],{"class":486},[481,2348,1927],{"class":490},[481,2350,1302],{"class":486},[481,2352,2353],{"class":490}," data_from.values():\n",[481,2355,2357,2360,2362,2365,2367,2369,2371],{"class":483,"line":2356},96,[481,2358,2359],{"class":490},"        all_data[node[",[481,2361,1755],{"class":1042},[481,2363,2364],{"class":490},"]][",[481,2366,2324],{"class":1042},[481,2368,1471],{"class":490},[481,2370,513],{"class":486},[481,2372,2373],{"class":490}," node\n",[481,2375,2377,2379,2381,2383],{"class":483,"line":2376},97,[481,2378,1602],{"class":486},[481,2380,1927],{"class":490},[481,2382,1302],{"class":486},[481,2384,2385],{"class":490}," data_to.values():\n",[481,2387,2389,2391,2393,2395,2397,2399,2401],{"class":483,"line":2388},98,[481,2390,2359],{"class":490},[481,2392,1755],{"class":1042},[481,2394,2364],{"class":490},[481,2396,2334],{"class":1042},[481,2398,1471],{"class":490},[481,2400,513],{"class":486},[481,2402,2373],{"class":490},[481,2404,2406],{"class":483,"line":2405},99,[481,2407,548],{"emptyLinePlaceholder":17},[481,2409,2411,2414,2417],{"class":483,"line":2410},100,[481,2412,2413],{"class":486},"    def",[481,2415,2416],{"class":1244}," print_node",[481,2418,2419],{"class":490},"(prefix, node):\n",[481,2421,2423,2425],{"class":483,"line":2422},101,[481,2424,2069],{"class":502},[481,2426,2072],{"class":490},[481,2428,2430,2432,2434,2436,2439,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502],{"class":483,"line":2429},102,[481,2431,2078],{"class":486},[481,2433,1265],{"class":1042},[481,2435,2083],{"class":502},[481,2437,2438],{"class":490},"prefix",[481,2440,2441],{"class":502},"}\\t{",[481,2443,2086],{"class":490},[481,2445,2089],{"class":1042},[481,2447,2092],{"class":490},[481,2449,2095],{"class":486},[481,2451,2098],{"class":502},[481,2453,2101],{"class":1042},[481,2455,2083],{"class":502},[481,2457,2086],{"class":490},[481,2459,2108],{"class":1042},[481,2461,2092],{"class":490},[481,2463,2098],{"class":502},[481,2465,2115],{"class":1042},[481,2467,2083],{"class":502},[481,2469,2086],{"class":490},[481,2471,2122],{"class":1042},[481,2473,2092],{"class":490},[481,2475,2127],{"class":486},[481,2477,2098],{"class":502},[481,2479,2132],{"class":1042},[481,2481,2083],{"class":502},[481,2483,2086],{"class":490},[481,2485,2139],{"class":1042},[481,2487,2092],{"class":490},[481,2489,2098],{"class":502},[481,2491,2146],{"class":1042},[481,2493,2149],{"class":502},[481,2495,1544],{"class":490},[481,2497,2154],{"class":1042},[481,2499,2157],{"class":490},[481,2501,1226],{"class":502},[481,2503,2162],{"class":1042},[481,2505,2507],{"class":483,"line":2506},103,[481,2508,2168],{"class":490},[481,2510,2512],{"class":483,"line":2511},104,[481,2513,548],{"emptyLinePlaceholder":17},[481,2515,2517,2520,2522],{"class":483,"line":2516},105,[481,2518,2519],{"class":490},"    has_diff ",[481,2521,513],{"class":486},[481,2523,2524],{"class":502}," False\n",[481,2526,2528,2530,2533,2535],{"class":483,"line":2527},106,[481,2529,1602],{"class":486},[481,2531,2532],{"class":490}," diff_nodes ",[481,2534,1302],{"class":486},[481,2536,2537],{"class":490}," all_data.values():\n",[481,2539,2541,2544,2546,2549,2551,2554,2556],{"class":483,"line":2540},107,[481,2542,2543],{"class":490},"        node_from, node_to ",[481,2545,513],{"class":486},[481,2547,2548],{"class":490}," diff_nodes[",[481,2550,2324],{"class":1042},[481,2552,2553],{"class":490},"], diff_nodes[",[481,2555,2334],{"class":1042},[481,2557,2009],{"class":490},[481,2559,2561,2563,2566,2568],{"class":483,"line":2560},108,[481,2562,1463],{"class":486},[481,2564,2565],{"class":490}," node_from ",[481,2567,1474],{"class":486},[481,2569,2570],{"class":490}," node_to:\n",[481,2572,2574],{"class":483,"line":2573},109,[481,2575,1653],{"class":486},[481,2577,2579,2582,2584,2587,2590],{"class":483,"line":2578},110,[481,2580,2581],{"class":486},"        elif",[481,2583,2565],{"class":490},[481,2585,2586],{"class":486},"is",[481,2588,2589],{"class":502}," None",[481,2591,1480],{"class":490},[481,2593,2595,2598,2601],{"class":483,"line":2594},111,[481,2596,2597],{"class":490},"            print_node(",[481,2599,2600],{"class":1042},"\"ADDED\"",[481,2602,2603],{"class":490},", node_to)\n",[481,2605,2607,2609,2612,2614,2616],{"class":483,"line":2606},112,[481,2608,2581],{"class":486},[481,2610,2611],{"class":490}," node_to ",[481,2613,2586],{"class":486},[481,2615,2589],{"class":502},[481,2617,1480],{"class":490},[481,2619,2621,2623,2626],{"class":483,"line":2620},113,[481,2622,2597],{"class":490},[481,2624,2625],{"class":1042},"\"DELETED\"",[481,2627,2628],{"class":490},", node_from)\n",[481,2630,2632,2634],{"class":483,"line":2631},114,[481,2633,1572],{"class":486},[481,2635,1480],{"class":490},[481,2637,2639,2641,2644],{"class":483,"line":2638},115,[481,2640,2597],{"class":490},[481,2642,2643],{"class":1042},"\"BEFORE\"",[481,2645,2628],{"class":490},[481,2647,2649,2651,2654],{"class":483,"line":2648},116,[481,2650,2597],{"class":490},[481,2652,2653],{"class":1042},"\"AFTER\"",[481,2655,2603],{"class":490},[481,2657,2659,2662,2664],{"class":483,"line":2658},117,[481,2660,2661],{"class":490},"        has_diff ",[481,2663,513],{"class":486},[481,2665,2666],{"class":502}," True\n",[481,2668,2670],{"class":483,"line":2669},118,[481,2671,548],{"emptyLinePlaceholder":17},[481,2673,2675,2677,2680],{"class":483,"line":2674},119,[481,2676,1454],{"class":486},[481,2678,2679],{"class":486}," not",[481,2681,2682],{"class":490}," has_diff:\n",[481,2684,2686,2688,2690,2693],{"class":483,"line":2685},120,[481,2687,2069],{"class":502},[481,2689,2182],{"class":490},[481,2691,2692],{"class":1042},"\"No change on model DBT complexity\"",[481,2694,2188],{"class":490},[481,2696,2698,2701],{"class":483,"line":2697},121,[481,2699,2700],{"class":486},"    else",[481,2702,1480],{"class":490},[481,2704,2706,2708,2710,2712],{"class":483,"line":2705},122,[481,2707,2069],{"class":502},[481,2709,2182],{"class":490},[481,2711,2185],{"class":1042},[481,2713,2188],{"class":490},[481,2715,2717,2719,2721,2723,2726,2728,2731,2733,2736,2738,2741,2743,2746,2748,2751,2754,2756,2758,2760,2762],{"class":483,"line":2716},123,[481,2718,2069],{"class":502},[481,2720,2182],{"class":490},[481,2722,2198],{"class":486},[481,2724,2725],{"class":1042},"\"nb models before=",[481,2727,2204],{"class":502},[481,2729,2730],{"class":490},"(data_from)",[481,2732,1226],{"class":502},[481,2734,2735],{"class":1042}," after=",[481,2737,2204],{"class":502},[481,2739,2740],{"class":490},"(data_to)",[481,2742,1226],{"class":502},[481,2744,2745],{"class":1042}," diff=",[481,2747,2204],{"class":502},[481,2749,2750],{"class":490},"(data_to) ",[481,2752,2753],{"class":486},"-",[481,2755,1948],{"class":502},[481,2757,2730],{"class":490},[481,2759,1226],{"class":502},[481,2761,1265],{"class":1042},[481,2763,2188],{"class":490},[481,2765,2767,2770,2772,2775,2777,2779,2781,2783,2785,2787,2789,2791],{"class":483,"line":2766},124,[481,2768,2769],{"class":490},"        global_before ",[481,2771,513],{"class":486},[481,2773,2774],{"class":502}," round",[481,2776,2182],{"class":490},[481,2778,2263],{"class":502},[481,2780,1544],{"class":490},[481,2782,1973],{"class":1042},[481,2784,1471],{"class":490},[481,2786,1296],{"class":486},[481,2788,1927],{"class":490},[481,2790,1302],{"class":486},[481,2792,2793],{"class":490}," data_from.values()))\n",[481,2795,2797,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820],{"class":483,"line":2796},125,[481,2798,2799],{"class":490},"        global_after ",[481,2801,513],{"class":486},[481,2803,2774],{"class":502},[481,2805,2182],{"class":490},[481,2807,2263],{"class":502},[481,2809,1544],{"class":490},[481,2811,1973],{"class":1042},[481,2813,1471],{"class":490},[481,2815,1296],{"class":486},[481,2817,1927],{"class":490},[481,2819,1302],{"class":486},[481,2821,2822],{"class":490}," data_to.values()))\n",[481,2824,2826,2828,2830,2832,2835,2837,2840,2842,2844,2846,2849,2851,2853,2855,2858,2860,2863,2865,2867],{"class":483,"line":2825},126,[481,2827,2069],{"class":502},[481,2829,2182],{"class":490},[481,2831,2198],{"class":486},[481,2833,2834],{"class":1042},"\"global complexity before=",[481,2836,2083],{"class":502},[481,2838,2839],{"class":490},"global_before",[481,2841,1226],{"class":502},[481,2843,2735],{"class":1042},[481,2845,2083],{"class":502},[481,2847,2848],{"class":490},"global_after",[481,2850,1226],{"class":502},[481,2852,2745],{"class":1042},[481,2854,2083],{"class":502},[481,2856,2857],{"class":490},"global_after ",[481,2859,2753],{"class":486},[481,2861,2862],{"class":490}," global_before",[481,2864,1226],{"class":502},[481,2866,1265],{"class":1042},[481,2868,2188],{"class":490},[481,2870,2872],{"class":483,"line":2871},127,[481,2873,548],{"emptyLinePlaceholder":17},[481,2875,2877,2879,2882,2885,2888],{"class":483,"line":2876},128,[481,2878,2243],{"class":486},[481,2880,2881],{"class":502}," __name__",[481,2883,2884],{"class":486}," ==",[481,2886,2887],{"class":1042}," \"__main__\"",[481,2889,1480],{"class":490},[481,2891,2893,2896,2898],{"class":483,"line":2892},129,[481,2894,2895],{"class":490},"    parser ",[481,2897,513],{"class":486},[481,2899,2900],{"class":490}," argparse.ArgumentParser(\n",[481,2902,2904,2907,2909,2912],{"class":483,"line":2903},130,[481,2905,2906],{"class":2051},"        description",[481,2908,513],{"class":486},[481,2910,2911],{"class":1042},"\"Analyze DBT project manifest and produce a complexity report\"",[481,2913,1052],{"class":490},[481,2915,2917],{"class":483,"line":2916},131,[481,2918,2288],{"class":490},[481,2920,2922,2925,2928],{"class":483,"line":2921},132,[481,2923,2924],{"class":490},"    parser.add_argument(",[481,2926,2927],{"class":1042},"\"manifest\"",[481,2929,2188],{"class":490},[481,2931,2933,2935,2938,2940,2943,2945,2948,2950,2953,2955,2957],{"class":483,"line":2932},133,[481,2934,2924],{"class":490},[481,2936,2937],{"class":1042},"\"--coupling-factor\"",[481,2939,1276],{"class":490},[481,2941,2942],{"class":2051},"type",[481,2944,513],{"class":486},[481,2946,2947],{"class":502},"float",[481,2949,1276],{"class":490},[481,2951,2952],{"class":2051},"default",[481,2954,513],{"class":486},[481,2956,1362],{"class":502},[481,2958,2188],{"class":490},[481,2960,2962,2964,2967,2969,2971,2973,2976,2978,2980,2982,2984],{"class":483,"line":2961},134,[481,2963,2924],{"class":490},[481,2965,2966],{"class":1042},"\"--min-columns\"",[481,2968,1276],{"class":490},[481,2970,2942],{"class":2051},[481,2972,513],{"class":486},[481,2974,2975],{"class":502},"int",[481,2977,1276],{"class":490},[481,2979,2952],{"class":2051},[481,2981,513],{"class":486},[481,2983,731],{"class":502},[481,2985,2188],{"class":490},[481,2987,2989,2991,2994,2996,2998,3000,3002,3004,3006,3008,3010],{"class":483,"line":2988},135,[481,2990,2924],{"class":490},[481,2992,2993],{"class":1042},"\"--max-columns\"",[481,2995,1276],{"class":490},[481,2997,2942],{"class":2051},[481,2999,513],{"class":486},[481,3001,2975],{"class":502},[481,3003,1276],{"class":490},[481,3005,2952],{"class":2051},[481,3007,513],{"class":486},[481,3009,1377],{"class":502},[481,3011,2188],{"class":490},[481,3013,3015,3017,3020,3022,3024,3026,3029,3031,3033,3035,3037],{"class":483,"line":3014},136,[481,3016,2924],{"class":490},[481,3018,3019],{"class":1042},"\"--select\"",[481,3021,1276],{"class":490},[481,3023,2942],{"class":2051},[481,3025,513],{"class":486},[481,3027,3028],{"class":502},"str",[481,3030,1276],{"class":490},[481,3032,2952],{"class":2051},[481,3034,513],{"class":486},[481,3036,1385],{"class":1042},[481,3038,2188],{"class":490},[481,3040,3042,3044,3047,3049,3051,3053,3055,3057,3060,3062,3065],{"class":483,"line":3041},137,[481,3043,2924],{"class":490},[481,3045,3046],{"class":1042},"\"--diff-from-manifest\"",[481,3048,1276],{"class":490},[481,3050,2952],{"class":2051},[481,3052,513],{"class":486},[481,3054,2329],{"class":502},[481,3056,1276],{"class":490},[481,3058,3059],{"class":2051},"help",[481,3061,513],{"class":486},[481,3063,3064],{"class":1042},"\"Print diff with this manifest\"",[481,3066,2188],{"class":490},[481,3068,3070,3073,3075],{"class":483,"line":3069},138,[481,3071,3072],{"class":490},"    args ",[481,3074,513],{"class":486},[481,3076,3077],{"class":490}," parser.parse_args()\n",[481,3079,3081],{"class":483,"line":3080},139,[481,3082,548],{"emptyLinePlaceholder":17},[481,3084,3086,3088,3091,3093,3095,3097],{"class":483,"line":3085},140,[481,3087,1454],{"class":486},[481,3089,3090],{"class":490}," args.diff_from_manifest ",[481,3092,2586],{"class":486},[481,3094,2679],{"class":486},[481,3096,2589],{"class":502},[481,3098,1480],{"class":490},[481,3100,3102,3105,3107],{"class":483,"line":3101},141,[481,3103,3104],{"class":490},"        data_from ",[481,3106,513],{"class":486},[481,3108,3109],{"class":490}," analyze_manifest(\n",[481,3111,3113],{"class":483,"line":3112},142,[481,3114,3115],{"class":490},"            args.diff_from_manifest,\n",[481,3117,3119,3122,3124],{"class":483,"line":3118},143,[481,3120,3121],{"class":2051},"            coupling_factor",[481,3123,513],{"class":486},[481,3125,3126],{"class":490},"args.coupling_factor,\n",[481,3128,3130,3133,3135],{"class":483,"line":3129},144,[481,3131,3132],{"class":2051},"            min_columns",[481,3134,513],{"class":486},[481,3136,3137],{"class":490},"args.min_columns,\n",[481,3139,3141,3144,3146],{"class":483,"line":3140},145,[481,3142,3143],{"class":2051},"            max_columns",[481,3145,513],{"class":486},[481,3147,3148],{"class":490},"args.max_columns,\n",[481,3150,3152],{"class":483,"line":3151},146,[481,3153,2168],{"class":490},[481,3155,3157,3160,3162],{"class":483,"line":3156},147,[481,3158,3159],{"class":490},"        data_to ",[481,3161,513],{"class":486},[481,3163,3109],{"class":490},[481,3165,3167],{"class":483,"line":3166},148,[481,3168,3169],{"class":490},"            args.manifest,\n",[481,3171,3173,3175,3177],{"class":483,"line":3172},149,[481,3174,3121],{"class":2051},[481,3176,513],{"class":486},[481,3178,3126],{"class":490},[481,3180,3182,3184,3186],{"class":483,"line":3181},150,[481,3183,3132],{"class":2051},[481,3185,513],{"class":486},[481,3187,3137],{"class":490},[481,3189,3191,3193,3195],{"class":483,"line":3190},151,[481,3192,3143],{"class":2051},[481,3194,513],{"class":486},[481,3196,3148],{"class":490},[481,3198,3200],{"class":483,"line":3199},152,[481,3201,2168],{"class":490},[481,3203,3205],{"class":483,"line":3204},153,[481,3206,3207],{"class":490},"        print_diff_complexity(data_from, data_to)\n",[481,3209,3211,3213],{"class":483,"line":3210},154,[481,3212,2700],{"class":486},[481,3214,1480],{"class":490},[481,3216,3218,3221,3223],{"class":483,"line":3217},155,[481,3219,3220],{"class":490},"        data ",[481,3222,513],{"class":486},[481,3224,3109],{"class":490},[481,3226,3228],{"class":483,"line":3227},156,[481,3229,3169],{"class":490},[481,3231,3233,3235,3237],{"class":483,"line":3232},157,[481,3234,3121],{"class":2051},[481,3236,513],{"class":486},[481,3238,3126],{"class":490},[481,3240,3242,3244,3246],{"class":483,"line":3241},158,[481,3243,3132],{"class":2051},[481,3245,513],{"class":486},[481,3247,3137],{"class":490},[481,3249,3251,3253,3255],{"class":483,"line":3250},159,[481,3252,3143],{"class":2051},[481,3254,513],{"class":486},[481,3256,3148],{"class":490},[481,3258,3260,3263,3265],{"class":483,"line":3259},160,[481,3261,3262],{"class":2051},"            select",[481,3264,513],{"class":486},[481,3266,3267],{"class":490},"args.select,\n",[481,3269,3271],{"class":483,"line":3270},161,[481,3272,2168],{"class":490},[481,3274,3276],{"class":483,"line":3275},162,[481,3277,3278],{"class":490},"        print_manifest_complexity(data)\n",[3280,3281,3282],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":11,"searchDepth":12,"depth":12,"links":3284},[3285,3289],{"id":360,"depth":12,"text":361,"children":3286},[3287],{"id":411,"depth":551,"text":3288},"Exemple de simplification de lineage après correction d’une alerte fct_rejoining_of_upstream_concepts",{"id":434,"depth":12,"text":435,"children":3290},[3291],{"id":470,"depth":551,"text":471},"2024-01-25","fr",{},"\u002Farticles\u002F2024-01-25-monitoring-de-la-complexite-des-models-dbt",{"title":333,"description":356},"articles\u002F2024-01-25-monitoring-de-la-complexite-des-models-dbt",[3299,3300],"Tech","Data","1i1Mi5QVRY-uDjUFhqvxbloRpqZsQoRZg5od5zKFFps",1775837023388]