[{"data":1,"prerenderedAt":4040},["ShallowReactive",2],{"/fr-fr/blog/how-gitlab-duo-agent-platform-transforms-dataops":3,"navigation-fr-fr":3257,"banner-fr-fr":3691,"footer-fr-fr":3699,"blog-post-authors-fr-fr-Dennis van Rooijen":3938,"blog-related-posts-fr-fr-how-gitlab-duo-agent-platform-transforms-dataops":3954,"blog-promotions-fr-fr":3979,"next-steps-fr-fr":4031},{"id":4,"title":5,"authors":6,"body":8,"category":3238,"date":3239,"description":3240,"extension":3241,"externalUrl":3242,"faq":3242,"featured":3243,"heroImage":3244,"meta":3245,"navigation":166,"path":3246,"seo":3247,"slug":3249,"stem":3250,"tags":3251,"template":3255,"updatedDate":3242,"__hash__":3256},"blogPosts/fr-fr/blog/how-gitlab-duo-agent-platform-transforms-dataops.md","Comment GitLab Duo Agent Platform révolutionne le DataOps",[7],"Dennis van Rooijen",{"type":9,"value":10,"toc":3218},"minimark",[11,15,25,38,43,52,55,79,86,98,101,131,134,137,141,150,290,293,307,325,329,332,344,347,351,354,362,365,391,395,398,463,467,470,526,532,537,544,551,801,806,1023,1028,1165,1170,1225,1229,1238,1244,1247,1264,3040,3046,3049,3068,3072,3086,3089,3093,3096,3100,3111,3117,3121,3132,3136,3154,3158,3169,3173,3176,3179,3185,3194,3198,3214],[12,13,14],"p",{},"Créer manuellement des modèles dbt est un processus fastidieux qui peut prendre des heures. Si aucune transformation majeure n'est requise, il ne s'agit pas de la partie la plus stimulante du travail des Data Engineers.",[12,16,17,18,24],{},"Imaginez pouvoir automatiser ce processus dans son intégralité. Dans ce guide pratique, nous vous montrons précisément comment ",[19,20,23],"a",{"href":21,"rel":22},"https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/",[],"GitLab Duo Agent Platform"," peut générer des modèles dbt complets en quelques minutes seulement, avec une structure, des tests et de la documentation.",[26,27,28],"blockquote",{},[12,29,30],{},[31,32,33],"strong",{},[19,34,37],{"href":35,"rel":36},"https://about.gitlab.com/fr-fr/free-trial/devsecops/?utm_medium=blog&utm_source=blog&utm_campaign=eg_emea_x_trial_x_fr_blog_fr",[],"→ Essayez GitLab Ultimate et GitLab Duo Enterprise gratuitement.",[39,40,42],"h2",{"id":41},"exemple-pratique","Exemple pratique",[12,44,45,46,51],{},"Notre équipe marketing souhaite gérer et optimiser efficacement ses investissements publicitaires. Reddit étant l'une des plateformes publicitaires utilisées, nous extrayons donc les données de l'API Reddit Ads vers notre ",[19,47,50],{"href":48,"rel":49},"https://handbook.gitlab.com/handbook/enterprise-data/platform/",[],"plateforme de données"," d'entreprise Snowflake.",[12,53,54],{},"GitLab possède trois couches de stockage :",[56,57,58,67,73],"ol",{},[59,60,61,62,66],"li",{},"Couche ",[63,64,65],"code",{},"raw"," : premier emplacement pour les données non traitées issues de sources externes, elles ne sont pas encore prêtes pour une utilisation métier.",[59,68,61,69,72],{},[63,70,71],{},"prep",": première couche de transformation avec les modèles sources, les données ne sont toujours pas prêtes pour une utilisation générale.",[59,74,61,75,78],{},[63,76,77],{},"prod"," : données finales transformées prêtes pour l'utilisation métier et les rapports Tableau.",[12,80,81],{},[82,83],"img",{"alt":84,"src":85},"Schéma des couches de stockage","https://res.cloudinary.com/about-gitlab-com/image/upload/v1758030995/zo7vespktzfdtdtiauz7.png",[12,87,88,89,91,92,94,95,97],{},"Dans ce guide, les données sont déjà dans la couche ",[63,90,65],{}," grâce à notre solution d'extraction Fivetran, et nous allons générer les modèles dbt qui gèrent les données de la couche ",[63,93,71],{}," jusqu'à la couche ",[63,96,77],{},".",[12,99,100],{},"Sans avoir à écrire une seule ligne de code dbt nous-mêmes, nous aurons à la fin de ce guide :",[102,103,104,112,119,125],"ul",{},[59,105,106,109,110],{},[31,107,108],{},"Des modèles sources"," dans la couche ",[63,111,71],{},[59,113,114,109,117],{},[31,115,116],{},"Des modèles workspace",[63,118,77],{},[59,120,121,124],{},[31,122,123],{},"Des configurations dbt complètes"," pour les 13 tables (soit 112 colonnes) du jeu de données Reddit Ads",[59,126,127,130],{},[31,128,129],{},"Des requêtes de test"," pour valider les résultats",[12,132,133],{},"Le processus complet prendra moins de 10 minutes, comparé aux heures habituellement nécessaires du processus manuel.",[12,135,136],{},"Voici les étapes à suivre :",[39,138,140],{"id":139},"_1-préparer-la-structure-des-données","1. Préparer la structure des données",[12,142,143,144,149],{},"Avant que GitLab Duo ne puisse générer nos modèles, il doit comprendre la structure complète des tables. La clé est d'exécuter une requête sur le schéma d'informations de Snowflake, car nous étudions actuellement comment connecter GitLab Duo via Model Context Protocol (",[19,145,148],{"href":146,"rel":147},"https://about.gitlab.com/topics/ai/model-context-protocol/",[],"MCP",") à notre instance Snowflake :",[151,152,157],"pre",{"className":153,"code":154,"language":155,"meta":156,"style":156},"language-sql shiki shiki-themes github-light","\nSELECT\n    table_name,\n    column_name,\n    data_type,\n    is_nullable,\n    CASE\n        WHEN is_nullable = 'NO' THEN 'PRIMARY_KEY'\n        ELSE NULL\n    END as key_type\nFROM raw.information_schema.columns\nWHERE table_schema = 'REDDIT_ADS'\nORDER BY table_name, ordinal_position;\n\n","sql","",[63,158,159,168,175,182,188,194,200,206,228,237,249,267,281],{"__ignoreMap":156},[160,161,164],"span",{"class":162,"line":163},"line",1,[160,165,167],{"emptyLinePlaceholder":166},true,"\n",[160,169,171],{"class":162,"line":170},2,[160,172,174],{"class":173},"sD7c4","SELECT\n",[160,176,178],{"class":162,"line":177},3,[160,179,181],{"class":180},"sgsFI","    table_name,\n",[160,183,185],{"class":162,"line":184},4,[160,186,187],{"class":180},"    column_name,\n",[160,189,191],{"class":162,"line":190},5,[160,192,193],{"class":180},"    data_type,\n",[160,195,197],{"class":162,"line":196},6,[160,198,199],{"class":180},"    is_nullable,\n",[160,201,203],{"class":162,"line":202},7,[160,204,205],{"class":173},"    CASE\n",[160,207,209,212,215,218,222,225],{"class":162,"line":208},8,[160,210,211],{"class":173},"        WHEN",[160,213,214],{"class":180}," is_nullable ",[160,216,217],{"class":173},"=",[160,219,221],{"class":220},"sYBdl"," 'NO'",[160,223,224],{"class":173}," THEN",[160,226,227],{"class":220}," 'PRIMARY_KEY'\n",[160,229,231,234],{"class":162,"line":230},9,[160,232,233],{"class":173},"        ELSE",[160,235,236],{"class":173}," NULL\n",[160,238,240,243,246],{"class":162,"line":239},10,[160,241,242],{"class":173},"    END",[160,244,245],{"class":173}," as",[160,247,248],{"class":180}," key_type\n",[160,250,252,255,259,261,264],{"class":162,"line":251},11,[160,253,254],{"class":173},"FROM",[160,256,258],{"class":257},"sYu0t"," raw",[160,260,97],{"class":180},[160,262,263],{"class":257},"information_schema",[160,265,266],{"class":180},".columns\n",[160,268,270,273,276,278],{"class":162,"line":269},12,[160,271,272],{"class":173},"WHERE",[160,274,275],{"class":180}," table_schema ",[160,277,217],{"class":173},[160,279,280],{"class":220}," 'REDDIT_ADS'\n",[160,282,284,287],{"class":162,"line":283},13,[160,285,286],{"class":173},"ORDER BY",[160,288,289],{"class":180}," table_name, ordinal_position;\n",[12,291,292],{},"Cette requête contient :",[102,294,295,298,301,304],{},[59,296,297],{},"Tous les noms de tables et colonnes",[59,299,300],{},"Les types de données pour une structure de modèle appropriée",[59,302,303],{},"Les contraintes nullables",[59,305,306],{},"L'identification des clés primaires (colonnes non-nullables dans ce jeu de données)",[12,308,309,312,313,316,317,320,321,324],{},[31,310,311],{},"Conseil de pro :"," dans le jeu de données Reddit Ads, toutes les colonnes non-nullables servent de clés primaires, il s'agit là d'un modèle récurrent. Nous avons validé ce modèle en vérifiant des tables comme ",[63,314,315],{},"ad_group",", qui possèdent deux colonnes non-nullables (",[63,318,319],{},"account_id"," et ",[63,322,323],{},"id",") toutes deux marquées comme clés primaires. L'exécution de cette requête a renvoyé 112 lignes de métadonnées que nous avons exportées dans un fichier CSV pour la génération de modèles. Bien que cette étape manuelle fonctionne bien aujourd'hui, nous étudions une intégration directe de GitLab Duo avec notre plateforme de données via MCP pour automatiser entièrement ce processus.",[39,326,328],{"id":327},"_2-configurer-gitlab-duo","2. Configurer GitLab Duo",[12,330,331],{},"Il existe deux façons d'interagir avec GitLab Duo :",[56,333,334,339],{},[59,335,336],{},[31,337,338],{},"La fonction chat de l'interface web",[59,340,341],{},[31,342,343],{},"Le plugin Visual Studio Code",[12,345,346],{},"Nous avons choisi le plugin VS Code, car nous pouvons exécuter les modèles dbt localement pour les tester.",[39,348,350],{"id":349},"_3-entrer-le-prompt-magique","3. Entrer le prompt « magique »",[12,352,353],{},"Voici le prompt exact que nous avons utilisé pour générer tout le code dbt :",[151,355,360],{"className":356,"code":358,"language":359,"meta":156},[357],"language-text","\nCreate dbt models for all the tables in the file structure.csv.\n\nI want to have the source models created, with a filter that dedupes the data based on the primary key. Create these in a new folder reddit_ads.\nI want to have workspace models created and store these in the workspace_marketing schema.\n\nTake this MR as example: [I've referenced to previous source implementation]. Here is the same done for Source A, but now it needs to be done for Reddit Ads.\n\nPlease check the dbt style guide when creating the code: https://handbook.gitlab.com/handbook/enterprise-data/platform/dbt-guide/\n\n","text",[63,361,358],{"__ignoreMap":156},[12,363,364],{},"Les éléments essentiels suivants ont garanti l'efficacité du prompt :",[102,366,367,373,379,385],{},[59,368,369,372],{},[31,370,371],{},"Des spécifications claires"," pour les modèles sources et workspace",[59,374,375,378],{},[31,376,377],{},"Un exemple de référence"," d'une merge request similaire précédente",[59,380,381,384],{},[31,382,383],{},"Une référence au guide de style"," pour garantir la qualité et la cohérence du code",[59,386,387,390],{},[31,388,389],{},"Un ciblage spécifique du schéma"," pour une organisation correcte",[39,392,394],{"id":393},"_4-laisser-gitlab-duo-travailler","4. Laisser GitLab Duo travailler",[12,396,397],{},"Après que nous avons soumis le prompt, GitLab Duo s'est mis au travail. Le processus de génération complet a pris quelques minutes, durant lesquelles GitLab Duo a :",[56,399,400,406,412,418,424,430,435],{},[59,401,402,405],{},[31,403,404],{},"Lu et analysé"," le fichier CSV d'intrant.",[59,407,408,411],{},[31,409,410],{},"Examiné les structures des tables"," à partir des métadonnées.",[59,413,414,417],{},[31,415,416],{},"Référencé notre guide de style dbt"," pour les normes de codage.",[59,419,420,423],{},[31,421,422],{},"Pris en compte la merge request similaire"," pour proposer une structure correcte.",[59,425,426,429],{},[31,427,428],{},"Généré les modèles sources"," pour les 13 tables.",[59,431,432,429],{},[31,433,434],{},"Créé les modèles workspace",[59,436,437,440,441],{},[31,438,439],{},"Généré les fichiers dbt complémentaires"," :",[102,442,443,449,456],{},[59,444,445,446],{},"Configuration ",[63,447,448],{},"sources.yml",[59,450,451,452,455],{},"Fichiers ",[63,453,454],{},"schema.yml"," avec tests et documentation",[59,457,458,459,462],{},"Mise à jour de ",[63,460,461],{},"dbt_project.yml"," avec les références de schéma",[39,464,466],{"id":465},"les-résultats","Les résultats",[12,468,469],{},"Les résultats sont remarquables :",[102,471,472,478,496,502,508,514,520],{},[59,473,474,477],{},[31,475,476],{},"1 fichier modifié :"," dbt_project.yml (ajout de la configuration du schéma reddit_ads)",[59,479,480,483],{},[31,481,482],{},"29 nouveaux fichiers :",[102,484,485,491],{},[59,486,487,490],{},[31,488,489],{},"26 modèles dbt"," (13 sources + 13 workspaces)",[59,492,493],{},[31,494,495],{},"3 fichiers YAML",[59,497,498,501],{},[31,499,500],{},"Près de 900 lignes de code"," générées automatiquement",[59,503,504,507],{},[31,505,506],{},"Tests de données intégrés,"," avec des contraintes uniques sur les colonnes de clé primaire",[59,509,510,513],{},[31,511,512],{},"Descriptions génériques"," pour tous les modèles et colonnes",[59,515,516,519],{},[31,517,518],{},"Logique de déduplication appropriée"," dans les modèles sources",[59,521,522,525],{},[31,523,524],{},"Structure de code propre et cohérente"," conformément au guide de style GitLab dbt",[151,527,530],{"className":528,"code":529,"language":359,"meta":156},[357],"\ntransform/snowflake-dbt/\n├── dbt_project.yml                                                    [MODIFIED]\n└── models/\n    ├── sources/\n    │   └── reddit_ads/\n    │       ├── reddit_ads_ad_group_source.sql                        [NEW]\n    │       ├── reddit_ads_ad_source.sql                              [NEW]\n    │       ├── reddit_ads_business_account_source.sql                [NEW]\n    │       ├── reddit_ads_campaign_source.sql                        [NEW]\n    │       ├── reddit_ads_custom_audience_history_source.sql         [NEW]\n    │       ├── reddit_ads_geolocation_source.sql                     [NEW]\n    │       ├── reddit_ads_interest_source.sql                        [NEW]\n    │       ├── reddit_ads_targeting_community_source.sql             [NEW]\n    │       ├── reddit_ads_targeting_custom_audience_source.sql       [NEW]\n    │       ├── reddit_ads_targeting_device_source.sql                [NEW]\n    │       ├── reddit_ads_targeting_geolocation_source.sql           [NEW]\n    │       ├── reddit_ads_targeting_interest_source.sql              [NEW]\n    │       ├── reddit_ads_time_zone_source.sql                       [NEW]\n    │       ├── schema.yml                                            [NEW]\n    │       └── sources.yml                                           [NEW]\n    └── workspaces/\n        └── workspace_marketing/\n            └── reddit_ads/\n                ├── schema.yml                                        [NEW]\n                ├── wk_reddit_ads_ad.sql                              [NEW]\n                ├── wk_reddit_ads_ad_group.sql                        [NEW]\n                ├── wk_reddit_ads_business_account.sql                [NEW]\n                ├── wk_reddit_ads_campaign.sql                        [NEW]\n                ├── wk_reddit_ads_custom_audience_history.sql         [NEW]\n                ├── wk_reddit_ads_geolocation.sql                     [NEW]\n                ├── wk_reddit_ads_interest.sql                        [NEW]\n                ├── wk_reddit_ads_targeting_community.sql             [NEW]\n                ├── wk_reddit_ads_targeting_custom_audience.sql       [NEW]\n                ├── wk_reddit_ads_targeting_device.sql                [NEW]\n                ├── wk_reddit_ads_targeting_geolocation.sql           [NEW]\n                ├── wk_reddit_ads_targeting_interest.sql              [NEW]\n                └── wk_reddit_ads_time_zone.sql                       [NEW]\n\n",[63,531,529],{"__ignoreMap":156},[533,534,536],"h3",{"id":535},"exemple-de-code-généré","Exemple de code généré",[12,538,539,540,543],{},"Voici un exemple de la qualité du code généré. Pour la table ",[63,541,542],{},"time_zone",", GitLab Duo a créé :",[12,545,546],{},[31,547,548,549],{},"Un modèle source de la couche ",[63,550,71],{},[151,552,554],{"className":153,"code":553,"language":155,"meta":156,"style":156},"\nWITH source AS (\n  SELECT *\n  FROM {{ source('reddit_ads','time_zone') }}\n  QUALIFY ROW_NUMBER() OVER (PARTITION BY id ORDER BY _fivetran_synced DESC) = 1\n),\n\nrenamed AS (\n  SELECT\n    id::VARCHAR                               AS time_zone_id,\n    code::VARCHAR                             AS time_zone_code,\n    dst_offset::NUMBER                        AS time_zone_dst_offset,\n    is_dst_active::BOOLEAN                    AS is_time_zone_dst_active,\n    name::VARCHAR                             AS time_zone_name,\n    offset::NUMBER                            AS time_zone_offset,\n    _fivetran_synced::TIMESTAMP               AS fivetran_synced_at\n  FROM source\n)\n\nSELECT * FROM renamed\n\n",[63,555,556,560,574,582,602,644,649,653,662,667,681,694,708,722,738,752,767,775,781,786],{"__ignoreMap":156},[160,557,558],{"class":162,"line":163},[160,559,167],{"emptyLinePlaceholder":166},[160,561,562,565,568,571],{"class":162,"line":170},[160,563,564],{"class":173},"WITH",[160,566,567],{"class":180}," source ",[160,569,570],{"class":173},"AS",[160,572,573],{"class":180}," (\n",[160,575,576,579],{"class":162,"line":177},[160,577,578],{"class":173},"  SELECT",[160,580,581],{"class":173}," *\n",[160,583,584,587,590,593,596,599],{"class":162,"line":184},[160,585,586],{"class":173},"  FROM",[160,588,589],{"class":180}," {{ source(",[160,591,592],{"class":220},"'reddit_ads'",[160,594,595],{"class":180},",",[160,597,598],{"class":220},"'time_zone'",[160,600,601],{"class":180},") }}\n",[160,603,604,607,610,613,616,619,622,625,628,630,633,636,639,641],{"class":162,"line":190},[160,605,606],{"class":180},"  QUALIFY ",[160,608,609],{"class":257},"ROW_NUMBER",[160,611,612],{"class":180},"() ",[160,614,615],{"class":173},"OVER",[160,617,618],{"class":180}," (",[160,620,621],{"class":173},"PARTITION",[160,623,624],{"class":173}," BY",[160,626,627],{"class":180}," id ",[160,629,286],{"class":173},[160,631,632],{"class":180}," _fivetran_synced ",[160,634,635],{"class":173},"DESC",[160,637,638],{"class":180},") ",[160,640,217],{"class":173},[160,642,643],{"class":257}," 1\n",[160,645,646],{"class":162,"line":196},[160,647,648],{"class":180},"),\n",[160,650,651],{"class":162,"line":202},[160,652,167],{"emptyLinePlaceholder":166},[160,654,655,658,660],{"class":162,"line":208},[160,656,657],{"class":180},"renamed ",[160,659,570],{"class":173},[160,661,573],{"class":180},[160,663,664],{"class":162,"line":230},[160,665,666],{"class":173},"  SELECT\n",[160,668,669,672,675,678],{"class":162,"line":239},[160,670,671],{"class":180},"    id::",[160,673,674],{"class":173},"VARCHAR",[160,676,677],{"class":173},"                               AS",[160,679,680],{"class":180}," time_zone_id,\n",[160,682,683,686,688,691],{"class":162,"line":251},[160,684,685],{"class":180},"    code::",[160,687,674],{"class":173},[160,689,690],{"class":173},"                             AS",[160,692,693],{"class":180}," time_zone_code,\n",[160,695,696,699,702,705],{"class":162,"line":269},[160,697,698],{"class":180},"    dst_offset::",[160,700,701],{"class":173},"NUMBER",[160,703,704],{"class":173},"                        AS",[160,706,707],{"class":180}," time_zone_dst_offset,\n",[160,709,710,713,716,719],{"class":162,"line":283},[160,711,712],{"class":180},"    is_dst_active::",[160,714,715],{"class":173},"BOOLEAN",[160,717,718],{"class":173},"                    AS",[160,720,721],{"class":180}," is_time_zone_dst_active,\n",[160,723,725,728,731,733,735],{"class":162,"line":724},14,[160,726,727],{"class":173},"    name",[160,729,730],{"class":180},"::",[160,732,674],{"class":173},[160,734,690],{"class":173},[160,736,737],{"class":180}," time_zone_name,\n",[160,739,741,744,746,749],{"class":162,"line":740},15,[160,742,743],{"class":180},"    offset::",[160,745,701],{"class":173},[160,747,748],{"class":173},"                            AS",[160,750,751],{"class":180}," time_zone_offset,\n",[160,753,755,758,761,764],{"class":162,"line":754},16,[160,756,757],{"class":180},"    _fivetran_synced::",[160,759,760],{"class":173},"TIMESTAMP",[160,762,763],{"class":173},"               AS",[160,765,766],{"class":180}," fivetran_synced_at\n",[160,768,770,772],{"class":162,"line":769},17,[160,771,586],{"class":173},[160,773,774],{"class":180}," source\n",[160,776,778],{"class":162,"line":777},18,[160,779,780],{"class":180},")\n",[160,782,784],{"class":162,"line":783},19,[160,785,167],{"emptyLinePlaceholder":166},[160,787,789,792,795,798],{"class":162,"line":788},20,[160,790,791],{"class":173},"SELECT",[160,793,794],{"class":173}," *",[160,796,797],{"class":173}," FROM",[160,799,800],{"class":180}," renamed\n",[12,802,803],{},[31,804,805],{},"Schema.yml",[151,807,811],{"className":808,"code":809,"language":810,"meta":156,"style":156},"language-yaml shiki shiki-themes github-light","\nmodels:\n  - name: reddit_ads_time_zone_source\n    description: Time zone data from Reddit Ads system\n    columns:\n      - name: time_zone_id\n        description: Unique identifier for time zone records\n        data_tests:\n          - unique\n          - not_null\n      - name: time_zone_code\n        description: Code for the time zone\n      - name: time_zone_dst_offset\n        description: Daylight saving time offset for the time zone\n      - name: is_time_zone_dst_active\n        description: Flag indicating if daylight saving time is active\n      - name: time_zone_name\n        description: Name of the time zone\n      - name: time_zone_offset\n        description: Offset for the time zone\n      - name: fivetran_synced_at\n        description: Timestamp when the record was last synced by Fivetran\n\n","yaml",[63,812,813,817,826,840,850,857,869,879,886,894,901,912,921,932,941,952,961,972,981,992,1001,1013],{"__ignoreMap":156},[160,814,815],{"class":162,"line":163},[160,816,167],{"emptyLinePlaceholder":166},[160,818,819,823],{"class":162,"line":170},[160,820,822],{"class":821},"shJU0","models",[160,824,825],{"class":180},":\n",[160,827,828,831,834,837],{"class":162,"line":177},[160,829,830],{"class":180},"  - ",[160,832,833],{"class":821},"name",[160,835,836],{"class":180},": ",[160,838,839],{"class":220},"reddit_ads_time_zone_source\n",[160,841,842,845,847],{"class":162,"line":184},[160,843,844],{"class":821},"    description",[160,846,836],{"class":180},[160,848,849],{"class":220},"Time zone data from Reddit Ads system\n",[160,851,852,855],{"class":162,"line":190},[160,853,854],{"class":821},"    columns",[160,856,825],{"class":180},[160,858,859,862,864,866],{"class":162,"line":196},[160,860,861],{"class":180},"      - ",[160,863,833],{"class":821},[160,865,836],{"class":180},[160,867,868],{"class":220},"time_zone_id\n",[160,870,871,874,876],{"class":162,"line":202},[160,872,873],{"class":821},"        description",[160,875,836],{"class":180},[160,877,878],{"class":220},"Unique identifier for time zone records\n",[160,880,881,884],{"class":162,"line":208},[160,882,883],{"class":821},"        data_tests",[160,885,825],{"class":180},[160,887,888,891],{"class":162,"line":230},[160,889,890],{"class":180},"          - ",[160,892,893],{"class":220},"unique\n",[160,895,896,898],{"class":162,"line":239},[160,897,890],{"class":180},[160,899,900],{"class":220},"not_null\n",[160,902,903,905,907,909],{"class":162,"line":251},[160,904,861],{"class":180},[160,906,833],{"class":821},[160,908,836],{"class":180},[160,910,911],{"class":220},"time_zone_code\n",[160,913,914,916,918],{"class":162,"line":269},[160,915,873],{"class":821},[160,917,836],{"class":180},[160,919,920],{"class":220},"Code for the time zone\n",[160,922,923,925,927,929],{"class":162,"line":283},[160,924,861],{"class":180},[160,926,833],{"class":821},[160,928,836],{"class":180},[160,930,931],{"class":220},"time_zone_dst_offset\n",[160,933,934,936,938],{"class":162,"line":724},[160,935,873],{"class":821},[160,937,836],{"class":180},[160,939,940],{"class":220},"Daylight saving time offset for the time zone\n",[160,942,943,945,947,949],{"class":162,"line":740},[160,944,861],{"class":180},[160,946,833],{"class":821},[160,948,836],{"class":180},[160,950,951],{"class":220},"is_time_zone_dst_active\n",[160,953,954,956,958],{"class":162,"line":754},[160,955,873],{"class":821},[160,957,836],{"class":180},[160,959,960],{"class":220},"Flag indicating if daylight saving time is active\n",[160,962,963,965,967,969],{"class":162,"line":769},[160,964,861],{"class":180},[160,966,833],{"class":821},[160,968,836],{"class":180},[160,970,971],{"class":220},"time_zone_name\n",[160,973,974,976,978],{"class":162,"line":777},[160,975,873],{"class":821},[160,977,836],{"class":180},[160,979,980],{"class":220},"Name of the time zone\n",[160,982,983,985,987,989],{"class":162,"line":783},[160,984,861],{"class":180},[160,986,833],{"class":821},[160,988,836],{"class":180},[160,990,991],{"class":220},"time_zone_offset\n",[160,993,994,996,998],{"class":162,"line":788},[160,995,873],{"class":821},[160,997,836],{"class":180},[160,999,1000],{"class":220},"Offset for the time zone\n",[160,1002,1004,1006,1008,1010],{"class":162,"line":1003},21,[160,1005,861],{"class":180},[160,1007,833],{"class":821},[160,1009,836],{"class":180},[160,1011,1012],{"class":220},"fivetran_synced_at\n",[160,1014,1016,1018,1020],{"class":162,"line":1015},22,[160,1017,873],{"class":821},[160,1019,836],{"class":180},[160,1021,1022],{"class":220},"Timestamp when the record was last synced by Fivetran\n",[12,1024,1025],{},[31,1026,1027],{},"Source.yml",[151,1029,1031],{"className":808,"code":1030,"language":810,"meta":156,"style":156},"\nsources:\n  - name: reddit_ads\n    database: RAW\n    schema: reddit_ads\n    loaded_at_field: _fivetran_synced\n    loader: fivetran\n    description: Reddit Ads data\n\n    quoting:\n      database: true\n      schema: false\n      identifier: false\n\n    tables:\n      - name: time_zone\n\n",[63,1032,1033,1037,1044,1055,1065,1074,1084,1094,1103,1107,1114,1124,1134,1143,1147,1154],{"__ignoreMap":156},[160,1034,1035],{"class":162,"line":163},[160,1036,167],{"emptyLinePlaceholder":166},[160,1038,1039,1042],{"class":162,"line":170},[160,1040,1041],{"class":821},"sources",[160,1043,825],{"class":180},[160,1045,1046,1048,1050,1052],{"class":162,"line":177},[160,1047,830],{"class":180},[160,1049,833],{"class":821},[160,1051,836],{"class":180},[160,1053,1054],{"class":220},"reddit_ads\n",[160,1056,1057,1060,1062],{"class":162,"line":184},[160,1058,1059],{"class":821},"    database",[160,1061,836],{"class":180},[160,1063,1064],{"class":220},"RAW\n",[160,1066,1067,1070,1072],{"class":162,"line":190},[160,1068,1069],{"class":821},"    schema",[160,1071,836],{"class":180},[160,1073,1054],{"class":220},[160,1075,1076,1079,1081],{"class":162,"line":196},[160,1077,1078],{"class":821},"    loaded_at_field",[160,1080,836],{"class":180},[160,1082,1083],{"class":220},"_fivetran_synced\n",[160,1085,1086,1089,1091],{"class":162,"line":202},[160,1087,1088],{"class":821},"    loader",[160,1090,836],{"class":180},[160,1092,1093],{"class":220},"fivetran\n",[160,1095,1096,1098,1100],{"class":162,"line":208},[160,1097,844],{"class":821},[160,1099,836],{"class":180},[160,1101,1102],{"class":220},"Reddit Ads data\n",[160,1104,1105],{"class":162,"line":230},[160,1106,167],{"emptyLinePlaceholder":166},[160,1108,1109,1112],{"class":162,"line":239},[160,1110,1111],{"class":821},"    quoting",[160,1113,825],{"class":180},[160,1115,1116,1119,1121],{"class":162,"line":251},[160,1117,1118],{"class":821},"      database",[160,1120,836],{"class":180},[160,1122,1123],{"class":257},"true\n",[160,1125,1126,1129,1131],{"class":162,"line":269},[160,1127,1128],{"class":821},"      schema",[160,1130,836],{"class":180},[160,1132,1133],{"class":257},"false\n",[160,1135,1136,1139,1141],{"class":162,"line":283},[160,1137,1138],{"class":821},"      identifier",[160,1140,836],{"class":180},[160,1142,1133],{"class":257},[160,1144,1145],{"class":162,"line":724},[160,1146,167],{"emptyLinePlaceholder":166},[160,1148,1149,1152],{"class":162,"line":740},[160,1150,1151],{"class":821},"    tables",[160,1153,825],{"class":180},[160,1155,1156,1158,1160,1162],{"class":162,"line":754},[160,1157,861],{"class":180},[160,1159,833],{"class":821},[160,1161,836],{"class":180},[160,1163,1164],{"class":220},"time_zone\n",[12,1166,1167],{},[31,1168,1169],{},"Modèle workspace",[151,1171,1173],{"className":153,"code":1172,"language":155,"meta":156,"style":156},"\nWITH source AS (\n  SELECT *\n  FROM {{ ref('reddit_ads_time_zone_source') }}\n)\n\nSELECT * FROM source\n\n",[63,1174,1175,1179,1189,1195,1207,1211,1215],{"__ignoreMap":156},[160,1176,1177],{"class":162,"line":163},[160,1178,167],{"emptyLinePlaceholder":166},[160,1180,1181,1183,1185,1187],{"class":162,"line":170},[160,1182,564],{"class":173},[160,1184,567],{"class":180},[160,1186,570],{"class":173},[160,1188,573],{"class":180},[160,1190,1191,1193],{"class":162,"line":177},[160,1192,578],{"class":173},[160,1194,581],{"class":173},[160,1196,1197,1199,1202,1205],{"class":162,"line":184},[160,1198,586],{"class":173},[160,1200,1201],{"class":180}," {{ ref(",[160,1203,1204],{"class":220},"'reddit_ads_time_zone_source'",[160,1206,601],{"class":180},[160,1208,1209],{"class":162,"line":190},[160,1210,780],{"class":180},[160,1212,1213],{"class":162,"line":196},[160,1214,167],{"emptyLinePlaceholder":166},[160,1216,1217,1219,1221,1223],{"class":162,"line":202},[160,1218,791],{"class":173},[160,1220,794],{"class":173},[160,1222,797],{"class":173},[160,1224,774],{"class":180},[39,1226,1228],{"id":1227},"_5-valider-la-qualité","5. Valider la qualité",[12,1230,1231,1232,1237],{},"Une fois que le code semblait correct, nous avons effectué un push vers la merge request et exécuté le ",[19,1233,1236],{"href":1234,"rel":1235},"https://handbook.gitlab.com/handbook/enterprise-data/platform/ci-jobs/#build_changes",[],"pipeline de test CI"," pour tester le code et valider les résultats. Nous avons demandé à GitLab Duo de créer une requête de validation :",[151,1239,1242],{"className":1240,"code":1241,"language":359,"meta":156},[357],"\nCreate a test query to test the row counts between the raw layer and the workspace layer. Keep in mind that we do deduplication, so we can compare both using distinct on the primary keys.\n\n",[63,1243,1241],{"__ignoreMap":156},[12,1245,1246],{},"L'IA a généré une requête de validation complète qui :",[102,1248,1249,1255,1258,1261],{},[59,1250,1251,1252,1254],{},"Compare le nombre de lignes entre les couches ",[63,1253,65],{}," et workspace.",[59,1256,1257],{},"Prend en compte la logique de déduplication.",[59,1259,1260],{},"Teste les 13 tables.",[59,1262,1263],{},"Calcule les pourcentages de rétention de données.",[1265,1266,1267,1271],"details",{},[1268,1269,1270],"summary",{},"Requête SQL de test générée",[151,1272,1274],{"className":153,"code":1273,"language":155,"meta":156,"style":156},"\n-- Reddit Ads Row Count Validation Test\n-- Compares distinct counts between RAW layer and WORKSPACE_MARKETING layer\n-- Accounts for deduplication logic in source models\n\nWITH raw_counts AS (\n  -- Single primary key tables\n  SELECT 'ad' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.AD\n\n  UNION ALL\n\n  SELECT 'business_account' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.BUSINESS_ACCOUNT\n\n  UNION ALL\n\n  SELECT 'campaign' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.CAMPAIGN\n\n  UNION ALL\n\n  SELECT 'custom_audience_history' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.CUSTOM_AUDIENCE_HISTORY\n\n  UNION ALL\n\n  SELECT 'geolocation' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.GEOLOCATION\n\n  UNION ALL\n\n  SELECT 'interest' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.INTEREST\n\n  UNION ALL\n\n  SELECT 'time_zone' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.TIME_ZONE\n\n  -- Composite primary key tables\n  UNION ALL\n\n  SELECT 'ad_group' AS table_name, COUNT(DISTINCT CONCAT(account_id, '|', id)) AS raw_count\n  FROM RAW.REDDIT_ADS.AD_GROUP\n\n  UNION ALL\n\n  SELECT 'targeting_community' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', community_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_COMMUNITY\n\n  UNION ALL\n\n  SELECT 'targeting_custom_audience' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', custom_audience_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_CUSTOM_AUDIENCE\n\n  UNION ALL\n\n  SELECT 'targeting_device' AS table_name, COUNT(DISTINCT _fivetran_id) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_DEVICE\n\n  UNION ALL\n\n  SELECT 'targeting_geolocation' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', geolocation_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_GEOLOCATION\n\n  UNION ALL\n\n  SELECT 'targeting_interest' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', interest_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_INTEREST\n),\n\nworkspace_counts AS (\n  -- Workspace layer counts using primary keys from schema.yml\n  SELECT 'ad' AS table_name, COUNT(DISTINCT ad_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_AD\n\n  UNION ALL\n\n  SELECT 'business_account' AS table_name, COUNT(DISTINCT business_account_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_BUSINESS_ACCOUNT\n\n  UNION ALL\n\n  SELECT 'campaign' AS table_name, COUNT(DISTINCT campaign_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_CAMPAIGN\n\n  UNION ALL\n\n  SELECT 'custom_audience_history' AS table_name, COUNT(DISTINCT custom_audience_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_CUSTOM_AUDIENCE_HISTORY\n\n  UNION ALL\n\n  SELECT 'geolocation' AS table_name, COUNT(DISTINCT geolocation_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_GEOLOCATION\n\n  UNION ALL\n\n  SELECT 'interest' AS table_name, COUNT(DISTINCT interest_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_INTEREST\n\n  UNION ALL\n\n  SELECT 'time_zone' AS table_name, COUNT(DISTINCT time_zone_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TIME_ZONE\n\n  -- Composite primary key tables\n  UNION ALL\n\n  SELECT 'ad_group' AS table_name, COUNT(DISTINCT CONCAT(ad_group_account_id, '|', ad_group_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_AD_GROUP\n\n  UNION ALL\n\n  SELECT 'targeting_community' AS table_name, COUNT(DISTINCT CONCAT(targeting_community_ad_group_id, '|', targeting_community_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_COMMUNITY\n\n  UNION ALL\n\n  SELECT 'targeting_custom_audience' AS table_name, COUNT(DISTINCT CONCAT(targeting_custom_audience_ad_group_id, '|', targeting_custom_audience_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_CUSTOM_AUDIENCE\n\n  UNION ALL\n\n  SELECT 'targeting_device' AS table_name, COUNT(DISTINCT targeting_device_fivetran_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_DEVICE\n\n  UNION ALL\n\n  SELECT 'targeting_geolocation' AS table_name, COUNT(DISTINCT CONCAT(targeting_geolocation_ad_group_id, '|', targeting_geolocation_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_GEOLOCATION\n\n  UNION ALL\n\n  SELECT 'targeting_interest' AS table_name, COUNT(DISTINCT CONCAT(targeting_interest_ad_group_id, '|', targeting_interest_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_INTEREST\n)\n\n-- Final comparison with validation results\nSELECT\n  r.table_name,\n  r.raw_count,\n  w.workspace_count,\n  r.raw_count - w.workspace_count AS count_difference,\n  CASE\n    WHEN r.raw_count = w.workspace_count THEN '✅ PASS'\n    WHEN r.raw_count > w.workspace_count THEN '⚠️ RAW > WORKSPACE (Expected due to deduplication)'\n    ELSE '❌ FAIL - WORKSPACE > RAW (Unexpected)'\n  END AS validation_status,\n  ROUND((w.workspace_count::FLOAT / r.raw_count::FLOAT) * 100, 2) AS data_retention_percentage\nFROM raw_counts r\nJOIN workspace_counts w ON r.table_name = w.table_name\nORDER BY r.table_name;\n\n",[63,1275,1276,1280,1286,1291,1296,1300,1311,1316,1346,1361,1365,1370,1374,1397,1410,1414,1418,1422,1445,1458,1462,1466,1470,1494,1508,1513,1518,1523,1547,1561,1566,1571,1576,1600,1614,1619,1624,1629,1653,1667,1672,1678,1683,1688,1722,1736,1741,1746,1751,1783,1797,1802,1807,1812,1843,1857,1862,1867,1872,1897,1911,1916,1921,1926,1957,1971,1976,1981,1986,2017,2031,2036,2041,2051,2057,2082,2098,2103,2108,2113,2137,2151,2156,2161,2166,2190,2204,2209,2214,2219,2243,2257,2262,2267,2272,2296,2310,2315,2320,2325,2349,2363,2368,2373,2378,2402,2416,2421,2426,2431,2436,2467,2481,2486,2491,2496,2527,2541,2546,2551,2556,2587,2601,2606,2611,2616,2640,2654,2659,2664,2669,2700,2714,2719,2724,2729,2760,2774,2779,2784,2790,2795,2809,2821,2834,2858,2864,2891,2916,2925,2936,2991,2999,3026],{"__ignoreMap":156},[160,1277,1278],{"class":162,"line":163},[160,1279,167],{"emptyLinePlaceholder":166},[160,1281,1282],{"class":162,"line":170},[160,1283,1285],{"class":1284},"sAwPA","-- Reddit Ads Row Count Validation Test\n",[160,1287,1288],{"class":162,"line":177},[160,1289,1290],{"class":1284},"-- Compares distinct counts between RAW layer and WORKSPACE_MARKETING layer\n",[160,1292,1293],{"class":162,"line":184},[160,1294,1295],{"class":1284},"-- Accounts for deduplication logic in source models\n",[160,1297,1298],{"class":162,"line":190},[160,1299,167],{"emptyLinePlaceholder":166},[160,1301,1302,1304,1307,1309],{"class":162,"line":196},[160,1303,564],{"class":173},[160,1305,1306],{"class":180}," raw_counts ",[160,1308,570],{"class":173},[160,1310,573],{"class":180},[160,1312,1313],{"class":162,"line":202},[160,1314,1315],{"class":1284},"  -- Single primary key tables\n",[160,1317,1318,1320,1323,1326,1329,1332,1335,1338,1341,1343],{"class":162,"line":208},[160,1319,578],{"class":173},[160,1321,1322],{"class":220}," 'ad'",[160,1324,1325],{"class":173}," AS",[160,1327,1328],{"class":180}," table_name, ",[160,1330,1331],{"class":257},"COUNT",[160,1333,1334],{"class":180},"(",[160,1336,1337],{"class":173},"DISTINCT",[160,1339,1340],{"class":180}," id) ",[160,1342,570],{"class":173},[160,1344,1345],{"class":180}," raw_count\n",[160,1347,1348,1350,1353,1355,1358],{"class":162,"line":230},[160,1349,586],{"class":173},[160,1351,1352],{"class":257}," RAW",[160,1354,97],{"class":180},[160,1356,1357],{"class":257},"REDDIT_ADS",[160,1359,1360],{"class":180},".AD\n",[160,1362,1363],{"class":162,"line":239},[160,1364,167],{"emptyLinePlaceholder":166},[160,1366,1367],{"class":162,"line":251},[160,1368,1369],{"class":173},"  UNION ALL\n",[160,1371,1372],{"class":162,"line":269},[160,1373,167],{"emptyLinePlaceholder":166},[160,1375,1376,1378,1381,1383,1385,1387,1389,1391,1393,1395],{"class":162,"line":283},[160,1377,578],{"class":173},[160,1379,1380],{"class":220}," 'business_account'",[160,1382,1325],{"class":173},[160,1384,1328],{"class":180},[160,1386,1331],{"class":257},[160,1388,1334],{"class":180},[160,1390,1337],{"class":173},[160,1392,1340],{"class":180},[160,1394,570],{"class":173},[160,1396,1345],{"class":180},[160,1398,1399,1401,1403,1405,1407],{"class":162,"line":724},[160,1400,586],{"class":173},[160,1402,1352],{"class":257},[160,1404,97],{"class":180},[160,1406,1357],{"class":257},[160,1408,1409],{"class":180},".BUSINESS_ACCOUNT\n",[160,1411,1412],{"class":162,"line":740},[160,1413,167],{"emptyLinePlaceholder":166},[160,1415,1416],{"class":162,"line":754},[160,1417,1369],{"class":173},[160,1419,1420],{"class":162,"line":769},[160,1421,167],{"emptyLinePlaceholder":166},[160,1423,1424,1426,1429,1431,1433,1435,1437,1439,1441,1443],{"class":162,"line":777},[160,1425,578],{"class":173},[160,1427,1428],{"class":220}," 'campaign'",[160,1430,1325],{"class":173},[160,1432,1328],{"class":180},[160,1434,1331],{"class":257},[160,1436,1334],{"class":180},[160,1438,1337],{"class":173},[160,1440,1340],{"class":180},[160,1442,570],{"class":173},[160,1444,1345],{"class":180},[160,1446,1447,1449,1451,1453,1455],{"class":162,"line":783},[160,1448,586],{"class":173},[160,1450,1352],{"class":257},[160,1452,97],{"class":180},[160,1454,1357],{"class":257},[160,1456,1457],{"class":180},".CAMPAIGN\n",[160,1459,1460],{"class":162,"line":788},[160,1461,167],{"emptyLinePlaceholder":166},[160,1463,1464],{"class":162,"line":1003},[160,1465,1369],{"class":173},[160,1467,1468],{"class":162,"line":1015},[160,1469,167],{"emptyLinePlaceholder":166},[160,1471,1473,1475,1478,1480,1482,1484,1486,1488,1490,1492],{"class":162,"line":1472},23,[160,1474,578],{"class":173},[160,1476,1477],{"class":220}," 'custom_audience_history'",[160,1479,1325],{"class":173},[160,1481,1328],{"class":180},[160,1483,1331],{"class":257},[160,1485,1334],{"class":180},[160,1487,1337],{"class":173},[160,1489,1340],{"class":180},[160,1491,570],{"class":173},[160,1493,1345],{"class":180},[160,1495,1497,1499,1501,1503,1505],{"class":162,"line":1496},24,[160,1498,586],{"class":173},[160,1500,1352],{"class":257},[160,1502,97],{"class":180},[160,1504,1357],{"class":257},[160,1506,1507],{"class":180},".CUSTOM_AUDIENCE_HISTORY\n",[160,1509,1511],{"class":162,"line":1510},25,[160,1512,167],{"emptyLinePlaceholder":166},[160,1514,1516],{"class":162,"line":1515},26,[160,1517,1369],{"class":173},[160,1519,1521],{"class":162,"line":1520},27,[160,1522,167],{"emptyLinePlaceholder":166},[160,1524,1526,1528,1531,1533,1535,1537,1539,1541,1543,1545],{"class":162,"line":1525},28,[160,1527,578],{"class":173},[160,1529,1530],{"class":220}," 'geolocation'",[160,1532,1325],{"class":173},[160,1534,1328],{"class":180},[160,1536,1331],{"class":257},[160,1538,1334],{"class":180},[160,1540,1337],{"class":173},[160,1542,1340],{"class":180},[160,1544,570],{"class":173},[160,1546,1345],{"class":180},[160,1548,1550,1552,1554,1556,1558],{"class":162,"line":1549},29,[160,1551,586],{"class":173},[160,1553,1352],{"class":257},[160,1555,97],{"class":180},[160,1557,1357],{"class":257},[160,1559,1560],{"class":180},".GEOLOCATION\n",[160,1562,1564],{"class":162,"line":1563},30,[160,1565,167],{"emptyLinePlaceholder":166},[160,1567,1569],{"class":162,"line":1568},31,[160,1570,1369],{"class":173},[160,1572,1574],{"class":162,"line":1573},32,[160,1575,167],{"emptyLinePlaceholder":166},[160,1577,1579,1581,1584,1586,1588,1590,1592,1594,1596,1598],{"class":162,"line":1578},33,[160,1580,578],{"class":173},[160,1582,1583],{"class":220}," 'interest'",[160,1585,1325],{"class":173},[160,1587,1328],{"class":180},[160,1589,1331],{"class":257},[160,1591,1334],{"class":180},[160,1593,1337],{"class":173},[160,1595,1340],{"class":180},[160,1597,570],{"class":173},[160,1599,1345],{"class":180},[160,1601,1603,1605,1607,1609,1611],{"class":162,"line":1602},34,[160,1604,586],{"class":173},[160,1606,1352],{"class":257},[160,1608,97],{"class":180},[160,1610,1357],{"class":257},[160,1612,1613],{"class":180},".INTEREST\n",[160,1615,1617],{"class":162,"line":1616},35,[160,1618,167],{"emptyLinePlaceholder":166},[160,1620,1622],{"class":162,"line":1621},36,[160,1623,1369],{"class":173},[160,1625,1627],{"class":162,"line":1626},37,[160,1628,167],{"emptyLinePlaceholder":166},[160,1630,1632,1634,1637,1639,1641,1643,1645,1647,1649,1651],{"class":162,"line":1631},38,[160,1633,578],{"class":173},[160,1635,1636],{"class":220}," 'time_zone'",[160,1638,1325],{"class":173},[160,1640,1328],{"class":180},[160,1642,1331],{"class":257},[160,1644,1334],{"class":180},[160,1646,1337],{"class":173},[160,1648,1340],{"class":180},[160,1650,570],{"class":173},[160,1652,1345],{"class":180},[160,1654,1656,1658,1660,1662,1664],{"class":162,"line":1655},39,[160,1657,586],{"class":173},[160,1659,1352],{"class":257},[160,1661,97],{"class":180},[160,1663,1357],{"class":257},[160,1665,1666],{"class":180},".TIME_ZONE\n",[160,1668,1670],{"class":162,"line":1669},40,[160,1671,167],{"emptyLinePlaceholder":166},[160,1673,1675],{"class":162,"line":1674},41,[160,1676,1677],{"class":1284},"  -- Composite primary key tables\n",[160,1679,1681],{"class":162,"line":1680},42,[160,1682,1369],{"class":173},[160,1684,1686],{"class":162,"line":1685},43,[160,1687,167],{"emptyLinePlaceholder":166},[160,1689,1691,1693,1696,1698,1700,1702,1704,1706,1709,1712,1715,1718,1720],{"class":162,"line":1690},44,[160,1692,578],{"class":173},[160,1694,1695],{"class":220}," 'ad_group'",[160,1697,1325],{"class":173},[160,1699,1328],{"class":180},[160,1701,1331],{"class":257},[160,1703,1334],{"class":180},[160,1705,1337],{"class":173},[160,1707,1708],{"class":257}," CONCAT",[160,1710,1711],{"class":180},"(account_id, ",[160,1713,1714],{"class":220},"'|'",[160,1716,1717],{"class":180},", id)) ",[160,1719,570],{"class":173},[160,1721,1345],{"class":180},[160,1723,1725,1727,1729,1731,1733],{"class":162,"line":1724},45,[160,1726,586],{"class":173},[160,1728,1352],{"class":257},[160,1730,97],{"class":180},[160,1732,1357],{"class":257},[160,1734,1735],{"class":180},".AD_GROUP\n",[160,1737,1739],{"class":162,"line":1738},46,[160,1740,167],{"emptyLinePlaceholder":166},[160,1742,1744],{"class":162,"line":1743},47,[160,1745,1369],{"class":173},[160,1747,1749],{"class":162,"line":1748},48,[160,1750,167],{"emptyLinePlaceholder":166},[160,1752,1754,1756,1759,1761,1763,1765,1767,1769,1771,1774,1776,1779,1781],{"class":162,"line":1753},49,[160,1755,578],{"class":173},[160,1757,1758],{"class":220}," 'targeting_community'",[160,1760,1325],{"class":173},[160,1762,1328],{"class":180},[160,1764,1331],{"class":257},[160,1766,1334],{"class":180},[160,1768,1337],{"class":173},[160,1770,1708],{"class":257},[160,1772,1773],{"class":180},"(ad_group_id, ",[160,1775,1714],{"class":220},[160,1777,1778],{"class":180},", community_id)) ",[160,1780,570],{"class":173},[160,1782,1345],{"class":180},[160,1784,1786,1788,1790,1792,1794],{"class":162,"line":1785},50,[160,1787,586],{"class":173},[160,1789,1352],{"class":257},[160,1791,97],{"class":180},[160,1793,1357],{"class":257},[160,1795,1796],{"class":180},".TARGETING_COMMUNITY\n",[160,1798,1800],{"class":162,"line":1799},51,[160,1801,167],{"emptyLinePlaceholder":166},[160,1803,1805],{"class":162,"line":1804},52,[160,1806,1369],{"class":173},[160,1808,1810],{"class":162,"line":1809},53,[160,1811,167],{"emptyLinePlaceholder":166},[160,1813,1815,1817,1820,1822,1824,1826,1828,1830,1832,1834,1836,1839,1841],{"class":162,"line":1814},54,[160,1816,578],{"class":173},[160,1818,1819],{"class":220}," 'targeting_custom_audience'",[160,1821,1325],{"class":173},[160,1823,1328],{"class":180},[160,1825,1331],{"class":257},[160,1827,1334],{"class":180},[160,1829,1337],{"class":173},[160,1831,1708],{"class":257},[160,1833,1773],{"class":180},[160,1835,1714],{"class":220},[160,1837,1838],{"class":180},", custom_audience_id)) ",[160,1840,570],{"class":173},[160,1842,1345],{"class":180},[160,1844,1846,1848,1850,1852,1854],{"class":162,"line":1845},55,[160,1847,586],{"class":173},[160,1849,1352],{"class":257},[160,1851,97],{"class":180},[160,1853,1357],{"class":257},[160,1855,1856],{"class":180},".TARGETING_CUSTOM_AUDIENCE\n",[160,1858,1860],{"class":162,"line":1859},56,[160,1861,167],{"emptyLinePlaceholder":166},[160,1863,1865],{"class":162,"line":1864},57,[160,1866,1369],{"class":173},[160,1868,1870],{"class":162,"line":1869},58,[160,1871,167],{"emptyLinePlaceholder":166},[160,1873,1875,1877,1880,1882,1884,1886,1888,1890,1893,1895],{"class":162,"line":1874},59,[160,1876,578],{"class":173},[160,1878,1879],{"class":220}," 'targeting_device'",[160,1881,1325],{"class":173},[160,1883,1328],{"class":180},[160,1885,1331],{"class":257},[160,1887,1334],{"class":180},[160,1889,1337],{"class":173},[160,1891,1892],{"class":180}," _fivetran_id) ",[160,1894,570],{"class":173},[160,1896,1345],{"class":180},[160,1898,1900,1902,1904,1906,1908],{"class":162,"line":1899},60,[160,1901,586],{"class":173},[160,1903,1352],{"class":257},[160,1905,97],{"class":180},[160,1907,1357],{"class":257},[160,1909,1910],{"class":180},".TARGETING_DEVICE\n",[160,1912,1914],{"class":162,"line":1913},61,[160,1915,167],{"emptyLinePlaceholder":166},[160,1917,1919],{"class":162,"line":1918},62,[160,1920,1369],{"class":173},[160,1922,1924],{"class":162,"line":1923},63,[160,1925,167],{"emptyLinePlaceholder":166},[160,1927,1929,1931,1934,1936,1938,1940,1942,1944,1946,1948,1950,1953,1955],{"class":162,"line":1928},64,[160,1930,578],{"class":173},[160,1932,1933],{"class":220}," 'targeting_geolocation'",[160,1935,1325],{"class":173},[160,1937,1328],{"class":180},[160,1939,1331],{"class":257},[160,1941,1334],{"class":180},[160,1943,1337],{"class":173},[160,1945,1708],{"class":257},[160,1947,1773],{"class":180},[160,1949,1714],{"class":220},[160,1951,1952],{"class":180},", geolocation_id)) ",[160,1954,570],{"class":173},[160,1956,1345],{"class":180},[160,1958,1960,1962,1964,1966,1968],{"class":162,"line":1959},65,[160,1961,586],{"class":173},[160,1963,1352],{"class":257},[160,1965,97],{"class":180},[160,1967,1357],{"class":257},[160,1969,1970],{"class":180},".TARGETING_GEOLOCATION\n",[160,1972,1974],{"class":162,"line":1973},66,[160,1975,167],{"emptyLinePlaceholder":166},[160,1977,1979],{"class":162,"line":1978},67,[160,1980,1369],{"class":173},[160,1982,1984],{"class":162,"line":1983},68,[160,1985,167],{"emptyLinePlaceholder":166},[160,1987,1989,1991,1994,1996,1998,2000,2002,2004,2006,2008,2010,2013,2015],{"class":162,"line":1988},69,[160,1990,578],{"class":173},[160,1992,1993],{"class":220}," 'targeting_interest'",[160,1995,1325],{"class":173},[160,1997,1328],{"class":180},[160,1999,1331],{"class":257},[160,2001,1334],{"class":180},[160,2003,1337],{"class":173},[160,2005,1708],{"class":257},[160,2007,1773],{"class":180},[160,2009,1714],{"class":220},[160,2011,2012],{"class":180},", interest_id)) ",[160,2014,570],{"class":173},[160,2016,1345],{"class":180},[160,2018,2020,2022,2024,2026,2028],{"class":162,"line":2019},70,[160,2021,586],{"class":173},[160,2023,1352],{"class":257},[160,2025,97],{"class":180},[160,2027,1357],{"class":257},[160,2029,2030],{"class":180},".TARGETING_INTEREST\n",[160,2032,2034],{"class":162,"line":2033},71,[160,2035,648],{"class":180},[160,2037,2039],{"class":162,"line":2038},72,[160,2040,167],{"emptyLinePlaceholder":166},[160,2042,2044,2047,2049],{"class":162,"line":2043},73,[160,2045,2046],{"class":180},"workspace_counts ",[160,2048,570],{"class":173},[160,2050,573],{"class":180},[160,2052,2054],{"class":162,"line":2053},74,[160,2055,2056],{"class":1284},"  -- Workspace layer counts using primary keys from schema.yml\n",[160,2058,2060,2062,2064,2066,2068,2070,2072,2074,2077,2079],{"class":162,"line":2059},75,[160,2061,578],{"class":173},[160,2063,1322],{"class":220},[160,2065,1325],{"class":173},[160,2067,1328],{"class":180},[160,2069,1331],{"class":257},[160,2071,1334],{"class":180},[160,2073,1337],{"class":173},[160,2075,2076],{"class":180}," ad_id) ",[160,2078,570],{"class":173},[160,2080,2081],{"class":180}," workspace_count\n",[160,2083,2085,2087,2090,2092,2095],{"class":162,"line":2084},76,[160,2086,586],{"class":173},[160,2088,2089],{"class":257}," REDDIT_DBT_MODEL_GENERATION_PROD",[160,2091,97],{"class":180},[160,2093,2094],{"class":257},"WORKSPACE_MARKETING",[160,2096,2097],{"class":180},".WK_REDDIT_ADS_AD\n",[160,2099,2101],{"class":162,"line":2100},77,[160,2102,167],{"emptyLinePlaceholder":166},[160,2104,2106],{"class":162,"line":2105},78,[160,2107,1369],{"class":173},[160,2109,2111],{"class":162,"line":2110},79,[160,2112,167],{"emptyLinePlaceholder":166},[160,2114,2116,2118,2120,2122,2124,2126,2128,2130,2133,2135],{"class":162,"line":2115},80,[160,2117,578],{"class":173},[160,2119,1380],{"class":220},[160,2121,1325],{"class":173},[160,2123,1328],{"class":180},[160,2125,1331],{"class":257},[160,2127,1334],{"class":180},[160,2129,1337],{"class":173},[160,2131,2132],{"class":180}," business_account_id) ",[160,2134,570],{"class":173},[160,2136,2081],{"class":180},[160,2138,2140,2142,2144,2146,2148],{"class":162,"line":2139},81,[160,2141,586],{"class":173},[160,2143,2089],{"class":257},[160,2145,97],{"class":180},[160,2147,2094],{"class":257},[160,2149,2150],{"class":180},".WK_REDDIT_ADS_BUSINESS_ACCOUNT\n",[160,2152,2154],{"class":162,"line":2153},82,[160,2155,167],{"emptyLinePlaceholder":166},[160,2157,2159],{"class":162,"line":2158},83,[160,2160,1369],{"class":173},[160,2162,2164],{"class":162,"line":2163},84,[160,2165,167],{"emptyLinePlaceholder":166},[160,2167,2169,2171,2173,2175,2177,2179,2181,2183,2186,2188],{"class":162,"line":2168},85,[160,2170,578],{"class":173},[160,2172,1428],{"class":220},[160,2174,1325],{"class":173},[160,2176,1328],{"class":180},[160,2178,1331],{"class":257},[160,2180,1334],{"class":180},[160,2182,1337],{"class":173},[160,2184,2185],{"class":180}," campaign_id) ",[160,2187,570],{"class":173},[160,2189,2081],{"class":180},[160,2191,2193,2195,2197,2199,2201],{"class":162,"line":2192},86,[160,2194,586],{"class":173},[160,2196,2089],{"class":257},[160,2198,97],{"class":180},[160,2200,2094],{"class":257},[160,2202,2203],{"class":180},".WK_REDDIT_ADS_CAMPAIGN\n",[160,2205,2207],{"class":162,"line":2206},87,[160,2208,167],{"emptyLinePlaceholder":166},[160,2210,2212],{"class":162,"line":2211},88,[160,2213,1369],{"class":173},[160,2215,2217],{"class":162,"line":2216},89,[160,2218,167],{"emptyLinePlaceholder":166},[160,2220,2222,2224,2226,2228,2230,2232,2234,2236,2239,2241],{"class":162,"line":2221},90,[160,2223,578],{"class":173},[160,2225,1477],{"class":220},[160,2227,1325],{"class":173},[160,2229,1328],{"class":180},[160,2231,1331],{"class":257},[160,2233,1334],{"class":180},[160,2235,1337],{"class":173},[160,2237,2238],{"class":180}," custom_audience_id) ",[160,2240,570],{"class":173},[160,2242,2081],{"class":180},[160,2244,2246,2248,2250,2252,2254],{"class":162,"line":2245},91,[160,2247,586],{"class":173},[160,2249,2089],{"class":257},[160,2251,97],{"class":180},[160,2253,2094],{"class":257},[160,2255,2256],{"class":180},".WK_REDDIT_ADS_CUSTOM_AUDIENCE_HISTORY\n",[160,2258,2260],{"class":162,"line":2259},92,[160,2261,167],{"emptyLinePlaceholder":166},[160,2263,2265],{"class":162,"line":2264},93,[160,2266,1369],{"class":173},[160,2268,2270],{"class":162,"line":2269},94,[160,2271,167],{"emptyLinePlaceholder":166},[160,2273,2275,2277,2279,2281,2283,2285,2287,2289,2292,2294],{"class":162,"line":2274},95,[160,2276,578],{"class":173},[160,2278,1530],{"class":220},[160,2280,1325],{"class":173},[160,2282,1328],{"class":180},[160,2284,1331],{"class":257},[160,2286,1334],{"class":180},[160,2288,1337],{"class":173},[160,2290,2291],{"class":180}," geolocation_id) ",[160,2293,570],{"class":173},[160,2295,2081],{"class":180},[160,2297,2299,2301,2303,2305,2307],{"class":162,"line":2298},96,[160,2300,586],{"class":173},[160,2302,2089],{"class":257},[160,2304,97],{"class":180},[160,2306,2094],{"class":257},[160,2308,2309],{"class":180},".WK_REDDIT_ADS_GEOLOCATION\n",[160,2311,2313],{"class":162,"line":2312},97,[160,2314,167],{"emptyLinePlaceholder":166},[160,2316,2318],{"class":162,"line":2317},98,[160,2319,1369],{"class":173},[160,2321,2323],{"class":162,"line":2322},99,[160,2324,167],{"emptyLinePlaceholder":166},[160,2326,2328,2330,2332,2334,2336,2338,2340,2342,2345,2347],{"class":162,"line":2327},100,[160,2329,578],{"class":173},[160,2331,1583],{"class":220},[160,2333,1325],{"class":173},[160,2335,1328],{"class":180},[160,2337,1331],{"class":257},[160,2339,1334],{"class":180},[160,2341,1337],{"class":173},[160,2343,2344],{"class":180}," interest_id) ",[160,2346,570],{"class":173},[160,2348,2081],{"class":180},[160,2350,2352,2354,2356,2358,2360],{"class":162,"line":2351},101,[160,2353,586],{"class":173},[160,2355,2089],{"class":257},[160,2357,97],{"class":180},[160,2359,2094],{"class":257},[160,2361,2362],{"class":180},".WK_REDDIT_ADS_INTEREST\n",[160,2364,2366],{"class":162,"line":2365},102,[160,2367,167],{"emptyLinePlaceholder":166},[160,2369,2371],{"class":162,"line":2370},103,[160,2372,1369],{"class":173},[160,2374,2376],{"class":162,"line":2375},104,[160,2377,167],{"emptyLinePlaceholder":166},[160,2379,2381,2383,2385,2387,2389,2391,2393,2395,2398,2400],{"class":162,"line":2380},105,[160,2382,578],{"class":173},[160,2384,1636],{"class":220},[160,2386,1325],{"class":173},[160,2388,1328],{"class":180},[160,2390,1331],{"class":257},[160,2392,1334],{"class":180},[160,2394,1337],{"class":173},[160,2396,2397],{"class":180}," time_zone_id) ",[160,2399,570],{"class":173},[160,2401,2081],{"class":180},[160,2403,2405,2407,2409,2411,2413],{"class":162,"line":2404},106,[160,2406,586],{"class":173},[160,2408,2089],{"class":257},[160,2410,97],{"class":180},[160,2412,2094],{"class":257},[160,2414,2415],{"class":180},".WK_REDDIT_ADS_TIME_ZONE\n",[160,2417,2419],{"class":162,"line":2418},107,[160,2420,167],{"emptyLinePlaceholder":166},[160,2422,2424],{"class":162,"line":2423},108,[160,2425,1677],{"class":1284},[160,2427,2429],{"class":162,"line":2428},109,[160,2430,1369],{"class":173},[160,2432,2434],{"class":162,"line":2433},110,[160,2435,167],{"emptyLinePlaceholder":166},[160,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2458,2460,2463,2465],{"class":162,"line":2438},111,[160,2440,578],{"class":173},[160,2442,1695],{"class":220},[160,2444,1325],{"class":173},[160,2446,1328],{"class":180},[160,2448,1331],{"class":257},[160,2450,1334],{"class":180},[160,2452,1337],{"class":173},[160,2454,1708],{"class":257},[160,2456,2457],{"class":180},"(ad_group_account_id, ",[160,2459,1714],{"class":220},[160,2461,2462],{"class":180},", ad_group_id)) ",[160,2464,570],{"class":173},[160,2466,2081],{"class":180},[160,2468,2470,2472,2474,2476,2478],{"class":162,"line":2469},112,[160,2471,586],{"class":173},[160,2473,2089],{"class":257},[160,2475,97],{"class":180},[160,2477,2094],{"class":257},[160,2479,2480],{"class":180},".WK_REDDIT_ADS_AD_GROUP\n",[160,2482,2484],{"class":162,"line":2483},113,[160,2485,167],{"emptyLinePlaceholder":166},[160,2487,2489],{"class":162,"line":2488},114,[160,2490,1369],{"class":173},[160,2492,2494],{"class":162,"line":2493},115,[160,2495,167],{"emptyLinePlaceholder":166},[160,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2518,2520,2523,2525],{"class":162,"line":2498},116,[160,2500,578],{"class":173},[160,2502,1758],{"class":220},[160,2504,1325],{"class":173},[160,2506,1328],{"class":180},[160,2508,1331],{"class":257},[160,2510,1334],{"class":180},[160,2512,1337],{"class":173},[160,2514,1708],{"class":257},[160,2516,2517],{"class":180},"(targeting_community_ad_group_id, ",[160,2519,1714],{"class":220},[160,2521,2522],{"class":180},", targeting_community_id)) ",[160,2524,570],{"class":173},[160,2526,2081],{"class":180},[160,2528,2530,2532,2534,2536,2538],{"class":162,"line":2529},117,[160,2531,586],{"class":173},[160,2533,2089],{"class":257},[160,2535,97],{"class":180},[160,2537,2094],{"class":257},[160,2539,2540],{"class":180},".WK_REDDIT_ADS_TARGETING_COMMUNITY\n",[160,2542,2544],{"class":162,"line":2543},118,[160,2545,167],{"emptyLinePlaceholder":166},[160,2547,2549],{"class":162,"line":2548},119,[160,2550,1369],{"class":173},[160,2552,2554],{"class":162,"line":2553},120,[160,2555,167],{"emptyLinePlaceholder":166},[160,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2578,2580,2583,2585],{"class":162,"line":2558},121,[160,2560,578],{"class":173},[160,2562,1819],{"class":220},[160,2564,1325],{"class":173},[160,2566,1328],{"class":180},[160,2568,1331],{"class":257},[160,2570,1334],{"class":180},[160,2572,1337],{"class":173},[160,2574,1708],{"class":257},[160,2576,2577],{"class":180},"(targeting_custom_audience_ad_group_id, ",[160,2579,1714],{"class":220},[160,2581,2582],{"class":180},", targeting_custom_audience_id)) ",[160,2584,570],{"class":173},[160,2586,2081],{"class":180},[160,2588,2590,2592,2594,2596,2598],{"class":162,"line":2589},122,[160,2591,586],{"class":173},[160,2593,2089],{"class":257},[160,2595,97],{"class":180},[160,2597,2094],{"class":257},[160,2599,2600],{"class":180},".WK_REDDIT_ADS_TARGETING_CUSTOM_AUDIENCE\n",[160,2602,2604],{"class":162,"line":2603},123,[160,2605,167],{"emptyLinePlaceholder":166},[160,2607,2609],{"class":162,"line":2608},124,[160,2610,1369],{"class":173},[160,2612,2614],{"class":162,"line":2613},125,[160,2615,167],{"emptyLinePlaceholder":166},[160,2617,2619,2621,2623,2625,2627,2629,2631,2633,2636,2638],{"class":162,"line":2618},126,[160,2620,578],{"class":173},[160,2622,1879],{"class":220},[160,2624,1325],{"class":173},[160,2626,1328],{"class":180},[160,2628,1331],{"class":257},[160,2630,1334],{"class":180},[160,2632,1337],{"class":173},[160,2634,2635],{"class":180}," targeting_device_fivetran_id) ",[160,2637,570],{"class":173},[160,2639,2081],{"class":180},[160,2641,2643,2645,2647,2649,2651],{"class":162,"line":2642},127,[160,2644,586],{"class":173},[160,2646,2089],{"class":257},[160,2648,97],{"class":180},[160,2650,2094],{"class":257},[160,2652,2653],{"class":180},".WK_REDDIT_ADS_TARGETING_DEVICE\n",[160,2655,2657],{"class":162,"line":2656},128,[160,2658,167],{"emptyLinePlaceholder":166},[160,2660,2662],{"class":162,"line":2661},129,[160,2663,1369],{"class":173},[160,2665,2667],{"class":162,"line":2666},130,[160,2668,167],{"emptyLinePlaceholder":166},[160,2670,2672,2674,2676,2678,2680,2682,2684,2686,2688,2691,2693,2696,2698],{"class":162,"line":2671},131,[160,2673,578],{"class":173},[160,2675,1933],{"class":220},[160,2677,1325],{"class":173},[160,2679,1328],{"class":180},[160,2681,1331],{"class":257},[160,2683,1334],{"class":180},[160,2685,1337],{"class":173},[160,2687,1708],{"class":257},[160,2689,2690],{"class":180},"(targeting_geolocation_ad_group_id, ",[160,2692,1714],{"class":220},[160,2694,2695],{"class":180},", targeting_geolocation_id)) ",[160,2697,570],{"class":173},[160,2699,2081],{"class":180},[160,2701,2703,2705,2707,2709,2711],{"class":162,"line":2702},132,[160,2704,586],{"class":173},[160,2706,2089],{"class":257},[160,2708,97],{"class":180},[160,2710,2094],{"class":257},[160,2712,2713],{"class":180},".WK_REDDIT_ADS_TARGETING_GEOLOCATION\n",[160,2715,2717],{"class":162,"line":2716},133,[160,2718,167],{"emptyLinePlaceholder":166},[160,2720,2722],{"class":162,"line":2721},134,[160,2723,1369],{"class":173},[160,2725,2727],{"class":162,"line":2726},135,[160,2728,167],{"emptyLinePlaceholder":166},[160,2730,2732,2734,2736,2738,2740,2742,2744,2746,2748,2751,2753,2756,2758],{"class":162,"line":2731},136,[160,2733,578],{"class":173},[160,2735,1993],{"class":220},[160,2737,1325],{"class":173},[160,2739,1328],{"class":180},[160,2741,1331],{"class":257},[160,2743,1334],{"class":180},[160,2745,1337],{"class":173},[160,2747,1708],{"class":257},[160,2749,2750],{"class":180},"(targeting_interest_ad_group_id, ",[160,2752,1714],{"class":220},[160,2754,2755],{"class":180},", targeting_interest_id)) ",[160,2757,570],{"class":173},[160,2759,2081],{"class":180},[160,2761,2763,2765,2767,2769,2771],{"class":162,"line":2762},137,[160,2764,586],{"class":173},[160,2766,2089],{"class":257},[160,2768,97],{"class":180},[160,2770,2094],{"class":257},[160,2772,2773],{"class":180},".WK_REDDIT_ADS_TARGETING_INTEREST\n",[160,2775,2777],{"class":162,"line":2776},138,[160,2778,780],{"class":180},[160,2780,2782],{"class":162,"line":2781},139,[160,2783,167],{"emptyLinePlaceholder":166},[160,2785,2787],{"class":162,"line":2786},140,[160,2788,2789],{"class":1284},"-- Final comparison with validation results\n",[160,2791,2793],{"class":162,"line":2792},141,[160,2794,174],{"class":173},[160,2796,2798,2801,2803,2806],{"class":162,"line":2797},142,[160,2799,2800],{"class":257},"  r",[160,2802,97],{"class":180},[160,2804,2805],{"class":257},"table_name",[160,2807,2808],{"class":180},",\n",[160,2810,2812,2814,2816,2819],{"class":162,"line":2811},143,[160,2813,2800],{"class":257},[160,2815,97],{"class":180},[160,2817,2818],{"class":257},"raw_count",[160,2820,2808],{"class":180},[160,2822,2824,2827,2829,2832],{"class":162,"line":2823},144,[160,2825,2826],{"class":257},"  w",[160,2828,97],{"class":180},[160,2830,2831],{"class":257},"workspace_count",[160,2833,2808],{"class":180},[160,2835,2837,2839,2841,2843,2846,2849,2851,2853,2855],{"class":162,"line":2836},145,[160,2838,2800],{"class":257},[160,2840,97],{"class":180},[160,2842,2818],{"class":257},[160,2844,2845],{"class":173}," -",[160,2847,2848],{"class":257}," w",[160,2850,97],{"class":180},[160,2852,2831],{"class":257},[160,2854,1325],{"class":173},[160,2856,2857],{"class":180}," count_difference,\n",[160,2859,2861],{"class":162,"line":2860},146,[160,2862,2863],{"class":173},"  CASE\n",[160,2865,2867,2870,2873,2875,2877,2880,2882,2884,2886,2888],{"class":162,"line":2866},147,[160,2868,2869],{"class":173},"    WHEN",[160,2871,2872],{"class":257}," r",[160,2874,97],{"class":180},[160,2876,2818],{"class":257},[160,2878,2879],{"class":173}," =",[160,2881,2848],{"class":257},[160,2883,97],{"class":180},[160,2885,2831],{"class":257},[160,2887,224],{"class":173},[160,2889,2890],{"class":220}," '✅ PASS'\n",[160,2892,2894,2896,2898,2900,2902,2905,2907,2909,2911,2913],{"class":162,"line":2893},148,[160,2895,2869],{"class":173},[160,2897,2872],{"class":257},[160,2899,97],{"class":180},[160,2901,2818],{"class":257},[160,2903,2904],{"class":173}," >",[160,2906,2848],{"class":257},[160,2908,97],{"class":180},[160,2910,2831],{"class":257},[160,2912,224],{"class":173},[160,2914,2915],{"class":220}," '⚠️ RAW > WORKSPACE (Expected due to deduplication)'\n",[160,2917,2919,2922],{"class":162,"line":2918},149,[160,2920,2921],{"class":173},"    ELSE",[160,2923,2924],{"class":220}," '❌ FAIL - WORKSPACE > RAW (Unexpected)'\n",[160,2926,2928,2931,2933],{"class":162,"line":2927},150,[160,2929,2930],{"class":173},"  END",[160,2932,1325],{"class":173},[160,2934,2935],{"class":180}," validation_status,\n",[160,2937,2939,2942,2945,2948,2950,2952,2954,2957,2960,2962,2964,2966,2968,2970,2972,2975,2978,2981,2984,2986,2988],{"class":162,"line":2938},151,[160,2940,2941],{"class":257},"  ROUND",[160,2943,2944],{"class":180},"((",[160,2946,2947],{"class":257},"w",[160,2949,97],{"class":180},[160,2951,2831],{"class":257},[160,2953,730],{"class":180},[160,2955,2956],{"class":173},"FLOAT",[160,2958,2959],{"class":173}," /",[160,2961,2872],{"class":257},[160,2963,97],{"class":180},[160,2965,2818],{"class":257},[160,2967,730],{"class":180},[160,2969,2956],{"class":173},[160,2971,638],{"class":180},[160,2973,2974],{"class":173},"*",[160,2976,2977],{"class":257}," 100",[160,2979,2980],{"class":180},", ",[160,2982,2983],{"class":257},"2",[160,2985,638],{"class":180},[160,2987,570],{"class":173},[160,2989,2990],{"class":180}," data_retention_percentage\n",[160,2992,2994,2996],{"class":162,"line":2993},152,[160,2995,254],{"class":173},[160,2997,2998],{"class":180}," raw_counts r\n",[160,3000,3002,3005,3008,3011,3013,3015,3017,3019,3021,3023],{"class":162,"line":3001},153,[160,3003,3004],{"class":173},"JOIN",[160,3006,3007],{"class":180}," workspace_counts w ",[160,3009,3010],{"class":173},"ON",[160,3012,2872],{"class":257},[160,3014,97],{"class":180},[160,3016,2805],{"class":257},[160,3018,2879],{"class":173},[160,3020,2848],{"class":257},[160,3022,97],{"class":180},[160,3024,3025],{"class":257},"table_name\n",[160,3027,3029,3031,3033,3035,3037],{"class":162,"line":3028},154,[160,3030,286],{"class":173},[160,3032,2872],{"class":257},[160,3034,97],{"class":180},[160,3036,2805],{"class":257},[160,3038,3039],{"class":180},";\n",[12,3041,3042],{},[82,3043],{"alt":3044,"src":3045},"Tableau des résultats de la requête","https://res.cloudinary.com/about-gitlab-com/image/upload/v1758030995/guicjhzwvrz3czwjs3xo.png",[12,3047,3048],{},"L'exécution de cette requête a montré :",[102,3050,3051,3057,3063],{},[59,3052,3053,3056],{},[31,3054,3055],{},"Aucune différence"," dans le nombre de lignes après déduplication",[59,3058,3059,3062],{},[31,3060,3061],{},"100% de rétention des données"," sur toutes les tables",[59,3064,3065],{},[31,3066,3067],{},"La réussite de tous les tests",[39,3069,3071],{"id":3070},"bilan-gain-de-temps-considérable","Bilan : gain de temps considérable",[102,3073,3074,3080],{},[59,3075,3076,3079],{},[31,3077,3078],{},"Approche traditionnelle :"," 6-8 heures de codage manuel, tests et débogage",[59,3081,3082,3085],{},[31,3083,3084],{},"Approche avec GitLab Duo :"," 6-8 minutes de génération et temps de revue",[12,3087,3088],{},"L'efficacité des équipes de développement est bien meilleure (de 6-8 heures à 6-8 minutes), et la qualité du code reste élevée.",[39,3090,3092],{"id":3091},"bonnes-pratiques","Bonnes pratiques",[12,3094,3095],{},"Sur la base de cette expérience, voici nos recommandations clés :",[533,3097,3099],{"id":3098},"préparez-vos-métadonnées","Préparez vos métadonnées",[102,3101,3102,3105,3108],{},[59,3103,3104],{},"Extrayez les structures complètes des tables avec les types de données et les contraintes.",[59,3106,3107],{},"Identifiez les clés primaires et les relations en amont.",[59,3109,3110],{},"Exportez des fichiers CSV d'intrant propres et bien formatés.",[12,3112,3113,3116],{},[31,3114,3115],{},"Remarque :"," en connectant GitLab Duo via MCP à vos (méta)données, vous pourriez éviter cette étape manuelle.",[533,3118,3120],{"id":3119},"fournissez-un-contexte-clair","Fournissez un contexte clair",[102,3122,3123,3126,3129],{},[59,3124,3125],{},"Indiquez des merge requests existantes à titre d'exemple si possible.",[59,3127,3128],{},"Précisez vos normes de codage et guides de style.",[59,3130,3131],{},"Explicitez la structure des dossiers et les conventions de nommage.",[533,3133,3135],{"id":3134},"validez-minutieusement","Validez minutieusement",[102,3137,3138,3141,3144],{},[59,3139,3140],{},"Créez toujours des requêtes de validation pour l'intégrité des données.",[59,3142,3143],{},"Testez localement avant de fusionner.",[59,3145,3146,3147,3153],{},"Exécutez votre ",[19,3148,3152],{"href":3149,"rel":3150,"title":3151},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipeline CI/CD"," pour détecter tout problème.",[533,3155,3157],{"id":3156},"exploitez-lia-pour-les-tâches-de-suivi","Exploitez l'IA pour les tâches de suivi",[102,3159,3160,3163,3166],{},[59,3161,3162],{},"Générez automatiquement des requêtes de test.",[59,3164,3165],{},"Créez des templates de documentation.",[59,3167,3168],{},"Construisez des scripts de validation.",[39,3170,3172],{"id":3171},"prochaines-étapes","Prochaines étapes",[12,3174,3175],{},"Cet article montre comment les outils de développement alimentés par l'IA comme GitLab Duo transforment également les workflows d'ingénierie des données. La capacité de générer des centaines de lignes de code prêtes pour la production en quelques minutes, avec tests complets, documentation et structure appropriée, représente un changement fondamental dans notre approche des tâches répétitives.",[12,3177,3178],{},"En exploitant l'IA pour gérer les aspects répétitifs de la création de modèles dbt, les Data Engineers peuvent se concentrer sur des activités à plus forte valeur ajoutée comme la stratégie de modélisation des données, l'optimisation des performances et l'implémentation de la logique métier.",[12,3180,3181,3184],{},[31,3182,3183],{},"Prêt à essayer par vous-même ?"," Commencez avec un petit jeu de données, préparez soigneusement vos métadonnées et observez comment GitLab Duo transforme des heures de travail en une tâche de seulement quelques minutes.",[26,3186,3187],{},[12,3188,3189],{},[31,3190,3191],{},[19,3192,37],{"href":35,"rel":3193},[],[39,3195,3197],{"id":3196},"pour-aller-plus-loin","Pour aller plus loin",[102,3199,3200,3207],{},[59,3201,3202],{},[19,3203,3206],{"href":3204,"rel":3205},"https://about.gitlab.com/fr-fr/blog/gitlab-18-3-expanding-ai-orchestration-in-software-engineering/",[],"GitLab 18.3 : expansion de l'orchestration IA dans l'ingénierie logicielle",[59,3208,3209],{},[19,3210,3213],{"href":3211,"rel":3212},"https://about.gitlab.com/fr-fr/blog/gitlab-duo-agent-platform-public-beta/",[],"GitLab Duo Agent Platform (bêta) : votre orchestration IA nouvelle génération",[3215,3216,3217],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":156,"searchDepth":170,"depth":170,"links":3219},[3220,3221,3222,3223,3224,3225,3228,3229,3230,3236,3237],{"id":41,"depth":170,"text":42},{"id":139,"depth":170,"text":140},{"id":327,"depth":170,"text":328},{"id":349,"depth":170,"text":350},{"id":393,"depth":170,"text":394},{"id":465,"depth":170,"text":466,"children":3226},[3227],{"id":535,"depth":177,"text":536},{"id":1227,"depth":170,"text":1228},{"id":3070,"depth":170,"text":3071},{"id":3091,"depth":170,"text":3092,"children":3231},[3232,3233,3234,3235],{"id":3098,"depth":177,"text":3099},{"id":3119,"depth":177,"text":3120},{"id":3134,"depth":177,"text":3135},{"id":3156,"depth":177,"text":3157},{"id":3171,"depth":170,"text":3172},{"id":3196,"depth":170,"text":3197},"ai","2025-10-27","Découvrez comment transformer des heures de codage manuel en quelques minutes avec ce guide complet de création de modèles dbt.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/blog/hero%20images/workflow_1800x945",{},"/fr-fr/blog/how-gitlab-duo-agent-platform-transforms-dataops",{"config":3248,"ogImage":3244,"title":5,"description":3240},{"noIndex":3243},"how-gitlab-duo-agent-platform-transforms-dataops","fr-fr/blog/how-gitlab-duo-agent-platform-transforms-dataops",[3252,3253,3254],"product","tutorial","features","BlogPost","x0djZRK_CR8sjqmAWguYTQXVU3XKTjsf_aPsf5qh-6s",{"logo":3258,"freeTrial":3263,"sales":3268,"login":3273,"items":3278,"search":3607,"minimal":3642,"duo":3661,"switchNav":3670,"pricingDeployment":3681},{"config":3259},{"href":3260,"dataGaName":3261,"dataGaLocation":3262},"/fr-fr/","gitlab logo","header",{"text":3264,"config":3265},"Commencer un essai gratuit",{"href":3266,"dataGaName":3267,"dataGaLocation":3262},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":3269,"config":3270},"Demander une démo",{"href":3271,"dataGaName":3272,"dataGaLocation":3262},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":3274,"config":3275},"Connexion",{"href":3276,"dataGaName":3277,"dataGaLocation":3262},"https://gitlab.com/users/sign_in/","sign in",[3279,3308,3410,3415,3529,3585],{"text":3280,"config":3281,"menu":3283},"Plateforme",{"dataNavLevelOne":3282},"platform",{"type":3284,"columns":3285},"cards",[3286,3292,3300],{"title":3280,"description":3287,"link":3288},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":3289,"config":3290},"Explorer notre plateforme",{"href":3291,"dataGaName":3282,"dataGaLocation":3262},"/fr-fr/platform/",{"title":3293,"description":3294,"link":3295},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":3296,"config":3297},"Découvrir GitLab Duo",{"href":3298,"dataGaName":3299,"dataGaLocation":3262},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":3301,"description":3302,"link":3303},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":3304,"config":3305},"En savoir plus",{"href":3306,"dataGaName":3307,"dataGaLocation":3262},"/fr-fr/why-gitlab/","why gitlab",{"text":3309,"left":166,"config":3310,"menu":3312},"Produit",{"dataNavLevelOne":3311},"solutions",{"type":3313,"link":3314,"columns":3318,"feature":3389},"lists",{"text":3315,"config":3316},"Voir toutes les solutions",{"href":3317,"dataGaName":3311,"dataGaLocation":3262},"/fr-fr/solutions/",[3319,3344,3367],{"title":3320,"description":3321,"link":3322,"items":3327},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":3323},{"icon":3324,"href":3325,"dataGaName":3326,"dataGaLocation":3262},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[3328,3332,3335,3340],{"text":3329,"config":3330},"CI/CD",{"href":3331,"dataGaLocation":3262,"dataGaName":3329},"/fr-fr/solutions/continuous-integration/",{"text":3293,"config":3333},{"href":3298,"dataGaLocation":3262,"dataGaName":3334},"gitlab duo agent platform - product menu",{"text":3336,"config":3337},"Gestion du code source",{"href":3338,"dataGaLocation":3262,"dataGaName":3339},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":3341,"config":3342},"Livraison de logiciels automatisée",{"href":3325,"dataGaLocation":3262,"dataGaName":3343},"Automated software delivery",{"title":3345,"description":3346,"link":3347,"items":3352},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":3348},{"href":3349,"dataGaName":3350,"dataGaLocation":3262,"icon":3351},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[3353,3357,3362],{"text":3354,"config":3355},"Tests de sécurité des applications",{"href":3349,"dataGaName":3356,"dataGaLocation":3262},"Application security testing",{"text":3358,"config":3359},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":3360,"dataGaLocation":3262,"dataGaName":3361},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":3363,"config":3364},"Conformité logicielle",{"href":3365,"dataGaName":3366,"dataGaLocation":3262},"/fr-fr/solutions/software-compliance/","software compliance",{"title":3368,"link":3369,"items":3374},"Mesures",{"config":3370},{"icon":3371,"href":3372,"dataGaName":3373,"dataGaLocation":3262},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[3375,3379,3384],{"text":3376,"config":3377},"Visibilité et mesures",{"href":3372,"dataGaLocation":3262,"dataGaName":3378},"Visibility and Measurement",{"text":3380,"config":3381},"Gestion de la chaîne de valeur",{"href":3382,"dataGaLocation":3262,"dataGaName":3383},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":3385,"config":3386},"Analyses et informations",{"href":3387,"dataGaLocation":3262,"dataGaName":3388},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":3390,"type":3313,"items":3391},"GitLab",[3392,3398,3404],{"text":3393,"config":3394},"Entreprises",{"icon":3395,"href":3396,"dataGaLocation":3262,"dataGaName":3397},"Building","/fr-fr/enterprise/","enterprise",{"text":3399,"config":3400},"Pour les PME",{"icon":3401,"href":3402,"dataGaLocation":3262,"dataGaName":3403},"Work","/fr-fr/small-business/","small business",{"text":3405,"config":3406},"Pour le secteur public",{"icon":3407,"href":3408,"dataGaLocation":3262,"dataGaName":3409},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":3411,"config":3412},"Tarifs",{"href":3413,"dataGaName":3414,"dataGaLocation":3262,"dataNavLevelOne":3414},"/fr-fr/pricing/","pricing",{"text":3416,"config":3417,"menu":3419},"Ressources",{"dataNavLevelOne":3418},"resources",{"type":3313,"link":3420,"columns":3424,"feature":3518},{"text":3421,"config":3422},"Afficher toutes les ressources",{"href":3423,"dataGaName":3418,"dataGaLocation":3262},"/fr-fr/resources/",[3425,3458,3485],{"title":3426,"items":3427},"Premiers pas",[3428,3433,3438,3443,3448,3453],{"text":3429,"config":3430},"Installation",{"href":3431,"dataGaName":3432,"dataGaLocation":3262},"/fr-fr/install/","install",{"text":3434,"config":3435},"Guides de démarrage",{"href":3436,"dataGaName":3437,"dataGaLocation":3262},"/fr-fr/get-started/","quick setup checklists",{"text":3439,"config":3440},"Apprentissage",{"href":3441,"dataGaLocation":3262,"dataGaName":3442},"https://university.gitlab.com/","learn",{"text":3444,"config":3445},"Documentation",{"href":3446,"dataGaName":3447,"dataGaLocation":3262},"https://docs.gitlab.com/","product documentation",{"text":3449,"config":3450},"Vidéos sur les bonnes pratiques",{"href":3451,"dataGaName":3452,"dataGaLocation":3262},"/fr-fr/getting-started-videos/","best practice videos",{"text":3454,"config":3455},"Intégrations",{"href":3456,"dataGaName":3457,"dataGaLocation":3262},"/fr-fr/integrations/","integrations",{"title":3459,"items":3460},"Découvrir",[3461,3466,3471,3476,3480],{"text":3462,"config":3463},"Témoignages clients",{"href":3464,"dataGaName":3465,"dataGaLocation":3262},"/fr-fr/customers/","customer success stories",{"text":3467,"config":3468},"Blog",{"href":3469,"dataGaName":3470,"dataGaLocation":3262},"/fr-fr/blog/","blog",{"text":3472,"config":3473},"Demo Hub",{"href":3474,"dataGaName":3475,"dataGaLocation":3262},"/fr-fr/demo-hub/","demo hub",{"text":3477,"config":3478},"The Source",{"href":3479,"dataGaName":3470,"dataGaLocation":3262},"/fr-fr/the-source/",{"text":3481,"config":3482},"Travail à distance",{"href":3483,"dataGaName":3484,"dataGaLocation":3262},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":3486,"items":3487},"Connecter",[3488,3493,3498,3503,3508,3513],{"text":3489,"config":3490},"Services GitLab",{"href":3491,"dataGaName":3492,"dataGaLocation":3262},"/fr-fr/services/","services",{"text":3494,"config":3495},"Contribuer",{"href":3496,"dataGaName":3497,"dataGaLocation":3262},"https://contributors.gitlab.com","contribute",{"text":3499,"config":3500},"Communauté",{"href":3501,"dataGaName":3502,"dataGaLocation":3262},"/community/","community",{"text":3504,"config":3505},"Forum",{"href":3506,"dataGaName":3507,"dataGaLocation":3262},"https://forum.gitlab.com/","forum",{"text":3509,"config":3510},"Événements",{"href":3511,"dataGaName":3512,"dataGaLocation":3262},"/events/","events",{"text":3514,"config":3515},"Partenaires",{"href":3516,"dataGaName":3517,"dataGaLocation":3262},"/fr-fr/partners/","partners",{"config":3519,"title":3522,"text":3523,"link":3524},{"background":3520,"textColor":3521},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":3525,"config":3526},"Lire les articles les plus récents",{"href":3527,"dataGaName":3528,"dataGaLocation":3262},"/fr-fr/whats-new/","whats new",{"text":3530,"config":3531,"menu":3533},"Société",{"dataNavLevelOne":3532},"company",{"type":3313,"columns":3534},[3535],{"items":3536},[3537,3542,3548,3550,3555,3560,3565,3570,3575,3580],{"text":3538,"config":3539},"À propos",{"href":3540,"dataGaName":3541,"dataGaLocation":3262},"/fr-fr/company/","about",{"text":3543,"config":3544,"footerGa":3547},"Carrières",{"href":3545,"dataGaName":3546,"dataGaLocation":3262},"/jobs/","jobs",{"dataGaName":3546},{"text":3509,"config":3549},{"href":3511,"dataGaName":3512,"dataGaLocation":3262},{"text":3551,"config":3552},"Leadership",{"href":3553,"dataGaName":3554,"dataGaLocation":3262},"/company/team/e-group/","leadership",{"text":3556,"config":3557},"Manuel",{"href":3558,"dataGaName":3559,"dataGaLocation":3262},"https://handbook.gitlab.com/","handbook",{"text":3561,"config":3562},"Relations avec les investisseurs",{"href":3563,"dataGaName":3564,"dataGaLocation":3262},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":3566,"config":3567},"Trust Center",{"href":3568,"dataGaName":3569,"dataGaLocation":3262},"/fr-fr/security/","trust center",{"text":3571,"config":3572},"Centre pour la transparence de l'IA",{"href":3573,"dataGaName":3574,"dataGaLocation":3262},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":3576,"config":3577},"Newsletter",{"href":3578,"dataGaName":3579,"dataGaLocation":3262},"/company/contact/#contact-forms","newsletter",{"text":3581,"config":3582},"Presse",{"href":3583,"dataGaName":3584,"dataGaLocation":3262},"/press/","press",{"text":3586,"config":3587,"menu":3588},"Nous contacter",{"dataNavLevelOne":3532},{"type":3313,"columns":3589},[3590],{"items":3591},[3592,3597,3602],{"text":3593,"config":3594},"Contacter l'équipe commerciale",{"href":3595,"dataGaName":3596,"dataGaLocation":3262},"/fr-fr/sales/","talk to sales",{"text":3598,"config":3599},"Assistance GitLab",{"href":3600,"dataGaName":3601,"dataGaLocation":3262},"https://support.gitlab.com/hc/en-us","support portal",{"text":3603,"config":3604},"Portail clients GitLab",{"href":3605,"dataGaName":3606,"dataGaLocation":3262},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":3608,"login":3609,"suggestions":3616},"Fermer",{"text":3610,"link":3611},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":3612,"config":3613},"GitLab.com",{"href":3276,"dataGaName":3614,"dataGaLocation":3615},"search login","search",{"text":3617,"default":3618},"Suggestions",[3619,3621,3626,3628,3633,3638],{"text":3293,"config":3620},{"href":3298,"dataGaName":23,"dataGaLocation":3615},{"text":3622,"config":3623},"Suggestions de code (IA)",{"href":3624,"dataGaName":3625,"dataGaLocation":3615},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":3329,"config":3627},{"href":3331,"dataGaName":3329,"dataGaLocation":3615},{"text":3629,"config":3630},"GitLab sur AWS",{"href":3631,"dataGaName":3632,"dataGaLocation":3615},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":3634,"config":3635},"GitLab sur Google Cloud",{"href":3636,"dataGaName":3637,"dataGaLocation":3615},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":3639,"config":3640},"Pourquoi utiliser GitLab ?",{"href":3306,"dataGaName":3641,"dataGaLocation":3615},"Why GitLab?",{"freeTrial":3643,"mobileIcon":3648,"desktopIcon":3653,"secondaryButton":3656},{"text":3644,"config":3645},"Commencer votre essai gratuit",{"href":3646,"dataGaName":3267,"dataGaLocation":3647},"https://gitlab.com/-/trials/new/","nav",{"altText":3649,"config":3650},"Icône GitLab",{"src":3651,"dataGaName":3652,"dataGaLocation":3647},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":3649,"config":3654},{"src":3655,"dataGaName":3652,"dataGaLocation":3647},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":3657,"config":3658},"Commencer",{"href":3659,"dataGaName":3660,"dataGaLocation":3647},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":3662,"mobileIcon":3666,"desktopIcon":3668},{"text":3663,"config":3664},"En savoir plus sur GitLab Duo",{"href":3298,"dataGaName":3665,"dataGaLocation":3647},"gitlab duo",{"altText":3649,"config":3667},{"src":3651,"dataGaName":3652,"dataGaLocation":3647},{"altText":3649,"config":3669},{"src":3655,"dataGaName":3652,"dataGaLocation":3647},{"button":3671,"mobileIcon":3676,"desktopIcon":3678},{"text":3672,"config":3673},"/switch",{"href":3674,"dataGaName":3675,"dataGaLocation":3647},"#contact","switch",{"altText":3649,"config":3677},{"src":3651,"dataGaName":3652,"dataGaLocation":3647},{"altText":3649,"config":3679},{"src":3680,"dataGaName":3652,"dataGaLocation":3647},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":3682,"mobileIcon":3687,"desktopIcon":3689},{"text":3683,"config":3684},"Retour aux tarifs",{"href":3413,"dataGaName":3685,"dataGaLocation":3647,"icon":3686},"back to pricing","GoBack",{"altText":3649,"config":3688},{"src":3651,"dataGaName":3652,"dataGaLocation":3647},{"altText":3649,"config":3690},{"src":3655,"dataGaName":3652,"dataGaLocation":3647},{"title":3692,"button":3693,"config":3697},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":3304,"config":3694},{"href":3695,"dataGaName":3696,"dataGaLocation":3262},"/fr-fr/gitlab-orbit/","orbit",{"layout":3698,"disabled":3243},"release",{"data":3700},{"text":3701,"source":3702,"edit":3708,"contribute":3713,"config":3717,"items":3722,"minimal":3930},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":3703,"config":3704},"Afficher le code source de la page",{"href":3705,"dataGaName":3706,"dataGaLocation":3707},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":3709,"config":3710},"Modifier cette page",{"href":3711,"dataGaName":3712,"dataGaLocation":3707},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":3494,"config":3714},{"href":3715,"dataGaName":3716,"dataGaLocation":3707},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":3718,"facebook":3719,"youtube":3720,"linkedin":3721},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[3723,3769,3822,3865,3897],{"title":3411,"links":3724,"subMenu":3739},[3725,3729,3734],{"text":3726,"config":3727},"Voir les forfaits",{"href":3413,"dataGaName":3728,"dataGaLocation":3707},"view plans",{"text":3730,"config":3731},"GitLab Premium",{"href":3732,"dataGaName":3733,"dataGaLocation":3707},"/fr-fr/pricing/premium/","why premium",{"text":3735,"config":3736},"GitLab Ultimate",{"href":3737,"dataGaName":3738,"dataGaLocation":3707},"/fr-fr/pricing/ultimate/","why ultimate",[3740],{"title":3586,"links":3741},[3742,3744,3746,3749,3754,3759,3764],{"text":3593,"config":3743},{"href":3595,"dataGaName":3272,"dataGaLocation":3707},{"text":3598,"config":3745},{"href":3600,"dataGaName":3601,"dataGaLocation":3707},{"text":3747,"config":3748},"Portail clients",{"href":3605,"dataGaName":3606,"dataGaLocation":3707},{"text":3750,"config":3751},"Statut",{"href":3752,"dataGaName":3753,"dataGaLocation":3707},"https://status.gitlab.com/","status",{"text":3755,"config":3756},"Conditions d'utilisation",{"href":3757,"dataGaName":3758,"dataGaLocation":3707},"/terms/","terms of use",{"text":3760,"config":3761},"Politique de confidentialité",{"href":3762,"dataGaName":3763,"dataGaLocation":3707},"/fr-fr/privacy/","privacy statement",{"text":3765,"config":3766},"Gestion des cookies",{"dataGaName":3767,"dataGaLocation":3707,"id":3768,"isOneTrustButton":166},"cookie preferences","ot-sdk-btn",{"title":3309,"links":3770,"subMenu":3779},[3771,3775],{"text":3772,"config":3773},"Plateforme DevSecOps",{"href":3291,"dataGaName":3774,"dataGaLocation":3707},"devsecops platform",{"text":3776,"config":3777},"Développement assisté par l'IA",{"href":3298,"dataGaName":3778,"dataGaLocation":3707},"ai-assisted development",[3780],{"title":3781,"links":3782},"Thèmes",[3783,3787,3792,3797,3802,3807,3812,3817],{"text":3329,"config":3784},{"href":3785,"dataGaName":3786,"dataGaLocation":3707},"/fr-fr/topics/ci-cd/","cicd",{"text":3788,"config":3789},"GitOps",{"href":3790,"dataGaName":3791,"dataGaLocation":3707},"/fr-fr/topics/gitops/","gitops",{"text":3793,"config":3794},"DevOps",{"href":3795,"dataGaName":3796,"dataGaLocation":3707},"/fr-fr/topics/devops/","devops",{"text":3798,"config":3799},"Contrôle de version",{"href":3800,"dataGaName":3801,"dataGaLocation":3707},"/fr-fr/topics/version-control/","version control",{"text":3803,"config":3804},"DevSecOps",{"href":3805,"dataGaName":3806,"dataGaLocation":3707},"/fr-fr/topics/devsecops/","devsecops",{"text":3808,"config":3809},"Cloud-native",{"href":3810,"dataGaName":3811,"dataGaLocation":3707},"/fr-fr/topics/cloud-native/","cloud native",{"text":3813,"config":3814},"IA pour la programmation",{"href":3815,"dataGaName":3816,"dataGaLocation":3707},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":3818,"config":3819},"IA agentique",{"href":3820,"dataGaName":3821,"dataGaLocation":3707},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":3823,"links":3824},"Solutions",[3825,3828,3830,3835,3838,3841,3844,3847,3849,3852,3855,3860],{"text":3354,"config":3826},{"href":3349,"dataGaName":3827,"dataGaLocation":3707},"Application Security Testing",{"text":3341,"config":3829},{"href":3325,"dataGaName":3326,"dataGaLocation":3707},{"text":3831,"config":3832},"Développement Agile",{"href":3833,"dataGaName":3834,"dataGaLocation":3707},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":3336,"config":3836},{"href":3338,"dataGaName":3837,"dataGaLocation":3707},"source code management",{"text":3329,"config":3839},{"href":3331,"dataGaName":3840,"dataGaLocation":3707},"continuous integration & delivery",{"text":3380,"config":3842},{"href":3382,"dataGaName":3843,"dataGaLocation":3707},"value stream management",{"text":3788,"config":3845},{"href":3846,"dataGaName":3791,"dataGaLocation":3707},"/fr-fr/solutions/gitops/",{"text":3393,"config":3848},{"href":3396,"dataGaName":3397,"dataGaLocation":3707},{"text":3850,"config":3851},"PME",{"href":3402,"dataGaName":3403,"dataGaLocation":3707},{"text":3853,"config":3854},"Secteur public",{"href":3408,"dataGaName":3409,"dataGaLocation":3707},{"text":3856,"config":3857},"Éducation",{"href":3858,"dataGaName":3859,"dataGaLocation":3707},"/fr-fr/solutions/education/","education",{"text":3861,"config":3862},"Services financiers",{"href":3863,"dataGaName":3864,"dataGaLocation":3707},"/fr-fr/solutions/finance/","financial services",{"title":3416,"links":3866},[3867,3869,3871,3873,3876,3878,3881,3883,3885,3887,3889,3891,3893,3895],{"text":3429,"config":3868},{"href":3431,"dataGaName":3432,"dataGaLocation":3707},{"text":3434,"config":3870},{"href":3436,"dataGaName":3437,"dataGaLocation":3707},{"text":3439,"config":3872},{"href":3441,"dataGaName":3442,"dataGaLocation":3707},{"text":3444,"config":3874},{"href":3446,"dataGaName":3875,"dataGaLocation":3707},"docs",{"text":3467,"config":3877},{"href":3469,"dataGaName":3470,"dataGaLocation":3707},{"text":3879,"config":3880},"Nouveautés",{"href":3527,"dataGaName":3528,"dataGaLocation":3707},{"text":3462,"config":3882},{"href":3464,"dataGaName":3465,"dataGaLocation":3707},{"text":3481,"config":3884},{"href":3483,"dataGaName":3484,"dataGaLocation":3707},{"text":3489,"config":3886},{"href":3491,"dataGaName":3492,"dataGaLocation":3707},{"text":3494,"config":3888},{"href":3496,"dataGaName":3497,"dataGaLocation":3707},{"text":3499,"config":3890},{"href":3501,"dataGaName":3502,"dataGaLocation":3707},{"text":3504,"config":3892},{"href":3506,"dataGaName":3507,"dataGaLocation":3707},{"text":3509,"config":3894},{"href":3511,"dataGaName":3512,"dataGaLocation":3707},{"text":3514,"config":3896},{"href":3516,"dataGaName":3517,"dataGaLocation":3707},{"title":3530,"links":3898},[3899,3901,3903,3905,3907,3909,3914,3919,3921,3923,3925],{"text":3538,"config":3900},{"href":3540,"dataGaName":3532,"dataGaLocation":3707},{"text":3543,"config":3902},{"href":3545,"dataGaName":3546,"dataGaLocation":3707},{"text":3551,"config":3904},{"href":3553,"dataGaName":3554,"dataGaLocation":3707},{"text":3556,"config":3906},{"href":3558,"dataGaName":3559,"dataGaLocation":3707},{"text":3561,"config":3908},{"href":3563,"dataGaName":3564,"dataGaLocation":3707},{"text":3910,"config":3911},"Développement durable",{"href":3912,"dataGaName":3913,"dataGaLocation":3707},"/sustainability/","Sustainability",{"text":3915,"config":3916},"Diversité, inclusion et appartenance (DIB)",{"href":3917,"dataGaName":3918,"dataGaLocation":3707},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":3566,"config":3920},{"href":3568,"dataGaName":3569,"dataGaLocation":3707},{"text":3576,"config":3922},{"href":3578,"dataGaName":3579,"dataGaLocation":3707},{"text":3581,"config":3924},{"href":3583,"dataGaName":3584,"dataGaLocation":3707},{"text":3926,"config":3927},"Déclaration de transparence sur l'esclavage moderne",{"href":3928,"dataGaName":3929,"dataGaLocation":3707},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":3931},[3932,3934,3936],{"text":3755,"config":3933},{"href":3757,"dataGaName":3758,"dataGaLocation":3707},{"text":3765,"config":3935},{"dataGaName":3767,"dataGaLocation":3707,"id":3768,"isOneTrustButton":166},{"text":3760,"config":3937},{"href":3762,"dataGaName":3763,"dataGaLocation":3707},[3939],{"id":3940,"title":3941,"body":3242,"config":3942,"content":3945,"description":3242,"extension":3948,"meta":3949,"navigation":166,"path":3950,"seo":3951,"stem":3952,"__hash__":3953},"blogAuthors/en-us/blog/authors/dennis-van-rooijen.yml","Dennis Van Rooijen",{"template":3943,"gitlabHandle":3944},"BlogAuthor","dvanrooijen2",{"name":7,"config":3946},{"headshot":3947},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758031391/muvwg1sxetzekmuhqdql.png","yml",{},"/en-us/blog/authors/dennis-van-rooijen",{},"en-us/blog/authors/dennis-van-rooijen","-VrBQM0MkpSMVi6cd_BwGMYKVgzryOCw3IxXukVkNGg",[3955,3963,3971],{"title":3956,"description":3957,"heroImage":3958,"category":3238,"date":3959,"authors":3960,"slug":3962,"externalUrl":3242},"Moderniser Java avec Cursor et GitLab","Ce tutoriel commence par la correction ciblée de tests, introduit des murs qualité et met en œuvre des modifications de code en tenant compte du contexte du cycle de développement, des tests et des preuves de revue.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-08-12",[3961],"Michael Friedrich","modernize-java-with-cursor-and-gitlab",{"title":3964,"description":3965,"heroImage":3966,"category":3238,"date":3967,"authors":3968,"slug":3970,"externalUrl":3242},"Comment utiliser des agents d'IA pour migrer la limitation de débit de GitLab","Découvrez comment notre équipe composée de trois personnes a utilisé GitLab Duo Agent Platform, ainsi que d'autres outils d'IA, pour migrer avec succès le système de limitation de débit et les leçons que nous en avons tirées.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1773075582/yiosxfhwk8rfkulrtchv.png","2026-08-10",[3969],"Sam Wiskow","ai-agents-for-migrating-rate-limiting-system",{"title":3972,"description":3973,"heroImage":3974,"category":3238,"date":3975,"authors":3976,"slug":3978,"externalUrl":3242},"Codage agentique : le contexte fait la différence","Les agents de codage accélèrent le développement. Grâce au contexte dans GitLab, les entreprises évitent les correctifs superficiels et raccourcissent les cycles de revue.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1773856365/gsx2c0vqlswox3ldmq88.jpg","2026-08-03",[3977],"Jessica Taylor","agentic-coding-only-as-good-as-context",{"promotions":3980},[3981,3994,4005,4017],{"id":3982,"categories":3983,"header":3984,"text":3985,"button":3986,"image":3991},"ai-modernization",[3238],"L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":3987,"config":3988},"Obtenez votre score de maturité IA",{"href":3989,"dataGaName":3990,"dataGaLocation":3470},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":3992},{"src":3993},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":3995,"categories":3996,"header":3997,"text":3985,"button":3998,"image":4002},"devops-modernization",[3252,3806],"Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":3999,"config":4000},"Obtenez votre score de maturité DevOps",{"href":4001,"dataGaName":3990,"dataGaLocation":3470},"/fr-fr/assessments/devops-modernization-assessment/",{"config":4003},{"src":4004},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":4006,"categories":4007,"header":4009,"text":3985,"button":4010,"image":4014},"security-modernization",[4008],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":4011,"config":4012},"Obtenez votre score de maturité en matière de sécurité",{"href":4013,"dataGaName":3990,"dataGaLocation":3470},"/fr-fr/assessments/security-modernization-assessment/",{"config":4015},{"src":4016},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":4018,"paths":4019,"header":4022,"text":4023,"button":4024,"image":4029},"github-azure-migration",[4020,4021],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":4025,"config":4026},"Découvrez les différences entre GitLab et GitHub",{"href":4027,"dataGaName":4028,"dataGaLocation":3470},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":4030},{"src":4004},{"header":4032,"blurb":4033,"button":4034,"secondaryButton":4038},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":3264,"config":4035},{"href":4036,"dataGaName":3267,"dataGaLocation":4037},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":3593,"config":4039},{"href":3595,"dataGaName":3272,"dataGaLocation":4037},1786803785811]