[{"data":1,"prerenderedAt":5281},["ShallowReactive",2],{"author-eloise-chizat":3,"author-articles-eloise-chizat":22,"authors":4965},{"id":4,"title":5,"body":6,"description":10,"extension":13,"meta":14,"name":15,"navigation":16,"path":17,"readingTime":18,"seo":19,"stem":20,"__hash__":21},"authors\u002Fauthors\u002Feloise-chizat.md","Data Engineer",{"type":7,"value":8,"toc":9},"minimark",[],{"title":10,"searchDepth":11,"depth":11,"links":12},"",2,[],"md",{},"Eloïse Chizat",true,"\u002Fauthors\u002Feloise-chizat",1,{"title":5,"description":10},"authors\u002Feloise-chizat","Utd72Vm9qT4hh2ZbFi6a2_nXw5Wb494Ed_HL1ra5yw8",[23,2994,4911],{"id":24,"title":25,"author":26,"body":27,"date":2984,"description":48,"extension":13,"lang":2985,"meta":2986,"navigation":16,"path":2987,"published":16,"readingTime":348,"seo":2988,"stem":2989,"tags":2990,"__hash__":2993},"articles\u002Farticles\u002F2024-01-25-monitoring-de-la-complexite-des-models-dbt.md","Monitoring de la complexité des models DBT","eloise-chizat",{"type":7,"value":28,"toc":2975},[29,46,49,54,71,85,94,100,107,113,116,121,124,128,131,150,157,160,164,670,673,2971],[30,31,32,33,40,41,45],"p",{},"Suite à la mise en place de notre nouvelle architecture en médaillon\n(",[34,35,39],"a",{"href":36,"rel":37},"https:\u002F\u002Ftech.indy.fr\u002F2024\u002F01\u002F25\u002Fmise-en-place-dune-archi-medaillon-sur-la-bi-chez-indy\u002F",[38],"nofollow","voir l'article ici","),\nnous nous sommes rendu compte qu’il nous fallait maintenant creuser le sujet de la complexité de\nnotre codebase. Au moment où j’écris cet article nous avons presque 400 modèles et 70 sources de\ndonnées ! Un ",[42,43,44],"code",{},"full-refresh"," (rafraichissement de tous les models sans prendre en compte\nl’incrémental) prend environ 2h, un run classique environ 20min.",[30,47,48],{},"Bien que le sujet soit encore en chantier, voici les premières étapes que nous avons mises en place.",[50,51,53],"h2",{"id":52},"complexité-des-lineages-dbt-project-evaluator","Complexité des lineages : DBT project evaluator",[30,55,56,57,62,63,66,67,70],{},"Notre première approche a été d’installer le package\n",[34,58,61],{"href":59,"rel":60},"https:\u002F\u002Fdbt-labs.github.io\u002Fdbt-project-evaluator\u002F0.8\u002F",[38],"DBT project evaluator"," : nous avions déjà un\nlinter de code, mais ici l’approche est plus structurelle et architecturale. Ce package propose\ndifférentes “guide lines” qui permettent d’avoir un projet propre et maintenable, en signalant par\nexemple les sources non utilisées, des modèles qui seraient à la fois parent et enfant d’un autre\nmodèle ou encore des mauvaises pratiques comme des ",[42,64,65],{},"join"," directement dans la couche ",[42,68,69],{},"bronze"," ou sur\nles sources.",[30,72,73,74,79,80,84],{},"Dans un premier temps, nous avons ajouté ce package uniquement en local, les règles simples ont été\ncorrigées, les cas que nous voulions garder tels quels ont été exclus\n",[34,75,78],{"href":76,"rel":77},"https:\u002F\u002Fdbt-labs.github.io\u002Fdbt-project-evaluator\u002F0.8\u002Fcustomization\u002Fexceptions\u002F",[38],"via le fichier"," de\n",[81,82,83],"em",{},"seeds"," prévu à cet effet. Chaque règle à été revue par l’équipe, été activée ou non, paramétrée le\ncas échéant.",[30,86,87,88,93],{},"Corriger\n",[34,89,92],{"href":90,"rel":91},"https:\u002F\u002Fdbt-labs.github.io\u002Fdbt-project-evaluator\u002F0.8\u002Frules\u002Fmodeling\u002F#rejoining-of-upstream-concepts",[38],"fct_rejoining_of_upstream_concepts","\nétait plus complexe. Nous avons listé les fichiers qui avaient cette alerte dans les exclusions,\npuis nous avons ajouté le package à la CI pour éviter que de nouveaux développements ne soulèvent\nd’autres alertes.",[30,95,96,97,99],{},"Depuis la mise en place de DBT project evaluator nous corrigeons petit à petit les modèles que nous\navons listé dans le fichier de ",[42,98,83],{},".",[101,102,104,105],"h3",{"id":103},"exemple-de-simplification-de-lineage-après-correction-dune-alerte-fct_rejoining_of_upstream_concepts","Exemple de simplification de lineage après correction d’une alerte ",[42,106,92],{},[30,108,109],{},[110,111],"img",{"alt":10,"src":112},"\u002Fimages\u002F286675973-b695b4a5-d435-45eb-b607-3ff3e2ddd482.png",[30,114,115],{},"Avant refacto",[30,117,118],{},[110,119],{"alt":10,"src":120},"\u002Fimages\u002F286676010-5a428dcd-e943-4237-baa2-8b8b77917d9d-1.png",[30,122,123],{},"Après refacto",[50,125,127],{"id":126},"complexité-du-code-sql-solution-maison","Complexité du code SQL : solution maison",[30,129,130],{},"Nous avons voulu partir sur un script Python, qui se base sur plusieurs indicateurs comme le nombre\nde colonne d’un modèle, l’occurence de mots clefs SQL et le nombre de modèles parents.",[30,132,133,134,137,138,141,142,145,146,149],{},"Nous avons défini une liste de mots clefs SQL et nous leur avons affecté une valeur en fonction de\nleur complexité. Ainsi, un ",[42,135,136],{},"WHERE"," vaudra 1 point alors qu’un ",[42,139,140],{},"UNNEST"," ou un ",[42,143,144],{},"LAG"," vaudra 3 points,\net qu’un ",[42,147,148],{},"OR"," en vaudra 0,1. Nous sommes parti d’un premier mot clef auquel nous avons donné une\nvaleur arbitraire, puis pour chaque mot clef nous avons convenu ensemble d’une valeur plus ou moins\nélevée en fonction des mots clefs déjà évalués. Nous n’avons bien évidement pas listés tous les mots\nclefs disponibles en SQL, mais uniquement les plus récurrents dans notre projet, c’est à dire\nenviron une quinzaine.",[30,151,152,153,156],{},"Le résultat de ce script est ajouté à titre indicatif sur chaque description de PR ",[81,154,155],{},"via"," la CI, les\nrésultats ne sont pour le moment pas sauvegardés pour un suivi plus précis.",[30,158,159],{},"Cet indicateur est pour le moment en phase de test, et nous permet notamment de valider certaines\nrefactorisations dont le but est de réduire la complexité. Nous ajoutons encore des mots clefs dans\nnotre liste quand un nouveau nous semble pertinent.",[101,161,163],{"id":162},"exemple-de-résultat-du-script-de-calcul-de-la-complexité","Exemple de résultat du script de calcul de la complexité",[165,166,170],"pre",{"className":167,"code":168,"language":169,"meta":10,"style":10},"language-sql shiki shiki-themes github-light github-dark","BEFORE public\u002Fcare\u002Fcare_working_days.sql nb_columns=8 sql=4.0 coupling=2 complexity=16\n\nAFTER public\u002Fcare\u002Fcare_working_days.sql nb_columns=8 sql=1.0 coupling=2 complexity=12\n\nBEFORE public\u002Fcare\u002Fcare_working_periods.sql nb_columns=2 sql=4.0 coupling=2 complexity=8\n\nAFTER public\u002Fcare\u002Fcare_working_periods.sql nb_columns=2 sql=4.0 coupling=2 complexity=8\n\nBEFORE public\u002Fsales\u002Fsales_cadence_hybride.sql nb_columns=10 sql=5.0 coupling=3 complexity=23\n\nAFTER public\u002Fsales\u002Fsales_cadence_hybride.sql nb_columns=10 sql=5.0 coupling=3 complexity=23\n\nBEFORE public\u002Findies\u002Fworking_days.sql nb_columns=6 sql=1.0 coupling=2 complexity=9\n\nAFTER public\u002Findies\u002Fworking_days.sql nb_columns=6 sql=1.0 coupling=1 complexity=8\n\nADDED silver\u002Fcare\u002Fsilver_care_working_days.sql nb_columns=8 sql=3.0 coupling=2 complexity=15\n\n-- nb models before=380 after=381 diff=1\n-- global complexity before=15305 after=15314 diff=9\n","sql",[42,171,172,236,241,289,294,341,346,391,396,447,452,497,502,551,556,601,606,652,657,664],{"__ignoreMap":10},[173,174,176,180,184,187,190,192,196,198,200,203,206,209,212,215,217,220,223,225,228,231,233],"span",{"class":175,"line":18},"line",[173,177,179],{"class":178},"szBVR","BEFORE",[173,181,183],{"class":182},"sVt8B"," public",[173,185,186],{"class":178},"\u002F",[173,188,189],{"class":182},"care",[173,191,186],{"class":178},[173,193,195],{"class":194},"sj4cs","care_working_days",[173,197,99],{"class":182},[173,199,169],{"class":194},[173,201,202],{"class":182}," nb_columns",[173,204,205],{"class":178},"=",[173,207,208],{"class":194},"8",[173,210,211],{"class":178}," sql=",[173,213,214],{"class":194},"4",[173,216,99],{"class":182},[173,218,219],{"class":194},"0",[173,221,222],{"class":182}," coupling",[173,224,205],{"class":178},[173,226,227],{"class":194},"2",[173,229,230],{"class":182}," complexity",[173,232,205],{"class":178},[173,234,235],{"class":194},"16\n",[173,237,238],{"class":175,"line":11},[173,239,240],{"emptyLinePlaceholder":16},"\n",[173,242,244,247,249,251,253,255,257,259,261,263,265,267,269,272,274,276,278,280,282,284,286],{"class":175,"line":243},3,[173,245,246],{"class":178},"AFTER",[173,248,183],{"class":182},[173,250,186],{"class":178},[173,252,189],{"class":182},[173,254,186],{"class":178},[173,256,195],{"class":194},[173,258,99],{"class":182},[173,260,169],{"class":194},[173,262,202],{"class":182},[173,264,205],{"class":178},[173,266,208],{"class":194},[173,268,211],{"class":178},[173,270,271],{"class":194},"1",[173,273,99],{"class":182},[173,275,219],{"class":194},[173,277,222],{"class":182},[173,279,205],{"class":178},[173,281,227],{"class":194},[173,283,230],{"class":182},[173,285,205],{"class":178},[173,287,288],{"class":194},"12\n",[173,290,292],{"class":175,"line":291},4,[173,293,240],{"emptyLinePlaceholder":16},[173,295,297,299,301,303,305,307,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338],{"class":175,"line":296},5,[173,298,179],{"class":178},[173,300,183],{"class":182},[173,302,186],{"class":178},[173,304,189],{"class":182},[173,306,186],{"class":178},[173,308,309],{"class":194},"care_working_periods",[173,311,99],{"class":182},[173,313,169],{"class":194},[173,315,202],{"class":182},[173,317,205],{"class":178},[173,319,227],{"class":194},[173,321,211],{"class":178},[173,323,214],{"class":194},[173,325,99],{"class":182},[173,327,219],{"class":194},[173,329,222],{"class":182},[173,331,205],{"class":178},[173,333,227],{"class":194},[173,335,230],{"class":182},[173,337,205],{"class":178},[173,339,340],{"class":194},"8\n",[173,342,344],{"class":175,"line":343},6,[173,345,240],{"emptyLinePlaceholder":16},[173,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,377,379,381,383,385,387,389],{"class":175,"line":348},7,[173,350,246],{"class":178},[173,352,183],{"class":182},[173,354,186],{"class":178},[173,356,189],{"class":182},[173,358,186],{"class":178},[173,360,309],{"class":194},[173,362,99],{"class":182},[173,364,169],{"class":194},[173,366,202],{"class":182},[173,368,205],{"class":178},[173,370,227],{"class":194},[173,372,211],{"class":178},[173,374,214],{"class":194},[173,376,99],{"class":182},[173,378,219],{"class":194},[173,380,222],{"class":182},[173,382,205],{"class":178},[173,384,227],{"class":194},[173,386,230],{"class":182},[173,388,205],{"class":178},[173,390,340],{"class":194},[173,392,394],{"class":175,"line":393},8,[173,395,240],{"emptyLinePlaceholder":16},[173,397,399,401,403,405,408,410,413,415,417,419,421,424,426,429,431,433,435,437,440,442,444],{"class":175,"line":398},9,[173,400,179],{"class":178},[173,402,183],{"class":182},[173,404,186],{"class":178},[173,406,407],{"class":182},"sales",[173,409,186],{"class":178},[173,411,412],{"class":194},"sales_cadence_hybride",[173,414,99],{"class":182},[173,416,169],{"class":194},[173,418,202],{"class":182},[173,420,205],{"class":178},[173,422,423],{"class":194},"10",[173,425,211],{"class":178},[173,427,428],{"class":194},"5",[173,430,99],{"class":182},[173,432,219],{"class":194},[173,434,222],{"class":182},[173,436,205],{"class":178},[173,438,439],{"class":194},"3",[173,441,230],{"class":182},[173,443,205],{"class":178},[173,445,446],{"class":194},"23\n",[173,448,450],{"class":175,"line":449},10,[173,451,240],{"emptyLinePlaceholder":16},[173,453,455,457,459,461,463,465,467,469,471,473,475,477,479,481,483,485,487,489,491,493,495],{"class":175,"line":454},11,[173,456,246],{"class":178},[173,458,183],{"class":182},[173,460,186],{"class":178},[173,462,407],{"class":182},[173,464,186],{"class":178},[173,466,412],{"class":194},[173,468,99],{"class":182},[173,470,169],{"class":194},[173,472,202],{"class":182},[173,474,205],{"class":178},[173,476,423],{"class":194},[173,478,211],{"class":178},[173,480,428],{"class":194},[173,482,99],{"class":182},[173,484,219],{"class":194},[173,486,222],{"class":182},[173,488,205],{"class":178},[173,490,439],{"class":194},[173,492,230],{"class":182},[173,494,205],{"class":178},[173,496,446],{"class":194},[173,498,500],{"class":175,"line":499},12,[173,501,240],{"emptyLinePlaceholder":16},[173,503,505,507,509,511,514,516,519,521,523,525,527,530,532,534,536,538,540,542,544,546,548],{"class":175,"line":504},13,[173,506,179],{"class":178},[173,508,183],{"class":182},[173,510,186],{"class":178},[173,512,513],{"class":182},"indies",[173,515,186],{"class":178},[173,517,518],{"class":194},"working_days",[173,520,99],{"class":182},[173,522,169],{"class":194},[173,524,202],{"class":182},[173,526,205],{"class":178},[173,528,529],{"class":194},"6",[173,531,211],{"class":178},[173,533,271],{"class":194},[173,535,99],{"class":182},[173,537,219],{"class":194},[173,539,222],{"class":182},[173,541,205],{"class":178},[173,543,227],{"class":194},[173,545,230],{"class":182},[173,547,205],{"class":178},[173,549,550],{"class":194},"9\n",[173,552,554],{"class":175,"line":553},14,[173,555,240],{"emptyLinePlaceholder":16},[173,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599],{"class":175,"line":558},15,[173,560,246],{"class":178},[173,562,183],{"class":182},[173,564,186],{"class":178},[173,566,513],{"class":182},[173,568,186],{"class":178},[173,570,518],{"class":194},[173,572,99],{"class":182},[173,574,169],{"class":194},[173,576,202],{"class":182},[173,578,205],{"class":178},[173,580,529],{"class":194},[173,582,211],{"class":178},[173,584,271],{"class":194},[173,586,99],{"class":182},[173,588,219],{"class":194},[173,590,222],{"class":182},[173,592,205],{"class":178},[173,594,271],{"class":194},[173,596,230],{"class":182},[173,598,205],{"class":178},[173,600,340],{"class":194},[173,602,604],{"class":175,"line":603},16,[173,605,240],{"emptyLinePlaceholder":16},[173,607,609,612,614,616,618,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649],{"class":175,"line":608},17,[173,610,611],{"class":182},"ADDED silver",[173,613,186],{"class":178},[173,615,189],{"class":182},[173,617,186],{"class":178},[173,619,620],{"class":194},"silver_care_working_days",[173,622,99],{"class":182},[173,624,169],{"class":194},[173,626,202],{"class":182},[173,628,205],{"class":178},[173,630,208],{"class":194},[173,632,211],{"class":178},[173,634,439],{"class":194},[173,636,99],{"class":182},[173,638,219],{"class":194},[173,640,222],{"class":182},[173,642,205],{"class":178},[173,644,227],{"class":194},[173,646,230],{"class":182},[173,648,205],{"class":178},[173,650,651],{"class":194},"15\n",[173,653,655],{"class":175,"line":654},18,[173,656,240],{"emptyLinePlaceholder":16},[173,658,660],{"class":175,"line":659},19,[173,661,663],{"class":662},"sJ8bj","-- nb models before=380 after=381 diff=1\n",[173,665,667],{"class":175,"line":666},20,[173,668,669],{"class":662},"-- global complexity before=15305 after=15314 diff=9\n",[30,671,672],{},"Et voici le code du script :",[165,674,678],{"className":675,"code":676,"language":677,"meta":10,"style":10},"language-py shiki shiki-themes github-light github-dark","import argparse\nimport json\nimport re\nfrom collections import Counter, defaultdict\n\nTOKEN_COSTS = {\n    \"AND\": 0.1,\n    \"COALESCE\": 1,\n    \"DISTINCT\": 1,\n    \"GREATEST\": 1,\n    \"GROUP\": 1,\n    \"JOIN\": 1,\n    \"LAG\": 3,\n    \"LEAD\": 3,\n    \"LEAST\": 1,\n    \"OR\": 0.1,\n    \"ORDER\": 1,\n    \"PARTITION\": 3,\n    \"SELECT\": 1,\n    \"UNNEST\": 3,\n    \"WHEN\": 0.5,\n    \"WHERE\": 1,\n};\n\ndef raw_sql_complexity(raw_sql):\n    raw_sql = re.sub(r\"\\W+\", \" \", raw_sql)\n    token_counts = Counter([token.upper() for token in raw_sql.split()])\n    return sum(token_counts.get(token, 0) * cost for token, cost in TOKEN_COSTS.items())\n\ndef analyze_manifest(manifest_file, coupling_factor=1.15, min_columns=10, max_columns=30, select=\"\"):\n    with open(manifest_file) as fin:\n        manifest_data = json.load(fin)\n\n    data = {}\n    selected_models = {}\n\n    if select:\n        if select[0] == \"+\":\n            # If 'select' has a '+' sign, we need to find the direct dependencies of the selected model\n            for key, node in manifest_data[\"nodes\"].items():\n                if select[1:] == node[\"name\"]:\n                    selected_models = set(node[\"depends_on\"][\"nodes\"])\n                    selected_models.add(node[\"unique_id\"])\n        else:\n            # Otherwise, we just need to find the model with the given name\n            selected_models = {select}\n\n    for key, node in manifest_data[\"nodes\"].items():\n        if node[\"package_name\"] != \"geppetto_dbt\" or node[\"resource_type\"] != \"model\":\n            continue\n\n        if (\n            select\n            and selected_models\n            and node[\"unique_id\"] not in selected_models\n            and node[\"name\"] not in selected_models\n        ):\n            continue\n\n        node_data = {\n            \"path\": node[\"path\"],\n            \"nb_columns\": len(node[\"columns\"]),\n            \"sql_complexity\": raw_sql_complexity(node[\"raw_code\"]),\n            \"inputs\": set(node[\"depends_on\"][\"nodes\"]),\n            \"outputs\": set(),\n        }\n        data[key] = node_data\n\n    # compute outputs\n    for key, node in data.items():\n        for dep in node[\"inputs\"]:\n            if dep in data:\n                data[dep][\"outputs\"].add(dep)\n\n    # compute coupling and global\n    for node in data.values():\n        node[\"coupling\"] = len(node[\"inputs\"]) + len(node[\"outputs\"])\n        node[\"complexity\"] = (node[\"sql_complexity\"] + node[\"nb_columns\"]) * coupling_factor ** node[\"coupling\"]\n    return data\n\ndef print_manifest_complexity(data):\n    for node in sorted(data.values(), key=lambda node: node[\"complexity\"]):\n        print(\n            f\"{node['path']:50}\\tnb_columns={node['nb_columns']}\\tsql={node['sql_complexity']:.1f}\\tcoupling={node['coupling']}\\tcomplexity={round(node['complexity'])}\"\n        )\n\n    print(\"---\")\n    print(f\"nb models => {len(data)}\")\n    print(\n        f\"global complexity{' of ' + args.select if args.select else ''} => {round(sum(node['complexity'] for node in data.values()))}\"\n    )\n\ndef print_diff_complexity(data_from, data_to):\n    all_data = defaultdict(lambda: {\"from\": None, \"to\": None})\n    for node in data_from.values():\n        all_data[node[\"path\"]][\"from\"] = node\n    for node in data_to.values():\n        all_data[node[\"path\"]][\"to\"] = node\n\n    def print_node(prefix, node):\n        print(\n            f\"{prefix}\\t{node['path']:50}\\tnb_columns={node['nb_columns']}\\tsql={node['sql_complexity']:.1f}\\tcoupling={node['coupling']}\\tcomplexity={round(node['complexity'])}\"\n        )\n\n    has_diff = False\n    for diff_nodes in all_data.values():\n        node_from, node_to = diff_nodes[\"from\"], diff_nodes[\"to\"]\n        if node_from == node_to:\n            continue\n        elif node_from is None:\n            print_node(\"ADDED\", node_to)\n        elif node_to is None:\n            print_node(\"DELETED\", node_from)\n        else:\n            print_node(\"BEFORE\", node_from)\n            print_node(\"AFTER\", node_to)\n        has_diff = True\n\n    if not has_diff:\n        print(\"No change on model DBT complexity\")\n    else:\n        print(\"---\")\n        print(f\"nb models before={len(data_from)} after={len(data_to)} diff={len(data_to) - len(data_from)}\")\n        global_before = round(sum(node[\"complexity\"] for node in data_from.values()))\n        global_after = round(sum(node[\"complexity\"] for node in data_to.values()))\n        print(f\"global complexity before={global_before} after={global_after} diff={global_after - global_before}\")\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        description=\"Analyze DBT project manifest and produce a complexity report\",\n    )\n    parser.add_argument(\"manifest\")\n    parser.add_argument(\"--coupling-factor\", type=float, default=1.15)\n    parser.add_argument(\"--min-columns\", type=int, default=10)\n    parser.add_argument(\"--max-columns\", type=int, default=30)\n    parser.add_argument(\"--select\", type=str, default=\"\")\n    parser.add_argument(\"--diff-from-manifest\", default=None, help=\"Print diff with this manifest\")\n    args = parser.parse_args()\n\n    if args.diff_from_manifest is not None:\n        data_from = analyze_manifest(\n            args.diff_from_manifest,\n            coupling_factor=args.coupling_factor,\n            min_columns=args.min_columns,\n            max_columns=args.max_columns,\n        )\n        data_to = analyze_manifest(\n            args.manifest,\n            coupling_factor=args.coupling_factor,\n            min_columns=args.min_columns,\n            max_columns=args.max_columns,\n        )\n        print_diff_complexity(data_from, data_to)\n    else:\n        data = analyze_manifest(\n            args.manifest,\n            coupling_factor=args.coupling_factor,\n            min_columns=args.min_columns,\n            max_columns=args.max_columns,\n            select=args.select,\n        )\n        print_manifest_complexity(data)\n","py",[42,679,680,688,695,702,715,719,730,745,756,767,778,789,800,811,822,833,844,855,866,877,888,901,913,923,928,941,975,998,1034,1039,1081,1099,1110,1115,1126,1136,1141,1150,1173,1179,1199,1223,1248,1259,1267,1273,1284,1289,1305,1340,1346,1351,1359,1365,1374,1393,1410,1416,1421,1426,1436,1451,1470,1484,1505,1518,1524,1535,1540,1546,1558,1576,1589,1601,1606,1612,1625,1658,1702,1710,1715,1726,1756,1765,1855,1861,1866,1881,1906,1913,1975,1981,1986,1997,2034,2046,2066,2078,2095,2100,2112,2119,2196,2201,2206,2217,2230,2250,2263,2268,2284,2296,2310,2321,2328,2338,2348,2359,2364,2375,2387,2395,2406,2456,2486,2515,2561,2566,2582,2593,2606,2611,2622,2651,2678,2704,2731,2759,2770,2775,2791,2802,2808,2819,2830,2841,2846,2856,2862,2871,2880,2889,2894,2900,2907,2917,2922,2931,2940,2949,2960,2965],{"__ignoreMap":10},[173,681,682,685],{"class":175,"line":18},[173,683,684],{"class":178},"import",[173,686,687],{"class":182}," argparse\n",[173,689,690,692],{"class":175,"line":11},[173,691,684],{"class":178},[173,693,694],{"class":182}," json\n",[173,696,697,699],{"class":175,"line":243},[173,698,684],{"class":178},[173,700,701],{"class":182}," re\n",[173,703,704,707,710,712],{"class":175,"line":291},[173,705,706],{"class":178},"from",[173,708,709],{"class":182}," collections ",[173,711,684],{"class":178},[173,713,714],{"class":182}," Counter, defaultdict\n",[173,716,717],{"class":175,"line":296},[173,718,240],{"emptyLinePlaceholder":16},[173,720,721,724,727],{"class":175,"line":343},[173,722,723],{"class":194},"TOKEN_COSTS",[173,725,726],{"class":178}," =",[173,728,729],{"class":182}," {\n",[173,731,732,736,739,742],{"class":175,"line":348},[173,733,735],{"class":734},"sZZnC","    \"AND\"",[173,737,738],{"class":182},": ",[173,740,741],{"class":194},"0.1",[173,743,744],{"class":182},",\n",[173,746,747,750,752,754],{"class":175,"line":393},[173,748,749],{"class":734},"    \"COALESCE\"",[173,751,738],{"class":182},[173,753,271],{"class":194},[173,755,744],{"class":182},[173,757,758,761,763,765],{"class":175,"line":398},[173,759,760],{"class":734},"    \"DISTINCT\"",[173,762,738],{"class":182},[173,764,271],{"class":194},[173,766,744],{"class":182},[173,768,769,772,774,776],{"class":175,"line":449},[173,770,771],{"class":734},"    \"GREATEST\"",[173,773,738],{"class":182},[173,775,271],{"class":194},[173,777,744],{"class":182},[173,779,780,783,785,787],{"class":175,"line":454},[173,781,782],{"class":734},"    \"GROUP\"",[173,784,738],{"class":182},[173,786,271],{"class":194},[173,788,744],{"class":182},[173,790,791,794,796,798],{"class":175,"line":499},[173,792,793],{"class":734},"    \"JOIN\"",[173,795,738],{"class":182},[173,797,271],{"class":194},[173,799,744],{"class":182},[173,801,802,805,807,809],{"class":175,"line":504},[173,803,804],{"class":734},"    \"LAG\"",[173,806,738],{"class":182},[173,808,439],{"class":194},[173,810,744],{"class":182},[173,812,813,816,818,820],{"class":175,"line":553},[173,814,815],{"class":734},"    \"LEAD\"",[173,817,738],{"class":182},[173,819,439],{"class":194},[173,821,744],{"class":182},[173,823,824,827,829,831],{"class":175,"line":558},[173,825,826],{"class":734},"    \"LEAST\"",[173,828,738],{"class":182},[173,830,271],{"class":194},[173,832,744],{"class":182},[173,834,835,838,840,842],{"class":175,"line":603},[173,836,837],{"class":734},"    \"OR\"",[173,839,738],{"class":182},[173,841,741],{"class":194},[173,843,744],{"class":182},[173,845,846,849,851,853],{"class":175,"line":608},[173,847,848],{"class":734},"    \"ORDER\"",[173,850,738],{"class":182},[173,852,271],{"class":194},[173,854,744],{"class":182},[173,856,857,860,862,864],{"class":175,"line":654},[173,858,859],{"class":734},"    \"PARTITION\"",[173,861,738],{"class":182},[173,863,439],{"class":194},[173,865,744],{"class":182},[173,867,868,871,873,875],{"class":175,"line":659},[173,869,870],{"class":734},"    \"SELECT\"",[173,872,738],{"class":182},[173,874,271],{"class":194},[173,876,744],{"class":182},[173,878,879,882,884,886],{"class":175,"line":666},[173,880,881],{"class":734},"    \"UNNEST\"",[173,883,738],{"class":182},[173,885,439],{"class":194},[173,887,744],{"class":182},[173,889,891,894,896,899],{"class":175,"line":890},21,[173,892,893],{"class":734},"    \"WHEN\"",[173,895,738],{"class":182},[173,897,898],{"class":194},"0.5",[173,900,744],{"class":182},[173,902,904,907,909,911],{"class":175,"line":903},22,[173,905,906],{"class":734},"    \"WHERE\"",[173,908,738],{"class":182},[173,910,271],{"class":194},[173,912,744],{"class":182},[173,914,916,919],{"class":175,"line":915},23,[173,917,918],{"class":182},"}",[173,920,922],{"class":921},"s7hpK",";\n",[173,924,926],{"class":175,"line":925},24,[173,927,240],{"emptyLinePlaceholder":16},[173,929,931,934,938],{"class":175,"line":930},25,[173,932,933],{"class":178},"def",[173,935,937],{"class":936},"sScJk"," raw_sql_complexity",[173,939,940],{"class":182},"(raw_sql):\n",[173,942,944,947,949,952,955,958,961,964,966,969,972],{"class":175,"line":943},26,[173,945,946],{"class":182},"    raw_sql ",[173,948,205],{"class":178},[173,950,951],{"class":182}," re.sub(",[173,953,954],{"class":178},"r",[173,956,957],{"class":734},"\"",[173,959,960],{"class":194},"\\W",[173,962,963],{"class":178},"+",[173,965,957],{"class":734},[173,967,968],{"class":182},", ",[173,970,971],{"class":734},"\" \"",[173,973,974],{"class":182},", raw_sql)\n",[173,976,978,981,983,986,989,992,995],{"class":175,"line":977},27,[173,979,980],{"class":182},"    token_counts ",[173,982,205],{"class":178},[173,984,985],{"class":182}," Counter([token.upper() ",[173,987,988],{"class":178},"for",[173,990,991],{"class":182}," token ",[173,993,994],{"class":178},"in",[173,996,997],{"class":182}," raw_sql.split()])\n",[173,999,1001,1004,1007,1010,1012,1015,1018,1021,1023,1026,1028,1031],{"class":175,"line":1000},28,[173,1002,1003],{"class":178},"    return",[173,1005,1006],{"class":194}," sum",[173,1008,1009],{"class":182},"(token_counts.get(token, ",[173,1011,219],{"class":194},[173,1013,1014],{"class":182},") ",[173,1016,1017],{"class":178},"*",[173,1019,1020],{"class":182}," cost ",[173,1022,988],{"class":178},[173,1024,1025],{"class":182}," token, cost ",[173,1027,994],{"class":178},[173,1029,1030],{"class":194}," TOKEN_COSTS",[173,1032,1033],{"class":182},".items())\n",[173,1035,1037],{"class":175,"line":1036},29,[173,1038,240],{"emptyLinePlaceholder":16},[173,1040,1042,1044,1047,1050,1052,1055,1058,1060,1062,1065,1067,1070,1073,1075,1078],{"class":175,"line":1041},30,[173,1043,933],{"class":178},[173,1045,1046],{"class":936}," analyze_manifest",[173,1048,1049],{"class":182},"(manifest_file, coupling_factor",[173,1051,205],{"class":178},[173,1053,1054],{"class":194},"1.15",[173,1056,1057],{"class":182},", min_columns",[173,1059,205],{"class":178},[173,1061,423],{"class":194},[173,1063,1064],{"class":182},", max_columns",[173,1066,205],{"class":178},[173,1068,1069],{"class":194},"30",[173,1071,1072],{"class":182},", select",[173,1074,205],{"class":178},[173,1076,1077],{"class":734},"\"\"",[173,1079,1080],{"class":182},"):\n",[173,1082,1084,1087,1090,1093,1096],{"class":175,"line":1083},31,[173,1085,1086],{"class":178},"    with",[173,1088,1089],{"class":194}," open",[173,1091,1092],{"class":182},"(manifest_file) ",[173,1094,1095],{"class":178},"as",[173,1097,1098],{"class":182}," fin:\n",[173,1100,1102,1105,1107],{"class":175,"line":1101},32,[173,1103,1104],{"class":182},"        manifest_data ",[173,1106,205],{"class":178},[173,1108,1109],{"class":182}," json.load(fin)\n",[173,1111,1113],{"class":175,"line":1112},33,[173,1114,240],{"emptyLinePlaceholder":16},[173,1116,1118,1121,1123],{"class":175,"line":1117},34,[173,1119,1120],{"class":182},"    data ",[173,1122,205],{"class":178},[173,1124,1125],{"class":182}," {}\n",[173,1127,1129,1132,1134],{"class":175,"line":1128},35,[173,1130,1131],{"class":182},"    selected_models ",[173,1133,205],{"class":178},[173,1135,1125],{"class":182},[173,1137,1139],{"class":175,"line":1138},36,[173,1140,240],{"emptyLinePlaceholder":16},[173,1142,1144,1147],{"class":175,"line":1143},37,[173,1145,1146],{"class":178},"    if",[173,1148,1149],{"class":182}," select:\n",[173,1151,1153,1156,1159,1161,1164,1167,1170],{"class":175,"line":1152},38,[173,1154,1155],{"class":178},"        if",[173,1157,1158],{"class":182}," select[",[173,1160,219],{"class":194},[173,1162,1163],{"class":182},"] ",[173,1165,1166],{"class":178},"==",[173,1168,1169],{"class":734}," \"+\"",[173,1171,1172],{"class":182},":\n",[173,1174,1176],{"class":175,"line":1175},39,[173,1177,1178],{"class":662},"            # If 'select' has a '+' sign, we need to find the direct dependencies of the selected model\n",[173,1180,1182,1185,1188,1190,1193,1196],{"class":175,"line":1181},40,[173,1183,1184],{"class":178},"            for",[173,1186,1187],{"class":182}," key, node ",[173,1189,994],{"class":178},[173,1191,1192],{"class":182}," manifest_data[",[173,1194,1195],{"class":734},"\"nodes\"",[173,1197,1198],{"class":182},"].items():\n",[173,1200,1202,1205,1207,1209,1212,1214,1217,1220],{"class":175,"line":1201},41,[173,1203,1204],{"class":178},"                if",[173,1206,1158],{"class":182},[173,1208,271],{"class":194},[173,1210,1211],{"class":182},":] ",[173,1213,1166],{"class":178},[173,1215,1216],{"class":182}," node[",[173,1218,1219],{"class":734},"\"name\"",[173,1221,1222],{"class":182},"]:\n",[173,1224,1226,1229,1231,1234,1237,1240,1243,1245],{"class":175,"line":1225},42,[173,1227,1228],{"class":182},"                    selected_models ",[173,1230,205],{"class":178},[173,1232,1233],{"class":194}," set",[173,1235,1236],{"class":182},"(node[",[173,1238,1239],{"class":734},"\"depends_on\"",[173,1241,1242],{"class":182},"][",[173,1244,1195],{"class":734},[173,1246,1247],{"class":182},"])\n",[173,1249,1251,1254,1257],{"class":175,"line":1250},43,[173,1252,1253],{"class":182},"                    selected_models.add(node[",[173,1255,1256],{"class":734},"\"unique_id\"",[173,1258,1247],{"class":182},[173,1260,1262,1265],{"class":175,"line":1261},44,[173,1263,1264],{"class":178},"        else",[173,1266,1172],{"class":182},[173,1268,1270],{"class":175,"line":1269},45,[173,1271,1272],{"class":662},"            # Otherwise, we just need to find the model with the given name\n",[173,1274,1276,1279,1281],{"class":175,"line":1275},46,[173,1277,1278],{"class":182},"            selected_models ",[173,1280,205],{"class":178},[173,1282,1283],{"class":182}," {select}\n",[173,1285,1287],{"class":175,"line":1286},47,[173,1288,240],{"emptyLinePlaceholder":16},[173,1290,1292,1295,1297,1299,1301,1303],{"class":175,"line":1291},48,[173,1293,1294],{"class":178},"    for",[173,1296,1187],{"class":182},[173,1298,994],{"class":178},[173,1300,1192],{"class":182},[173,1302,1195],{"class":734},[173,1304,1198],{"class":182},[173,1306,1308,1310,1312,1315,1317,1320,1323,1326,1328,1331,1333,1335,1338],{"class":175,"line":1307},49,[173,1309,1155],{"class":178},[173,1311,1216],{"class":182},[173,1313,1314],{"class":734},"\"package_name\"",[173,1316,1163],{"class":182},[173,1318,1319],{"class":178},"!=",[173,1321,1322],{"class":734}," \"geppetto_dbt\"",[173,1324,1325],{"class":178}," or",[173,1327,1216],{"class":182},[173,1329,1330],{"class":734},"\"resource_type\"",[173,1332,1163],{"class":182},[173,1334,1319],{"class":178},[173,1336,1337],{"class":734}," \"model\"",[173,1339,1172],{"class":182},[173,1341,1343],{"class":175,"line":1342},50,[173,1344,1345],{"class":178},"            continue\n",[173,1347,1349],{"class":175,"line":1348},51,[173,1350,240],{"emptyLinePlaceholder":16},[173,1352,1354,1356],{"class":175,"line":1353},52,[173,1355,1155],{"class":178},[173,1357,1358],{"class":182}," (\n",[173,1360,1362],{"class":175,"line":1361},53,[173,1363,1364],{"class":182},"            select\n",[173,1366,1368,1371],{"class":175,"line":1367},54,[173,1369,1370],{"class":178},"            and",[173,1372,1373],{"class":182}," selected_models\n",[173,1375,1377,1379,1381,1383,1385,1388,1391],{"class":175,"line":1376},55,[173,1378,1370],{"class":178},[173,1380,1216],{"class":182},[173,1382,1256],{"class":734},[173,1384,1163],{"class":182},[173,1386,1387],{"class":178},"not",[173,1389,1390],{"class":178}," in",[173,1392,1373],{"class":182},[173,1394,1396,1398,1400,1402,1404,1406,1408],{"class":175,"line":1395},56,[173,1397,1370],{"class":178},[173,1399,1216],{"class":182},[173,1401,1219],{"class":734},[173,1403,1163],{"class":182},[173,1405,1387],{"class":178},[173,1407,1390],{"class":178},[173,1409,1373],{"class":182},[173,1411,1413],{"class":175,"line":1412},57,[173,1414,1415],{"class":182},"        ):\n",[173,1417,1419],{"class":175,"line":1418},58,[173,1420,1345],{"class":178},[173,1422,1424],{"class":175,"line":1423},59,[173,1425,240],{"emptyLinePlaceholder":16},[173,1427,1429,1432,1434],{"class":175,"line":1428},60,[173,1430,1431],{"class":182},"        node_data ",[173,1433,205],{"class":178},[173,1435,729],{"class":182},[173,1437,1439,1442,1445,1448],{"class":175,"line":1438},61,[173,1440,1441],{"class":734},"            \"path\"",[173,1443,1444],{"class":182},": node[",[173,1446,1447],{"class":734},"\"path\"",[173,1449,1450],{"class":182},"],\n",[173,1452,1454,1457,1459,1462,1464,1467],{"class":175,"line":1453},62,[173,1455,1456],{"class":734},"            \"nb_columns\"",[173,1458,738],{"class":182},[173,1460,1461],{"class":194},"len",[173,1463,1236],{"class":182},[173,1465,1466],{"class":734},"\"columns\"",[173,1468,1469],{"class":182},"]),\n",[173,1471,1473,1476,1479,1482],{"class":175,"line":1472},63,[173,1474,1475],{"class":734},"            \"sql_complexity\"",[173,1477,1478],{"class":182},": raw_sql_complexity(node[",[173,1480,1481],{"class":734},"\"raw_code\"",[173,1483,1469],{"class":182},[173,1485,1487,1490,1492,1495,1497,1499,1501,1503],{"class":175,"line":1486},64,[173,1488,1489],{"class":734},"            \"inputs\"",[173,1491,738],{"class":182},[173,1493,1494],{"class":194},"set",[173,1496,1236],{"class":182},[173,1498,1239],{"class":734},[173,1500,1242],{"class":182},[173,1502,1195],{"class":734},[173,1504,1469],{"class":182},[173,1506,1508,1511,1513,1515],{"class":175,"line":1507},65,[173,1509,1510],{"class":734},"            \"outputs\"",[173,1512,738],{"class":182},[173,1514,1494],{"class":194},[173,1516,1517],{"class":182},"(),\n",[173,1519,1521],{"class":175,"line":1520},66,[173,1522,1523],{"class":182},"        }\n",[173,1525,1527,1530,1532],{"class":175,"line":1526},67,[173,1528,1529],{"class":182},"        data[key] ",[173,1531,205],{"class":178},[173,1533,1534],{"class":182}," node_data\n",[173,1536,1538],{"class":175,"line":1537},68,[173,1539,240],{"emptyLinePlaceholder":16},[173,1541,1543],{"class":175,"line":1542},69,[173,1544,1545],{"class":662},"    # compute outputs\n",[173,1547,1549,1551,1553,1555],{"class":175,"line":1548},70,[173,1550,1294],{"class":178},[173,1552,1187],{"class":182},[173,1554,994],{"class":178},[173,1556,1557],{"class":182}," data.items():\n",[173,1559,1561,1564,1567,1569,1571,1574],{"class":175,"line":1560},71,[173,1562,1563],{"class":178},"        for",[173,1565,1566],{"class":182}," dep ",[173,1568,994],{"class":178},[173,1570,1216],{"class":182},[173,1572,1573],{"class":734},"\"inputs\"",[173,1575,1222],{"class":182},[173,1577,1579,1582,1584,1586],{"class":175,"line":1578},72,[173,1580,1581],{"class":178},"            if",[173,1583,1566],{"class":182},[173,1585,994],{"class":178},[173,1587,1588],{"class":182}," data:\n",[173,1590,1592,1595,1598],{"class":175,"line":1591},73,[173,1593,1594],{"class":182},"                data[dep][",[173,1596,1597],{"class":734},"\"outputs\"",[173,1599,1600],{"class":182},"].add(dep)\n",[173,1602,1604],{"class":175,"line":1603},74,[173,1605,240],{"emptyLinePlaceholder":16},[173,1607,1609],{"class":175,"line":1608},75,[173,1610,1611],{"class":662},"    # compute coupling and global\n",[173,1613,1615,1617,1620,1622],{"class":175,"line":1614},76,[173,1616,1294],{"class":178},[173,1618,1619],{"class":182}," node ",[173,1621,994],{"class":178},[173,1623,1624],{"class":182}," data.values():\n",[173,1626,1628,1631,1634,1636,1638,1641,1643,1645,1648,1650,1652,1654,1656],{"class":175,"line":1627},77,[173,1629,1630],{"class":182},"        node[",[173,1632,1633],{"class":734},"\"coupling\"",[173,1635,1163],{"class":182},[173,1637,205],{"class":178},[173,1639,1640],{"class":194}," len",[173,1642,1236],{"class":182},[173,1644,1573],{"class":734},[173,1646,1647],{"class":182},"]) ",[173,1649,963],{"class":178},[173,1651,1640],{"class":194},[173,1653,1236],{"class":182},[173,1655,1597],{"class":734},[173,1657,1247],{"class":182},[173,1659,1661,1663,1666,1668,1670,1673,1676,1678,1680,1682,1685,1687,1689,1692,1695,1697,1699],{"class":175,"line":1660},78,[173,1662,1630],{"class":182},[173,1664,1665],{"class":734},"\"complexity\"",[173,1667,1163],{"class":182},[173,1669,205],{"class":178},[173,1671,1672],{"class":182}," (node[",[173,1674,1675],{"class":734},"\"sql_complexity\"",[173,1677,1163],{"class":182},[173,1679,963],{"class":178},[173,1681,1216],{"class":182},[173,1683,1684],{"class":734},"\"nb_columns\"",[173,1686,1647],{"class":182},[173,1688,1017],{"class":178},[173,1690,1691],{"class":182}," coupling_factor ",[173,1693,1694],{"class":178},"**",[173,1696,1216],{"class":182},[173,1698,1633],{"class":734},[173,1700,1701],{"class":182},"]\n",[173,1703,1705,1707],{"class":175,"line":1704},79,[173,1706,1003],{"class":178},[173,1708,1709],{"class":182}," data\n",[173,1711,1713],{"class":175,"line":1712},80,[173,1714,240],{"emptyLinePlaceholder":16},[173,1716,1718,1720,1723],{"class":175,"line":1717},81,[173,1719,933],{"class":178},[173,1721,1722],{"class":936}," print_manifest_complexity",[173,1724,1725],{"class":182},"(data):\n",[173,1727,1729,1731,1733,1735,1738,1741,1745,1748,1751,1753],{"class":175,"line":1728},82,[173,1730,1294],{"class":178},[173,1732,1619],{"class":182},[173,1734,994],{"class":178},[173,1736,1737],{"class":194}," sorted",[173,1739,1740],{"class":182},"(data.values(), ",[173,1742,1744],{"class":1743},"s4XuR","key",[173,1746,1747],{"class":178},"=lambda",[173,1749,1750],{"class":182}," node: node[",[173,1752,1665],{"class":734},[173,1754,1755],{"class":182},"]):\n",[173,1757,1759,1762],{"class":175,"line":1758},83,[173,1760,1761],{"class":194},"        print",[173,1763,1764],{"class":182},"(\n",[173,1766,1768,1771,1773,1776,1779,1782,1785,1788,1791,1794,1796,1798,1801,1803,1805,1808,1810,1812,1815,1817,1820,1822,1825,1827,1829,1832,1834,1836,1839,1842,1844,1847,1850,1852],{"class":175,"line":1767},84,[173,1769,1770],{"class":178},"            f",[173,1772,957],{"class":734},[173,1774,1775],{"class":194},"{",[173,1777,1778],{"class":182},"node[",[173,1780,1781],{"class":734},"'path'",[173,1783,1784],{"class":182},"]",[173,1786,1787],{"class":178},":50",[173,1789,1790],{"class":194},"}\\t",[173,1792,1793],{"class":734},"nb_columns=",[173,1795,1775],{"class":194},[173,1797,1778],{"class":182},[173,1799,1800],{"class":734},"'nb_columns'",[173,1802,1784],{"class":182},[173,1804,1790],{"class":194},[173,1806,1807],{"class":734},"sql=",[173,1809,1775],{"class":194},[173,1811,1778],{"class":182},[173,1813,1814],{"class":734},"'sql_complexity'",[173,1816,1784],{"class":182},[173,1818,1819],{"class":178},":.1f",[173,1821,1790],{"class":194},[173,1823,1824],{"class":734},"coupling=",[173,1826,1775],{"class":194},[173,1828,1778],{"class":182},[173,1830,1831],{"class":734},"'coupling'",[173,1833,1784],{"class":182},[173,1835,1790],{"class":194},[173,1837,1838],{"class":734},"complexity=",[173,1840,1841],{"class":194},"{round",[173,1843,1236],{"class":182},[173,1845,1846],{"class":734},"'complexity'",[173,1848,1849],{"class":182},"])",[173,1851,918],{"class":194},[173,1853,1854],{"class":734},"\"\n",[173,1856,1858],{"class":175,"line":1857},85,[173,1859,1860],{"class":182},"        )\n",[173,1862,1864],{"class":175,"line":1863},86,[173,1865,240],{"emptyLinePlaceholder":16},[173,1867,1869,1872,1875,1878],{"class":175,"line":1868},87,[173,1870,1871],{"class":194},"    print",[173,1873,1874],{"class":182},"(",[173,1876,1877],{"class":734},"\"---\"",[173,1879,1880],{"class":182},")\n",[173,1882,1884,1886,1888,1891,1894,1897,1900,1902,1904],{"class":175,"line":1883},88,[173,1885,1871],{"class":194},[173,1887,1874],{"class":182},[173,1889,1890],{"class":178},"f",[173,1892,1893],{"class":734},"\"nb models => ",[173,1895,1896],{"class":194},"{len",[173,1898,1899],{"class":182},"(data)",[173,1901,918],{"class":194},[173,1903,957],{"class":734},[173,1905,1880],{"class":182},[173,1907,1909,1911],{"class":175,"line":1908},89,[173,1910,1871],{"class":194},[173,1912,1764],{"class":182},[173,1914,1916,1919,1922,1924,1927,1930,1933,1936,1938,1941,1944,1946,1949,1951,1953,1956,1958,1960,1962,1964,1966,1968,1971,1973],{"class":175,"line":1915},90,[173,1917,1918],{"class":178},"        f",[173,1920,1921],{"class":734},"\"global complexity",[173,1923,1775],{"class":194},[173,1925,1926],{"class":734},"' of '",[173,1928,1929],{"class":178}," +",[173,1931,1932],{"class":182}," args.select ",[173,1934,1935],{"class":178},"if",[173,1937,1932],{"class":182},[173,1939,1940],{"class":178},"else",[173,1942,1943],{"class":734}," ''",[173,1945,918],{"class":194},[173,1947,1948],{"class":734}," => ",[173,1950,1841],{"class":194},[173,1952,1874],{"class":182},[173,1954,1955],{"class":194},"sum",[173,1957,1236],{"class":182},[173,1959,1846],{"class":734},[173,1961,1163],{"class":182},[173,1963,988],{"class":178},[173,1965,1619],{"class":182},[173,1967,994],{"class":178},[173,1969,1970],{"class":182}," data.values()))",[173,1972,918],{"class":194},[173,1974,1854],{"class":734},[173,1976,1978],{"class":175,"line":1977},91,[173,1979,1980],{"class":182},"    )\n",[173,1982,1984],{"class":175,"line":1983},92,[173,1985,240],{"emptyLinePlaceholder":16},[173,1987,1989,1991,1994],{"class":175,"line":1988},93,[173,1990,933],{"class":178},[173,1992,1993],{"class":936}," print_diff_complexity",[173,1995,1996],{"class":182},"(data_from, data_to):\n",[173,1998,2000,2003,2005,2008,2011,2014,2017,2019,2022,2024,2027,2029,2031],{"class":175,"line":1999},94,[173,2001,2002],{"class":182},"    all_data ",[173,2004,205],{"class":178},[173,2006,2007],{"class":182}," defaultdict(",[173,2009,2010],{"class":178},"lambda",[173,2012,2013],{"class":182},": {",[173,2015,2016],{"class":734},"\"from\"",[173,2018,738],{"class":182},[173,2020,2021],{"class":194},"None",[173,2023,968],{"class":182},[173,2025,2026],{"class":734},"\"to\"",[173,2028,738],{"class":182},[173,2030,2021],{"class":194},[173,2032,2033],{"class":182},"})\n",[173,2035,2037,2039,2041,2043],{"class":175,"line":2036},95,[173,2038,1294],{"class":178},[173,2040,1619],{"class":182},[173,2042,994],{"class":178},[173,2044,2045],{"class":182}," data_from.values():\n",[173,2047,2049,2052,2054,2057,2059,2061,2063],{"class":175,"line":2048},96,[173,2050,2051],{"class":182},"        all_data[node[",[173,2053,1447],{"class":734},[173,2055,2056],{"class":182},"]][",[173,2058,2016],{"class":734},[173,2060,1163],{"class":182},[173,2062,205],{"class":178},[173,2064,2065],{"class":182}," node\n",[173,2067,2069,2071,2073,2075],{"class":175,"line":2068},97,[173,2070,1294],{"class":178},[173,2072,1619],{"class":182},[173,2074,994],{"class":178},[173,2076,2077],{"class":182}," data_to.values():\n",[173,2079,2081,2083,2085,2087,2089,2091,2093],{"class":175,"line":2080},98,[173,2082,2051],{"class":182},[173,2084,1447],{"class":734},[173,2086,2056],{"class":182},[173,2088,2026],{"class":734},[173,2090,1163],{"class":182},[173,2092,205],{"class":178},[173,2094,2065],{"class":182},[173,2096,2098],{"class":175,"line":2097},99,[173,2099,240],{"emptyLinePlaceholder":16},[173,2101,2103,2106,2109],{"class":175,"line":2102},100,[173,2104,2105],{"class":178},"    def",[173,2107,2108],{"class":936}," print_node",[173,2110,2111],{"class":182},"(prefix, node):\n",[173,2113,2115,2117],{"class":175,"line":2114},101,[173,2116,1761],{"class":194},[173,2118,1764],{"class":182},[173,2120,2122,2124,2126,2128,2131,2134,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194],{"class":175,"line":2121},102,[173,2123,1770],{"class":178},[173,2125,957],{"class":734},[173,2127,1775],{"class":194},[173,2129,2130],{"class":182},"prefix",[173,2132,2133],{"class":194},"}\\t{",[173,2135,1778],{"class":182},[173,2137,1781],{"class":734},[173,2139,1784],{"class":182},[173,2141,1787],{"class":178},[173,2143,1790],{"class":194},[173,2145,1793],{"class":734},[173,2147,1775],{"class":194},[173,2149,1778],{"class":182},[173,2151,1800],{"class":734},[173,2153,1784],{"class":182},[173,2155,1790],{"class":194},[173,2157,1807],{"class":734},[173,2159,1775],{"class":194},[173,2161,1778],{"class":182},[173,2163,1814],{"class":734},[173,2165,1784],{"class":182},[173,2167,1819],{"class":178},[173,2169,1790],{"class":194},[173,2171,1824],{"class":734},[173,2173,1775],{"class":194},[173,2175,1778],{"class":182},[173,2177,1831],{"class":734},[173,2179,1784],{"class":182},[173,2181,1790],{"class":194},[173,2183,1838],{"class":734},[173,2185,1841],{"class":194},[173,2187,1236],{"class":182},[173,2189,1846],{"class":734},[173,2191,1849],{"class":182},[173,2193,918],{"class":194},[173,2195,1854],{"class":734},[173,2197,2199],{"class":175,"line":2198},103,[173,2200,1860],{"class":182},[173,2202,2204],{"class":175,"line":2203},104,[173,2205,240],{"emptyLinePlaceholder":16},[173,2207,2209,2212,2214],{"class":175,"line":2208},105,[173,2210,2211],{"class":182},"    has_diff ",[173,2213,205],{"class":178},[173,2215,2216],{"class":194}," False\n",[173,2218,2220,2222,2225,2227],{"class":175,"line":2219},106,[173,2221,1294],{"class":178},[173,2223,2224],{"class":182}," diff_nodes ",[173,2226,994],{"class":178},[173,2228,2229],{"class":182}," all_data.values():\n",[173,2231,2233,2236,2238,2241,2243,2246,2248],{"class":175,"line":2232},107,[173,2234,2235],{"class":182},"        node_from, node_to ",[173,2237,205],{"class":178},[173,2239,2240],{"class":182}," diff_nodes[",[173,2242,2016],{"class":734},[173,2244,2245],{"class":182},"], diff_nodes[",[173,2247,2026],{"class":734},[173,2249,1701],{"class":182},[173,2251,2253,2255,2258,2260],{"class":175,"line":2252},108,[173,2254,1155],{"class":178},[173,2256,2257],{"class":182}," node_from ",[173,2259,1166],{"class":178},[173,2261,2262],{"class":182}," node_to:\n",[173,2264,2266],{"class":175,"line":2265},109,[173,2267,1345],{"class":178},[173,2269,2271,2274,2276,2279,2282],{"class":175,"line":2270},110,[173,2272,2273],{"class":178},"        elif",[173,2275,2257],{"class":182},[173,2277,2278],{"class":178},"is",[173,2280,2281],{"class":194}," None",[173,2283,1172],{"class":182},[173,2285,2287,2290,2293],{"class":175,"line":2286},111,[173,2288,2289],{"class":182},"            print_node(",[173,2291,2292],{"class":734},"\"ADDED\"",[173,2294,2295],{"class":182},", node_to)\n",[173,2297,2299,2301,2304,2306,2308],{"class":175,"line":2298},112,[173,2300,2273],{"class":178},[173,2302,2303],{"class":182}," node_to ",[173,2305,2278],{"class":178},[173,2307,2281],{"class":194},[173,2309,1172],{"class":182},[173,2311,2313,2315,2318],{"class":175,"line":2312},113,[173,2314,2289],{"class":182},[173,2316,2317],{"class":734},"\"DELETED\"",[173,2319,2320],{"class":182},", node_from)\n",[173,2322,2324,2326],{"class":175,"line":2323},114,[173,2325,1264],{"class":178},[173,2327,1172],{"class":182},[173,2329,2331,2333,2336],{"class":175,"line":2330},115,[173,2332,2289],{"class":182},[173,2334,2335],{"class":734},"\"BEFORE\"",[173,2337,2320],{"class":182},[173,2339,2341,2343,2346],{"class":175,"line":2340},116,[173,2342,2289],{"class":182},[173,2344,2345],{"class":734},"\"AFTER\"",[173,2347,2295],{"class":182},[173,2349,2351,2354,2356],{"class":175,"line":2350},117,[173,2352,2353],{"class":182},"        has_diff ",[173,2355,205],{"class":178},[173,2357,2358],{"class":194}," True\n",[173,2360,2362],{"class":175,"line":2361},118,[173,2363,240],{"emptyLinePlaceholder":16},[173,2365,2367,2369,2372],{"class":175,"line":2366},119,[173,2368,1146],{"class":178},[173,2370,2371],{"class":178}," not",[173,2373,2374],{"class":182}," has_diff:\n",[173,2376,2378,2380,2382,2385],{"class":175,"line":2377},120,[173,2379,1761],{"class":194},[173,2381,1874],{"class":182},[173,2383,2384],{"class":734},"\"No change on model DBT complexity\"",[173,2386,1880],{"class":182},[173,2388,2390,2393],{"class":175,"line":2389},121,[173,2391,2392],{"class":178},"    else",[173,2394,1172],{"class":182},[173,2396,2398,2400,2402,2404],{"class":175,"line":2397},122,[173,2399,1761],{"class":194},[173,2401,1874],{"class":182},[173,2403,1877],{"class":734},[173,2405,1880],{"class":182},[173,2407,2409,2411,2413,2415,2418,2420,2423,2425,2428,2430,2433,2435,2438,2440,2443,2446,2448,2450,2452,2454],{"class":175,"line":2408},123,[173,2410,1761],{"class":194},[173,2412,1874],{"class":182},[173,2414,1890],{"class":178},[173,2416,2417],{"class":734},"\"nb models before=",[173,2419,1896],{"class":194},[173,2421,2422],{"class":182},"(data_from)",[173,2424,918],{"class":194},[173,2426,2427],{"class":734}," after=",[173,2429,1896],{"class":194},[173,2431,2432],{"class":182},"(data_to)",[173,2434,918],{"class":194},[173,2436,2437],{"class":734}," diff=",[173,2439,1896],{"class":194},[173,2441,2442],{"class":182},"(data_to) ",[173,2444,2445],{"class":178},"-",[173,2447,1640],{"class":194},[173,2449,2422],{"class":182},[173,2451,918],{"class":194},[173,2453,957],{"class":734},[173,2455,1880],{"class":182},[173,2457,2459,2462,2464,2467,2469,2471,2473,2475,2477,2479,2481,2483],{"class":175,"line":2458},124,[173,2460,2461],{"class":182},"        global_before ",[173,2463,205],{"class":178},[173,2465,2466],{"class":194}," round",[173,2468,1874],{"class":182},[173,2470,1955],{"class":194},[173,2472,1236],{"class":182},[173,2474,1665],{"class":734},[173,2476,1163],{"class":182},[173,2478,988],{"class":178},[173,2480,1619],{"class":182},[173,2482,994],{"class":178},[173,2484,2485],{"class":182}," data_from.values()))\n",[173,2487,2489,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512],{"class":175,"line":2488},125,[173,2490,2491],{"class":182},"        global_after ",[173,2493,205],{"class":178},[173,2495,2466],{"class":194},[173,2497,1874],{"class":182},[173,2499,1955],{"class":194},[173,2501,1236],{"class":182},[173,2503,1665],{"class":734},[173,2505,1163],{"class":182},[173,2507,988],{"class":178},[173,2509,1619],{"class":182},[173,2511,994],{"class":178},[173,2513,2514],{"class":182}," data_to.values()))\n",[173,2516,2518,2520,2522,2524,2527,2529,2532,2534,2536,2538,2541,2543,2545,2547,2550,2552,2555,2557,2559],{"class":175,"line":2517},126,[173,2519,1761],{"class":194},[173,2521,1874],{"class":182},[173,2523,1890],{"class":178},[173,2525,2526],{"class":734},"\"global complexity before=",[173,2528,1775],{"class":194},[173,2530,2531],{"class":182},"global_before",[173,2533,918],{"class":194},[173,2535,2427],{"class":734},[173,2537,1775],{"class":194},[173,2539,2540],{"class":182},"global_after",[173,2542,918],{"class":194},[173,2544,2437],{"class":734},[173,2546,1775],{"class":194},[173,2548,2549],{"class":182},"global_after ",[173,2551,2445],{"class":178},[173,2553,2554],{"class":182}," global_before",[173,2556,918],{"class":194},[173,2558,957],{"class":734},[173,2560,1880],{"class":182},[173,2562,2564],{"class":175,"line":2563},127,[173,2565,240],{"emptyLinePlaceholder":16},[173,2567,2569,2571,2574,2577,2580],{"class":175,"line":2568},128,[173,2570,1935],{"class":178},[173,2572,2573],{"class":194}," __name__",[173,2575,2576],{"class":178}," ==",[173,2578,2579],{"class":734}," \"__main__\"",[173,2581,1172],{"class":182},[173,2583,2585,2588,2590],{"class":175,"line":2584},129,[173,2586,2587],{"class":182},"    parser ",[173,2589,205],{"class":178},[173,2591,2592],{"class":182}," argparse.ArgumentParser(\n",[173,2594,2596,2599,2601,2604],{"class":175,"line":2595},130,[173,2597,2598],{"class":1743},"        description",[173,2600,205],{"class":178},[173,2602,2603],{"class":734},"\"Analyze DBT project manifest and produce a complexity report\"",[173,2605,744],{"class":182},[173,2607,2609],{"class":175,"line":2608},131,[173,2610,1980],{"class":182},[173,2612,2614,2617,2620],{"class":175,"line":2613},132,[173,2615,2616],{"class":182},"    parser.add_argument(",[173,2618,2619],{"class":734},"\"manifest\"",[173,2621,1880],{"class":182},[173,2623,2625,2627,2630,2632,2635,2637,2640,2642,2645,2647,2649],{"class":175,"line":2624},133,[173,2626,2616],{"class":182},[173,2628,2629],{"class":734},"\"--coupling-factor\"",[173,2631,968],{"class":182},[173,2633,2634],{"class":1743},"type",[173,2636,205],{"class":178},[173,2638,2639],{"class":194},"float",[173,2641,968],{"class":182},[173,2643,2644],{"class":1743},"default",[173,2646,205],{"class":178},[173,2648,1054],{"class":194},[173,2650,1880],{"class":182},[173,2652,2654,2656,2659,2661,2663,2665,2668,2670,2672,2674,2676],{"class":175,"line":2653},134,[173,2655,2616],{"class":182},[173,2657,2658],{"class":734},"\"--min-columns\"",[173,2660,968],{"class":182},[173,2662,2634],{"class":1743},[173,2664,205],{"class":178},[173,2666,2667],{"class":194},"int",[173,2669,968],{"class":182},[173,2671,2644],{"class":1743},[173,2673,205],{"class":178},[173,2675,423],{"class":194},[173,2677,1880],{"class":182},[173,2679,2681,2683,2686,2688,2690,2692,2694,2696,2698,2700,2702],{"class":175,"line":2680},135,[173,2682,2616],{"class":182},[173,2684,2685],{"class":734},"\"--max-columns\"",[173,2687,968],{"class":182},[173,2689,2634],{"class":1743},[173,2691,205],{"class":178},[173,2693,2667],{"class":194},[173,2695,968],{"class":182},[173,2697,2644],{"class":1743},[173,2699,205],{"class":178},[173,2701,1069],{"class":194},[173,2703,1880],{"class":182},[173,2705,2707,2709,2712,2714,2716,2718,2721,2723,2725,2727,2729],{"class":175,"line":2706},136,[173,2708,2616],{"class":182},[173,2710,2711],{"class":734},"\"--select\"",[173,2713,968],{"class":182},[173,2715,2634],{"class":1743},[173,2717,205],{"class":178},[173,2719,2720],{"class":194},"str",[173,2722,968],{"class":182},[173,2724,2644],{"class":1743},[173,2726,205],{"class":178},[173,2728,1077],{"class":734},[173,2730,1880],{"class":182},[173,2732,2734,2736,2739,2741,2743,2745,2747,2749,2752,2754,2757],{"class":175,"line":2733},137,[173,2735,2616],{"class":182},[173,2737,2738],{"class":734},"\"--diff-from-manifest\"",[173,2740,968],{"class":182},[173,2742,2644],{"class":1743},[173,2744,205],{"class":178},[173,2746,2021],{"class":194},[173,2748,968],{"class":182},[173,2750,2751],{"class":1743},"help",[173,2753,205],{"class":178},[173,2755,2756],{"class":734},"\"Print diff with this manifest\"",[173,2758,1880],{"class":182},[173,2760,2762,2765,2767],{"class":175,"line":2761},138,[173,2763,2764],{"class":182},"    args ",[173,2766,205],{"class":178},[173,2768,2769],{"class":182}," parser.parse_args()\n",[173,2771,2773],{"class":175,"line":2772},139,[173,2774,240],{"emptyLinePlaceholder":16},[173,2776,2778,2780,2783,2785,2787,2789],{"class":175,"line":2777},140,[173,2779,1146],{"class":178},[173,2781,2782],{"class":182}," args.diff_from_manifest ",[173,2784,2278],{"class":178},[173,2786,2371],{"class":178},[173,2788,2281],{"class":194},[173,2790,1172],{"class":182},[173,2792,2794,2797,2799],{"class":175,"line":2793},141,[173,2795,2796],{"class":182},"        data_from ",[173,2798,205],{"class":178},[173,2800,2801],{"class":182}," analyze_manifest(\n",[173,2803,2805],{"class":175,"line":2804},142,[173,2806,2807],{"class":182},"            args.diff_from_manifest,\n",[173,2809,2811,2814,2816],{"class":175,"line":2810},143,[173,2812,2813],{"class":1743},"            coupling_factor",[173,2815,205],{"class":178},[173,2817,2818],{"class":182},"args.coupling_factor,\n",[173,2820,2822,2825,2827],{"class":175,"line":2821},144,[173,2823,2824],{"class":1743},"            min_columns",[173,2826,205],{"class":178},[173,2828,2829],{"class":182},"args.min_columns,\n",[173,2831,2833,2836,2838],{"class":175,"line":2832},145,[173,2834,2835],{"class":1743},"            max_columns",[173,2837,205],{"class":178},[173,2839,2840],{"class":182},"args.max_columns,\n",[173,2842,2844],{"class":175,"line":2843},146,[173,2845,1860],{"class":182},[173,2847,2849,2852,2854],{"class":175,"line":2848},147,[173,2850,2851],{"class":182},"        data_to ",[173,2853,205],{"class":178},[173,2855,2801],{"class":182},[173,2857,2859],{"class":175,"line":2858},148,[173,2860,2861],{"class":182},"            args.manifest,\n",[173,2863,2865,2867,2869],{"class":175,"line":2864},149,[173,2866,2813],{"class":1743},[173,2868,205],{"class":178},[173,2870,2818],{"class":182},[173,2872,2874,2876,2878],{"class":175,"line":2873},150,[173,2875,2824],{"class":1743},[173,2877,205],{"class":178},[173,2879,2829],{"class":182},[173,2881,2883,2885,2887],{"class":175,"line":2882},151,[173,2884,2835],{"class":1743},[173,2886,205],{"class":178},[173,2888,2840],{"class":182},[173,2890,2892],{"class":175,"line":2891},152,[173,2893,1860],{"class":182},[173,2895,2897],{"class":175,"line":2896},153,[173,2898,2899],{"class":182},"        print_diff_complexity(data_from, data_to)\n",[173,2901,2903,2905],{"class":175,"line":2902},154,[173,2904,2392],{"class":178},[173,2906,1172],{"class":182},[173,2908,2910,2913,2915],{"class":175,"line":2909},155,[173,2911,2912],{"class":182},"        data ",[173,2914,205],{"class":178},[173,2916,2801],{"class":182},[173,2918,2920],{"class":175,"line":2919},156,[173,2921,2861],{"class":182},[173,2923,2925,2927,2929],{"class":175,"line":2924},157,[173,2926,2813],{"class":1743},[173,2928,205],{"class":178},[173,2930,2818],{"class":182},[173,2932,2934,2936,2938],{"class":175,"line":2933},158,[173,2935,2824],{"class":1743},[173,2937,205],{"class":178},[173,2939,2829],{"class":182},[173,2941,2943,2945,2947],{"class":175,"line":2942},159,[173,2944,2835],{"class":1743},[173,2946,205],{"class":178},[173,2948,2840],{"class":182},[173,2950,2952,2955,2957],{"class":175,"line":2951},160,[173,2953,2954],{"class":1743},"            select",[173,2956,205],{"class":178},[173,2958,2959],{"class":182},"args.select,\n",[173,2961,2963],{"class":175,"line":2962},161,[173,2964,1860],{"class":182},[173,2966,2968],{"class":175,"line":2967},162,[173,2969,2970],{"class":182},"        print_manifest_complexity(data)\n",[2972,2973,2974],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":10,"searchDepth":11,"depth":11,"links":2976},[2977,2981],{"id":52,"depth":11,"text":53,"children":2978},[2979],{"id":103,"depth":243,"text":2980},"Exemple de simplification de lineage après correction d’une alerte fct_rejoining_of_upstream_concepts",{"id":126,"depth":11,"text":127,"children":2982},[2983],{"id":162,"depth":243,"text":163},"2024-01-25","fr",{},"\u002Farticles\u002F2024-01-25-monitoring-de-la-complexite-des-models-dbt",{"title":25,"description":48},"articles\u002F2024-01-25-monitoring-de-la-complexite-des-models-dbt",[2991,2992],"Tech","Data","1i1Mi5QVRY-uDjUFhqvxbloRpqZsQoRZg5od5zKFFps",{"id":2995,"title":2996,"author":26,"body":2997,"date":4903,"description":4904,"extension":13,"lang":2985,"meta":4905,"navigation":16,"path":4906,"published":16,"readingTime":454,"seo":4907,"stem":4908,"tags":4909,"__hash__":4910},"articles\u002Farticles\u002F2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain.md","Améliorer ses requêtes Mongo avec Atlas et .explain()",{"type":7,"value":2998,"toc":4887},[2999,3002,3005,3009,3018,3022,3025,3029,3032,3042,3059,3064,3069,3074,3078,3081,3086,3091,3096,3100,3109,3112,3117,3121,3126,3129,3132,3137,3140,3143,3307,3310,3313,3317,3321,3334,3337,3383,3398,3433,3440,3743,3753,3756,3780,3787,3824,3832,3836,3843,4021,4028,4110,4113,4311,4314,4321,4532,4535,4538,4541,4597,4600,4796,4799,4802,4805,4817,4821,4824,4827,4836,4841,4845,4884],[30,3000,3001],{},"Quoi de plus frustrant qu’un site qui rame ? Rien. Si à chaque clic l’utilisateur·rice doit\npatienter en cherchant des formes dans les nuages pour faire passer le temps, pas sûr que grand\nmonde reste sur votre site …",[30,3003,3004],{},"Allez, on a (sûrement) du boulot !",[50,3006,3008],{"id":3007},"identifier-les-problèmes-avec-atlas","Identifier les problèmes avec Atlas",[30,3010,3011,3012,3017],{},"MongoDB ",[34,3013,3016],{"href":3014,"rel":3015},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fatlas\u002F",[38],"Atlas"," est un service de base de données dans le\ncloud, créé par la même entreprise que MongoDb. C’est un outil qui permet, entre autres, de\nmonitorer l’état de la base de données.",[101,3019,3021],{"id":3020},"metrics","Metrics",[30,3023,3024],{},"Les deux graphiques qui nous intéressent ici sont “Query Executor” et “Query Targeting”, que l’on\ntrouvera dans l’onglet “Metrics”. Ils nous donneront une idée de la réponse à “y-a-t’il des choses à\naméliorer ?” mais ne nous donneront pas de précision sur quoi exactement. Cependant, ils sont un bon\nindicateur de l’état général de nos queries.",[101,3026,3028],{"id":3027},"query-executor","Query Executor",[30,3030,3031],{},"Sur ce graphique, on pourra voir :",[3033,3034,3035,3039],"ul",{},[3036,3037,3038],"li",{},"en bleu le nombre moyen d’index scannés;",[3036,3040,3041],{},"en vert le nombre moyen de documents scannés;",[30,3043,3044,3045,3048,3049,3052,3053,3058],{},"données correspondantes à respectivement ",[42,3046,3047],{},"totalDocsExamined"," et ",[42,3050,3051],{},"totalKeysExamined"," que l’on\nretrouve en sortie d’un ",[34,3054,3057],{"href":3055,"rel":3056},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Freference\u002Fcommand\u002Fexplain\u002F",[38],"explain()",".\nPlus la courbe verte est éloignée de la courbe bleue, moins les index sont utilisés dans les\nrequêtes de l’application, ce qu’on cherche à éviter.",[30,3060,3061],{},[110,3062],{"alt":10,"src":3063},"\u002Fimages\u002FCapture-decran-2022-10-05-a-17.27.27-1.png",[30,3065,3066],{},[81,3067,3068],{},"“scanned” : The average rate per second over the selected sample period of index items scanned\nduring queries and query-plan evaluation. This rate is driven by the same value as totalKeysExamined\nin the output of explain(). ”",[30,3070,3071],{},[81,3072,3073],{},"scanned objects” : The average rate per second over the selected sample period of documents scanned\nduring queries and query-plan evaluation. This rate is driven by the same value as totalDocsExamined\nin the output of explain().",[101,3075,3077],{"id":3076},"query-targeting","Query Targeting",[30,3079,3080],{},"Ce graphique représentant des ratios est peut-être plus intéressant à regarder pour déterminer si\nl’on a besoin de travailler sur nos queries. Un ratio de 1 indique que le nombre de documents ou\nd’index scannés est égal au nombre de documents renvoyés. On cherchera donc à se rapprocher de cette\nvaleur, ce qui n’est pas toujours facile. Par exemple, on en est loin ici :",[30,3082,3083],{},[110,3084],{"alt":10,"src":3085},"\u002Fimages\u002FCapture-decran-2022-10-05-a-17.27.13.png",[30,3087,3088],{},[81,3089,3090],{},"“scanned \u002F returned” : The ratio of the number of index items scanned to the number of documents\nreturned by queries, since the previous data point for the selected sample period. A value of 1.0\nmeans all documents returned exactly match query criteria for the sample period. A value of 100\nmeans on average for the sample period, a query scans 100 documents to find one that's returned.",[30,3092,3093],{},[81,3094,3095],{},"”scanned objects \u002F returned” : The ratio of the number of documents scanned to the number of\ndocuments returned by queries, since the previous data point for the selected sample period.",[50,3097,3099],{"id":3098},"performance-advisor","Performance advisor",[30,3101,3102,3103,3108],{},"Cet onglet peut proposer des créations ou suppressions d’index en fonction de nos queries. Même s’il\nest tentant de cliquer sans trop regarder, il vaut mieux réfléchir un peu avant. En effet, ajouter\ndes indexes sur un peu tous les champs serait contre-productif : Mongo pourrait utiliser un index\nplutôt qu’un autre sans que ce soit forcément le bon choix. Autre potentiel problème : si les\nindexes créés sont triés et stockés dans la RAM, il faut s’assurer qu’on\n",[34,3104,3107],{"href":3105,"rel":3106},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fv6.0\u002Ftutorial\u002Fensure-indexes-fit-ram\u002F",[38],"ne dépasse pas la place allouée","\n!",[30,3110,3111],{},"Ces propositions d’indexes se basent sur les requêtes faites sur l’app, et si elles ne sont pas\nécrites en pensant un minimum perf, les indexes proposés ici ne seront pas forcément pertinents.",[30,3113,3114],{},[110,3115],{"alt":10,"src":3116},"\u002Fimages\u002FCapture-decran-2022-07-21-a-16.22.26.png",[101,3118,3120],{"id":3119},"profiler","Profiler",[30,3122,3123],{},[110,3124],{"alt":10,"src":3125},"\u002Fimages\u002FCapture-decran-2022-07-21-a-16.01.52.png",[30,3127,3128],{},"C’est sur cet onglet qu’on va enfin pouvoir mettre les mains dans le cambouis. Ce graphique\nidentifie les requêtes “trop longues” selon Atlas.",[30,3130,3131],{},"En cliquant sur un point du graphique, le détail de la requête incriminée apparait.",[30,3133,3134],{},[110,3135],{"alt":10,"src":3136},"\u002Fimages\u002FCapture-decran-2022-07-21-a-16.42.00.png",[30,3138,3139],{},"Sur cette requête, le nombre documents examinés via l’index est de 3 209 alors qu’on ne renvoie au\nfinal que 5 documents !",[30,3141,3142],{},"On trouvera également le détail de la requête, ce qui nous permettra d’identifier exactement dans\nquelle partie du code elle se trouve.",[165,3144,3148],{"className":3145,"code":3146,"language":3147,"meta":10,"style":10},"language-json shiki shiki-themes github-light github-dark","{\n    \"type\": \"command\",\n    \"command\": {\n        \"aggregate\": \"myCollection\",\n        \"pipeline\": [],\n        …\n    },\n    \"planSummary\": \"IXSCAN { someField: 1 }\",\n    \"keysExamined\": 3209,\n    \"docsExamined\": 3209,\n    \"hasSortStage\": true,\n    \"cursorExhausted\": true,\n    \"numYields\": 6,\n    \"nreturned\": 5,\n    \"durationMillis\": 198,\n    …\n}\n","json",[42,3149,3150,3155,3167,3175,3187,3195,3200,3205,3217,3229,3240,3252,3263,3274,3285,3297,3302],{"__ignoreMap":10},[173,3151,3152],{"class":175,"line":18},[173,3153,3154],{"class":182},"{\n",[173,3156,3157,3160,3162,3165],{"class":175,"line":11},[173,3158,3159],{"class":194},"    \"type\"",[173,3161,738],{"class":182},[173,3163,3164],{"class":734},"\"command\"",[173,3166,744],{"class":182},[173,3168,3169,3172],{"class":175,"line":243},[173,3170,3171],{"class":194},"    \"command\"",[173,3173,3174],{"class":182},": {\n",[173,3176,3177,3180,3182,3185],{"class":175,"line":291},[173,3178,3179],{"class":194},"        \"aggregate\"",[173,3181,738],{"class":182},[173,3183,3184],{"class":734},"\"myCollection\"",[173,3186,744],{"class":182},[173,3188,3189,3192],{"class":175,"line":296},[173,3190,3191],{"class":194},"        \"pipeline\"",[173,3193,3194],{"class":182},": [],\n",[173,3196,3197],{"class":175,"line":343},[173,3198,3199],{"class":921},"        …\n",[173,3201,3202],{"class":175,"line":348},[173,3203,3204],{"class":182},"    },\n",[173,3206,3207,3210,3212,3215],{"class":175,"line":393},[173,3208,3209],{"class":194},"    \"planSummary\"",[173,3211,738],{"class":182},[173,3213,3214],{"class":734},"\"IXSCAN { someField: 1 }\"",[173,3216,744],{"class":182},[173,3218,3219,3222,3224,3227],{"class":175,"line":398},[173,3220,3221],{"class":194},"    \"keysExamined\"",[173,3223,738],{"class":182},[173,3225,3226],{"class":194},"3209",[173,3228,744],{"class":182},[173,3230,3231,3234,3236,3238],{"class":175,"line":449},[173,3232,3233],{"class":194},"    \"docsExamined\"",[173,3235,738],{"class":182},[173,3237,3226],{"class":194},[173,3239,744],{"class":182},[173,3241,3242,3245,3247,3250],{"class":175,"line":454},[173,3243,3244],{"class":194},"    \"hasSortStage\"",[173,3246,738],{"class":182},[173,3248,3249],{"class":194},"true",[173,3251,744],{"class":182},[173,3253,3254,3257,3259,3261],{"class":175,"line":499},[173,3255,3256],{"class":194},"    \"cursorExhausted\"",[173,3258,738],{"class":182},[173,3260,3249],{"class":194},[173,3262,744],{"class":182},[173,3264,3265,3268,3270,3272],{"class":175,"line":504},[173,3266,3267],{"class":194},"    \"numYields\"",[173,3269,738],{"class":182},[173,3271,529],{"class":194},[173,3273,744],{"class":182},[173,3275,3276,3279,3281,3283],{"class":175,"line":553},[173,3277,3278],{"class":194},"    \"nreturned\"",[173,3280,738],{"class":182},[173,3282,428],{"class":194},[173,3284,744],{"class":182},[173,3286,3287,3290,3292,3295],{"class":175,"line":558},[173,3288,3289],{"class":194},"    \"durationMillis\"",[173,3291,738],{"class":182},[173,3293,3294],{"class":194},"198",[173,3296,744],{"class":182},[173,3298,3299],{"class":175,"line":603},[173,3300,3301],{"class":921},"    …\n",[173,3303,3304],{"class":175,"line":608},[173,3305,3306],{"class":182},"}\n",[30,3308,3309],{},"Attention, toutes les requêtes à la base de données sont affichées ici ! De ce fait, si vous faites\ndes requêtes un peu gourmandes à la mano dans votre terminal, elles apparaîtront aussi ici.",[30,3311,3312],{},"Maintenant qu’on a identifié une requête qui pose problème, c’est cool, mais on fait quoi ?",[50,3314,3316],{"id":3315},"améliorer-ses-requêtes","Améliorer ses requêtes",[101,3318,3320],{"id":3319},"lire-et-comprendre-un-explain","Lire et comprendre un .explain()",[30,3322,3323,3324,3328,3329,99],{},"La doc Mongo est par ",[34,3325,3327],{"href":3055,"rel":3326},[38],"ici"," et\n",[34,3330,3333],{"href":3331,"rel":3332},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Freference\u002Fexplain-results\u002F",[38],"là",[30,3335,3336],{},"TL;DR, on peut (essayer de) comprendre ce que fait Mongo avec notre requête, en faisant :",[165,3338,3342],{"className":3339,"code":3340,"language":3341,"meta":10,"style":10},"language-ts shiki shiki-themes github-light github-dark","db.getCollection('myCollection').find({ ... }).explain('executionStats');\n","ts",[42,3343,3344],{"__ignoreMap":10},[173,3345,3346,3349,3352,3354,3357,3360,3363,3366,3369,3372,3375,3377,3380],{"class":175,"line":18},[173,3347,3348],{"class":182},"db.",[173,3350,3351],{"class":936},"getCollection",[173,3353,1874],{"class":182},[173,3355,3356],{"class":734},"'myCollection'",[173,3358,3359],{"class":182},").",[173,3361,3362],{"class":936},"find",[173,3364,3365],{"class":182},"({ ",[173,3367,3368],{"class":178},"...",[173,3370,3371],{"class":182}," }).",[173,3373,3374],{"class":936},"explain",[173,3376,1874],{"class":182},[173,3378,3379],{"class":734},"'executionStats'",[173,3381,3382],{"class":182},");\n",[30,3384,3385,3386,3389,3390,3393,3394,3397],{},"Attention, pour les ",[42,3387,3388],{},"aggregate",", c’est dans l’autre sens ! Le ",[42,3391,3392],{},".explain()"," vient avant le\n",[42,3395,3396],{},".aggregate()",". Pour la lecture, c’est le même principe.",[165,3399,3401],{"className":3339,"code":3400,"language":3341,"meta":10,"style":10},"db.getCollection('myCollection').explain('executionStats').aggregate([ ... ]);\n",[42,3402,3403],{"__ignoreMap":10},[173,3404,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3428,3430],{"class":175,"line":18},[173,3406,3348],{"class":182},[173,3408,3351],{"class":936},[173,3410,1874],{"class":182},[173,3412,3356],{"class":734},[173,3414,3359],{"class":182},[173,3416,3374],{"class":936},[173,3418,1874],{"class":182},[173,3420,3379],{"class":734},[173,3422,3359],{"class":182},[173,3424,3388],{"class":936},[173,3426,3427],{"class":182},"([ ",[173,3429,3368],{"class":178},[173,3431,3432],{"class":182}," ]);\n",[30,3434,3435,3436,3439],{},"Pour le ",[42,3437,3438],{},".find()",", on aura un résultat du style :",[165,3441,3443],{"className":3145,"code":3442,"language":3147,"meta":10,"style":10},"{\n    \"queryPlanner\" : {\n        \"parsedQuery\" : {...},\n        \"winningPlan\" : { -- plan utilisé\n            \"stage\" : \"FETCH\",\n            \"filter\" : {...},\n            \"inputStage\" : {\n                \"stage\" : \"IXSCAN\",\n                \"keyPattern\" : {\n                    \"myFieldWithIndex\" : 1\n                },\n                \"indexName\" : \"myIndexName\",\n                \"isMultiKey\" : false,\n                \"isUnique\" : false,\n                ...\n            }\n        },\n        \"rejectedPlans\" : [],\n        ...\n    },\n    \"executionStats\" : {\n        \"executionSuccess\" : true,\n        \"nReturned\" : 32199, -- nombre de documents renvoyés\n        \"executionTimeMillis\" : 160, -- temps d'exécution\n        \"totalKeysExamined\" : 49805, -- nombre d'indexes examinés\n        \"totalDocsExamined\" : 49805, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n\n",[42,3444,3445,3449,3457,3470,3487,3500,3511,3518,3530,3537,3547,3552,3564,3576,3587,3592,3597,3602,3610,3615,3619,3626,3637,3663,3683,3705,3726,3730,3734,3739],{"__ignoreMap":10},[173,3446,3447],{"class":175,"line":18},[173,3448,3154],{"class":182},[173,3450,3451,3454],{"class":175,"line":11},[173,3452,3453],{"class":194},"    \"queryPlanner\"",[173,3455,3456],{"class":182}," : {\n",[173,3458,3459,3462,3465,3467],{"class":175,"line":243},[173,3460,3461],{"class":194},"        \"parsedQuery\"",[173,3463,3464],{"class":182}," : {",[173,3466,3368],{"class":921},[173,3468,3469],{"class":182},"},\n",[173,3471,3472,3475,3478,3481,3484],{"class":175,"line":291},[173,3473,3474],{"class":194},"        \"winningPlan\"",[173,3476,3477],{"class":182}," : { ",[173,3479,3480],{"class":921},"--",[173,3482,3483],{"class":921}," plan",[173,3485,3486],{"class":921}," utilisé\n",[173,3488,3489,3492,3495,3498],{"class":175,"line":296},[173,3490,3491],{"class":194},"            \"stage\"",[173,3493,3494],{"class":182}," : ",[173,3496,3497],{"class":734},"\"FETCH\"",[173,3499,744],{"class":182},[173,3501,3502,3505,3507,3509],{"class":175,"line":343},[173,3503,3504],{"class":194},"            \"filter\"",[173,3506,3464],{"class":182},[173,3508,3368],{"class":921},[173,3510,3469],{"class":182},[173,3512,3513,3516],{"class":175,"line":348},[173,3514,3515],{"class":194},"            \"inputStage\"",[173,3517,3456],{"class":182},[173,3519,3520,3523,3525,3528],{"class":175,"line":393},[173,3521,3522],{"class":194},"                \"stage\"",[173,3524,3494],{"class":182},[173,3526,3527],{"class":734},"\"IXSCAN\"",[173,3529,744],{"class":182},[173,3531,3532,3535],{"class":175,"line":398},[173,3533,3534],{"class":194},"                \"keyPattern\"",[173,3536,3456],{"class":182},[173,3538,3539,3542,3544],{"class":175,"line":449},[173,3540,3541],{"class":194},"                    \"myFieldWithIndex\"",[173,3543,3494],{"class":182},[173,3545,3546],{"class":194},"1\n",[173,3548,3549],{"class":175,"line":454},[173,3550,3551],{"class":182},"                },\n",[173,3553,3554,3557,3559,3562],{"class":175,"line":499},[173,3555,3556],{"class":194},"                \"indexName\"",[173,3558,3494],{"class":182},[173,3560,3561],{"class":734},"\"myIndexName\"",[173,3563,744],{"class":182},[173,3565,3566,3569,3571,3574],{"class":175,"line":504},[173,3567,3568],{"class":194},"                \"isMultiKey\"",[173,3570,3494],{"class":182},[173,3572,3573],{"class":194},"false",[173,3575,744],{"class":182},[173,3577,3578,3581,3583,3585],{"class":175,"line":553},[173,3579,3580],{"class":194},"                \"isUnique\"",[173,3582,3494],{"class":182},[173,3584,3573],{"class":194},[173,3586,744],{"class":182},[173,3588,3589],{"class":175,"line":558},[173,3590,3591],{"class":921},"                ...\n",[173,3593,3594],{"class":175,"line":603},[173,3595,3596],{"class":182},"            }\n",[173,3598,3599],{"class":175,"line":608},[173,3600,3601],{"class":182},"        },\n",[173,3603,3604,3607],{"class":175,"line":654},[173,3605,3606],{"class":194},"        \"rejectedPlans\"",[173,3608,3609],{"class":182}," : [],\n",[173,3611,3612],{"class":175,"line":659},[173,3613,3614],{"class":921},"        ...\n",[173,3616,3617],{"class":175,"line":666},[173,3618,3204],{"class":182},[173,3620,3621,3624],{"class":175,"line":890},[173,3622,3623],{"class":194},"    \"executionStats\"",[173,3625,3456],{"class":182},[173,3627,3628,3631,3633,3635],{"class":175,"line":903},[173,3629,3630],{"class":194},"        \"executionSuccess\"",[173,3632,3494],{"class":182},[173,3634,3249],{"class":194},[173,3636,744],{"class":182},[173,3638,3639,3642,3644,3647,3649,3651,3654,3657,3660],{"class":175,"line":915},[173,3640,3641],{"class":194},"        \"nReturned\"",[173,3643,3494],{"class":182},[173,3645,3646],{"class":194},"32199",[173,3648,968],{"class":182},[173,3650,3480],{"class":921},[173,3652,3653],{"class":921}," nombre",[173,3655,3656],{"class":921}," de",[173,3658,3659],{"class":921}," documents",[173,3661,3662],{"class":921}," renvoyés\n",[173,3664,3665,3668,3670,3673,3675,3677,3680],{"class":175,"line":925},[173,3666,3667],{"class":194},"        \"executionTimeMillis\"",[173,3669,3494],{"class":182},[173,3671,3672],{"class":194},"160",[173,3674,968],{"class":182},[173,3676,3480],{"class":921},[173,3678,3679],{"class":921}," temps",[173,3681,3682],{"class":921}," d'exécution\n",[173,3684,3685,3688,3690,3693,3695,3697,3699,3702],{"class":175,"line":930},[173,3686,3687],{"class":194},"        \"totalKeysExamined\"",[173,3689,3494],{"class":182},[173,3691,3692],{"class":194},"49805",[173,3694,968],{"class":182},[173,3696,3480],{"class":921},[173,3698,3653],{"class":921},[173,3700,3701],{"class":921}," d'indexes",[173,3703,3704],{"class":921}," examinés\n",[173,3706,3707,3710,3712,3714,3716,3718,3720,3722,3724],{"class":175,"line":943},[173,3708,3709],{"class":194},"        \"totalDocsExamined\"",[173,3711,3494],{"class":182},[173,3713,3692],{"class":194},[173,3715,968],{"class":182},[173,3717,3480],{"class":921},[173,3719,3653],{"class":921},[173,3721,3656],{"class":921},[173,3723,3659],{"class":921},[173,3725,3704],{"class":921},[173,3727,3728],{"class":175,"line":977},[173,3729,3614],{"class":921},[173,3731,3732],{"class":175,"line":1000},[173,3733,3204],{"class":182},[173,3735,3736],{"class":175,"line":1036},[173,3737,3738],{"class":921},"    ...\n",[173,3740,3741],{"class":175,"line":1041},[173,3742,3306],{"class":182},[30,3744,3745,3746,3048,3749,3752],{},"On peut déjà comparer le ",[42,3747,3748],{},"executionStats.nReturned",[42,3750,3751],{},"executionStats.totalDocsExamined",". Si on a\nla même valeur, cela veut dire que tous les documents parcourus sont renvoyés en réponse.",[30,3754,3755],{},"Est-ce qu’un index a été utilisé ? On peut voir ça à plusieurs endroits :",[3033,3757,3758,3764,3774],{},[3036,3759,3760,3763],{},[42,3761,3762],{},"executionStats.totalKeysExamined"," qui nous donne le nombre de documents examinés via un index",[3036,3765,3766,3769,3770,3773],{},[42,3767,3768],{},"winningPlan.inputStage.stage"," qui vaut ",[42,3771,3772],{},"IXSCAN"," (voir ci-dessous)",[3036,3775,3776,3779],{},[42,3777,3778],{},"winningPlan.inputStage.indexName"," qui nous donne le nom de l’index utilisé",[30,3781,3782,3783,3786],{},"Le champ ",[42,3784,3785],{},"stage"," peut prendre plusieurs valeurs :",[3033,3788,3789,3795,3800,3806,3812,3818],{},[3036,3790,3791,3794],{},[42,3792,3793],{},"COLLSCAN"," quand toute la collection est scannée (en général, on va essayer de ne pas avoir cette\nvaleur dans le premier stage au moins)",[3036,3796,3797,3799],{},[42,3798,3772],{}," quand on examine les documents via un index",[3036,3801,3802,3805],{},[42,3803,3804],{},"FETCH"," quand on récupère des documents",[3036,3807,3808,3811],{},[42,3809,3810],{},"GROUP"," quand on groupe des documents",[3036,3813,3814,3817],{},[42,3815,3816],{},"SHARD_MERGE"," pour fusionner les résultats des shards",[3036,3819,3820,3823],{},[42,3821,3822],{},"SHARDING_FILTER"," pour filtrer les documents orphelins des shards",[30,3825,3826,3827,3829,3830,99],{},"Pour diminuer le temps d’exécution, le but va être d’avoir le moins possible de ",[42,3828,3793],{}," au profit\ndes ",[42,3831,3772],{},[101,3833,3835],{"id":3834},"exemple","Exemple",[30,3837,3838,3839,3842],{},"Imaginons une collection ",[42,3840,3841],{},"transactions"," sans index et avec 106 041 documents de la forme suivante :",[165,3844,3846],{"className":3145,"code":3845,"language":3147,"meta":10,"style":10},"{\n    \"_id\" : \"j9sdaW87Wv5gck443\",\n    \"date\" : ISODate(\"2022-09-24T00:00:00.000Z\"),\n    \"id_user\" : \"1234\",\n    \"id_bank_account\" : \"gTdxTA9ZvZrsrML6S\",\n    \"description\" : \"Virement\",\n    \"subdivisions\" : [\n        {\n            \"id\" : \"b44jxF599Tk8qkj32\",\n            \"amount_in_cents\" : 89400,\n            \"accounting_account\" : \"471000\",\n        },\n        {\n            \"id\" : \"43BRMJHuXYNfxogdD\",\n            \"amount_in_cents\" : -89400,\n            \"accounting_account\" : \"512001\",\n        }\n    ]\n}\n",[42,3847,3848,3852,3864,3882,3894,3906,3918,3926,3931,3943,3955,3967,3971,3975,3986,3997,4008,4012,4017],{"__ignoreMap":10},[173,3849,3850],{"class":175,"line":18},[173,3851,3154],{"class":182},[173,3853,3854,3857,3859,3862],{"class":175,"line":11},[173,3855,3856],{"class":194},"    \"_id\"",[173,3858,3494],{"class":182},[173,3860,3861],{"class":734},"\"j9sdaW87Wv5gck443\"",[173,3863,744],{"class":182},[173,3865,3866,3869,3871,3874,3877,3880],{"class":175,"line":243},[173,3867,3868],{"class":194},"    \"date\"",[173,3870,3494],{"class":182},[173,3872,3873],{"class":921},"ISODate(",[173,3875,3876],{"class":734},"\"2022-09-24T00:00:00.000Z\"",[173,3878,3879],{"class":921},")",[173,3881,744],{"class":182},[173,3883,3884,3887,3889,3892],{"class":175,"line":291},[173,3885,3886],{"class":194},"    \"id_user\"",[173,3888,3494],{"class":182},[173,3890,3891],{"class":734},"\"1234\"",[173,3893,744],{"class":182},[173,3895,3896,3899,3901,3904],{"class":175,"line":296},[173,3897,3898],{"class":194},"    \"id_bank_account\"",[173,3900,3494],{"class":182},[173,3902,3903],{"class":734},"\"gTdxTA9ZvZrsrML6S\"",[173,3905,744],{"class":182},[173,3907,3908,3911,3913,3916],{"class":175,"line":343},[173,3909,3910],{"class":194},"    \"description\"",[173,3912,3494],{"class":182},[173,3914,3915],{"class":734},"\"Virement\"",[173,3917,744],{"class":182},[173,3919,3920,3923],{"class":175,"line":348},[173,3921,3922],{"class":194},"    \"subdivisions\"",[173,3924,3925],{"class":182}," : [\n",[173,3927,3928],{"class":175,"line":393},[173,3929,3930],{"class":182},"        {\n",[173,3932,3933,3936,3938,3941],{"class":175,"line":398},[173,3934,3935],{"class":194},"            \"id\"",[173,3937,3494],{"class":182},[173,3939,3940],{"class":734},"\"b44jxF599Tk8qkj32\"",[173,3942,744],{"class":182},[173,3944,3945,3948,3950,3953],{"class":175,"line":449},[173,3946,3947],{"class":194},"            \"amount_in_cents\"",[173,3949,3494],{"class":182},[173,3951,3952],{"class":194},"89400",[173,3954,744],{"class":182},[173,3956,3957,3960,3962,3965],{"class":175,"line":454},[173,3958,3959],{"class":194},"            \"accounting_account\"",[173,3961,3494],{"class":182},[173,3963,3964],{"class":734},"\"471000\"",[173,3966,744],{"class":182},[173,3968,3969],{"class":175,"line":499},[173,3970,3601],{"class":182},[173,3972,3973],{"class":175,"line":504},[173,3974,3930],{"class":182},[173,3976,3977,3979,3981,3984],{"class":175,"line":553},[173,3978,3935],{"class":194},[173,3980,3494],{"class":182},[173,3982,3983],{"class":734},"\"43BRMJHuXYNfxogdD\"",[173,3985,744],{"class":182},[173,3987,3988,3990,3992,3995],{"class":175,"line":558},[173,3989,3947],{"class":194},[173,3991,3494],{"class":182},[173,3993,3994],{"class":194},"-89400",[173,3996,744],{"class":182},[173,3998,3999,4001,4003,4006],{"class":175,"line":603},[173,4000,3959],{"class":194},[173,4002,3494],{"class":182},[173,4004,4005],{"class":734},"\"512001\"",[173,4007,744],{"class":182},[173,4009,4010],{"class":175,"line":608},[173,4011,1523],{"class":182},[173,4013,4014],{"class":175,"line":654},[173,4015,4016],{"class":182},"    ]\n",[173,4018,4019],{"class":175,"line":659},[173,4020,3306],{"class":182},[30,4022,4023,4024,4027],{},"Prenons cette requête qui liste les transactions de l’utilisateur ",[42,4025,4026],{},"1234"," pour un compte comptable et\nune date :",[165,4029,4031],{"className":3339,"code":4030,"language":3341,"meta":10,"style":10},"db.getCollection(\"transactions\")\n  .find({\n    id_user: \"1234\",\n    \"subdivisions.accounting_account\": \"471000\",\n    date: ISODate(\"2022-09-24 00:00:00.000Z\"),\n  })\n  .explain(\"executionStats\");\n",[42,4032,4033,4046,4056,4065,4076,4092,4097],{"__ignoreMap":10},[173,4034,4035,4037,4039,4041,4044],{"class":175,"line":18},[173,4036,3348],{"class":182},[173,4038,3351],{"class":936},[173,4040,1874],{"class":182},[173,4042,4043],{"class":734},"\"transactions\"",[173,4045,1880],{"class":182},[173,4047,4048,4051,4053],{"class":175,"line":11},[173,4049,4050],{"class":182},"  .",[173,4052,3362],{"class":936},[173,4054,4055],{"class":182},"({\n",[173,4057,4058,4061,4063],{"class":175,"line":243},[173,4059,4060],{"class":182},"    id_user: ",[173,4062,3891],{"class":734},[173,4064,744],{"class":182},[173,4066,4067,4070,4072,4074],{"class":175,"line":291},[173,4068,4069],{"class":734},"    \"subdivisions.accounting_account\"",[173,4071,738],{"class":182},[173,4073,3964],{"class":734},[173,4075,744],{"class":182},[173,4077,4078,4081,4084,4086,4089],{"class":175,"line":296},[173,4079,4080],{"class":182},"    date: ",[173,4082,4083],{"class":936},"ISODate",[173,4085,1874],{"class":182},[173,4087,4088],{"class":734},"\"2022-09-24 00:00:00.000Z\"",[173,4090,4091],{"class":182},"),\n",[173,4093,4094],{"class":175,"line":343},[173,4095,4096],{"class":182},"  })\n",[173,4098,4099,4101,4103,4105,4108],{"class":175,"line":348},[173,4100,4050],{"class":182},[173,4102,3374],{"class":936},[173,4104,1874],{"class":182},[173,4106,4107],{"class":734},"\"executionStats\"",[173,4109,3382],{"class":182},[30,4111,4112],{},"Et l’explication de son résultat :",[165,4114,4116],{"className":3145,"code":4115,"language":3147,"meta":10,"style":10},"{\n    \"queryPlanner\" : {\n        ...\n        \"winningPlan\" : {\n            \"stage\" : \"COLLSCAN\", -- n'utilise pas d'index\n            ...\n        },\n        \"rejectedPlans\" : [] -- n'a pas trouvé d'autre possibilité d'exécution\n    },\n    \"executionStats\" : {\n        \"executionSuccess\" : true,\n        \"nReturned\" : 5, -- nombre de documents retournés\n        \"executionTimeMillis\" : 62, -- temps de réponse\n        \"totalKeysExamined\" : 0, -- n'examine pas d'index\n        \"totalDocsExamined\" : 106041, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n",[42,4117,4118,4122,4128,4132,4138,4160,4165,4169,4194,4198,4204,4214,4235,4255,4274,4295,4299,4303,4307],{"__ignoreMap":10},[173,4119,4120],{"class":175,"line":18},[173,4121,3154],{"class":182},[173,4123,4124,4126],{"class":175,"line":11},[173,4125,3453],{"class":194},[173,4127,3456],{"class":182},[173,4129,4130],{"class":175,"line":243},[173,4131,3614],{"class":921},[173,4133,4134,4136],{"class":175,"line":291},[173,4135,3474],{"class":194},[173,4137,3456],{"class":182},[173,4139,4140,4142,4144,4147,4149,4151,4154,4157],{"class":175,"line":296},[173,4141,3491],{"class":194},[173,4143,3494],{"class":182},[173,4145,4146],{"class":734},"\"COLLSCAN\"",[173,4148,968],{"class":182},[173,4150,3480],{"class":921},[173,4152,4153],{"class":921}," n'utilise",[173,4155,4156],{"class":921}," pas",[173,4158,4159],{"class":921}," d'index\n",[173,4161,4162],{"class":175,"line":343},[173,4163,4164],{"class":921},"            ...\n",[173,4166,4167],{"class":175,"line":348},[173,4168,3601],{"class":182},[173,4170,4171,4173,4176,4178,4181,4183,4186,4189,4192],{"class":175,"line":393},[173,4172,3606],{"class":194},[173,4174,4175],{"class":182}," : [] ",[173,4177,3480],{"class":921},[173,4179,4180],{"class":921}," n'a",[173,4182,4156],{"class":921},[173,4184,4185],{"class":921}," trouvé",[173,4187,4188],{"class":921}," d'autre",[173,4190,4191],{"class":921}," possibilité",[173,4193,3682],{"class":921},[173,4195,4196],{"class":175,"line":398},[173,4197,3204],{"class":182},[173,4199,4200,4202],{"class":175,"line":449},[173,4201,3623],{"class":194},[173,4203,3456],{"class":182},[173,4205,4206,4208,4210,4212],{"class":175,"line":454},[173,4207,3630],{"class":194},[173,4209,3494],{"class":182},[173,4211,3249],{"class":194},[173,4213,744],{"class":182},[173,4215,4216,4218,4220,4222,4224,4226,4228,4230,4232],{"class":175,"line":499},[173,4217,3641],{"class":194},[173,4219,3494],{"class":182},[173,4221,428],{"class":194},[173,4223,968],{"class":182},[173,4225,3480],{"class":921},[173,4227,3653],{"class":921},[173,4229,3656],{"class":921},[173,4231,3659],{"class":921},[173,4233,4234],{"class":921}," retournés\n",[173,4236,4237,4239,4241,4244,4246,4248,4250,4252],{"class":175,"line":504},[173,4238,3667],{"class":194},[173,4240,3494],{"class":182},[173,4242,4243],{"class":194},"62",[173,4245,968],{"class":182},[173,4247,3480],{"class":921},[173,4249,3679],{"class":921},[173,4251,3656],{"class":921},[173,4253,4254],{"class":921}," réponse\n",[173,4256,4257,4259,4261,4263,4265,4267,4270,4272],{"class":175,"line":553},[173,4258,3687],{"class":194},[173,4260,3494],{"class":182},[173,4262,219],{"class":194},[173,4264,968],{"class":182},[173,4266,3480],{"class":921},[173,4268,4269],{"class":921}," n'examine",[173,4271,4156],{"class":921},[173,4273,4159],{"class":921},[173,4275,4276,4278,4280,4283,4285,4287,4289,4291,4293],{"class":175,"line":558},[173,4277,3709],{"class":194},[173,4279,3494],{"class":182},[173,4281,4282],{"class":194},"106041",[173,4284,968],{"class":182},[173,4286,3480],{"class":921},[173,4288,3653],{"class":921},[173,4290,3656],{"class":921},[173,4292,3659],{"class":921},[173,4294,3704],{"class":921},[173,4296,4297],{"class":175,"line":603},[173,4298,3614],{"class":921},[173,4300,4301],{"class":175,"line":608},[173,4302,3204],{"class":182},[173,4304,4305],{"class":175,"line":654},[173,4306,3738],{"class":921},[173,4308,4309],{"class":175,"line":659},[173,4310,3306],{"class":182},[30,4312,4313],{},"Avoir une requête qui n’utilise pas d’index n’est pas un problème en soit. Ce qu’il faut regarder\nc’est le ratio entre le nombre de document examiné (ici 106 041, c’est à dire toute notre collection\n!) et le nombre de documents retournés (ici, uniquement 1). Cette collection stocke des transactions\nbancaire, elle sera amenée à grossir rapidement : on ne peut pas se permettre de scanner toute la\ncollection à chaque fois.",[30,4315,4316,4317,4320],{},"Créons un index sur les dates avec ",[42,4318,4319],{},"db.getCollection('transactions').createIndex({ \"date\" : 1 })"," .\nOn aura alors un résultat plus satisfaisant :",[165,4322,4324],{"className":3145,"code":4323,"language":3147,"meta":10,"style":10},"{\n    \"queryPlanner\": {\n        \"winningPlan\": {\n            \"stage\": \"FETCH\",\n            \"inputStage\": {\n                \"stage\": \"IXSCAN\",\n                \"indexName\": \"date_1\", -- index utilisé\n                ...\n            },\n        },\n        \"rejectedPlans\": [] -- n'a pas trouvé d'autre possibilité d'exécution\n    },\n    \"executionStats\": {\n        \"executionSuccess\": true,\n        \"nReturned\": 5, -- nombre de documents retournés\n        \"executionTimeMillis\": 6, -- temps de réponse\n        \"totalKeysExamined\": 8, -- nombre d'indexes examinés\n        \"totalDocsExamined\": 8, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n",[42,4325,4326,4330,4336,4342,4352,4358,4368,4386,4390,4395,4399,4420,4424,4430,4440,4460,4478,4496,4516,4520,4524,4528],{"__ignoreMap":10},[173,4327,4328],{"class":175,"line":18},[173,4329,3154],{"class":182},[173,4331,4332,4334],{"class":175,"line":11},[173,4333,3453],{"class":194},[173,4335,3174],{"class":182},[173,4337,4338,4340],{"class":175,"line":243},[173,4339,3474],{"class":194},[173,4341,3174],{"class":182},[173,4343,4344,4346,4348,4350],{"class":175,"line":291},[173,4345,3491],{"class":194},[173,4347,738],{"class":182},[173,4349,3497],{"class":734},[173,4351,744],{"class":182},[173,4353,4354,4356],{"class":175,"line":296},[173,4355,3515],{"class":194},[173,4357,3174],{"class":182},[173,4359,4360,4362,4364,4366],{"class":175,"line":343},[173,4361,3522],{"class":194},[173,4363,738],{"class":182},[173,4365,3527],{"class":734},[173,4367,744],{"class":182},[173,4369,4370,4372,4374,4377,4379,4381,4384],{"class":175,"line":348},[173,4371,3556],{"class":194},[173,4373,738],{"class":182},[173,4375,4376],{"class":734},"\"date_1\"",[173,4378,968],{"class":182},[173,4380,3480],{"class":921},[173,4382,4383],{"class":921}," index",[173,4385,3486],{"class":921},[173,4387,4388],{"class":175,"line":393},[173,4389,3591],{"class":921},[173,4391,4392],{"class":175,"line":398},[173,4393,4394],{"class":182},"            },\n",[173,4396,4397],{"class":175,"line":449},[173,4398,3601],{"class":182},[173,4400,4401,4403,4406,4408,4410,4412,4414,4416,4418],{"class":175,"line":454},[173,4402,3606],{"class":194},[173,4404,4405],{"class":182},": [] ",[173,4407,3480],{"class":921},[173,4409,4180],{"class":921},[173,4411,4156],{"class":921},[173,4413,4185],{"class":921},[173,4415,4188],{"class":921},[173,4417,4191],{"class":921},[173,4419,3682],{"class":921},[173,4421,4422],{"class":175,"line":499},[173,4423,3204],{"class":182},[173,4425,4426,4428],{"class":175,"line":504},[173,4427,3623],{"class":194},[173,4429,3174],{"class":182},[173,4431,4432,4434,4436,4438],{"class":175,"line":553},[173,4433,3630],{"class":194},[173,4435,738],{"class":182},[173,4437,3249],{"class":194},[173,4439,744],{"class":182},[173,4441,4442,4444,4446,4448,4450,4452,4454,4456,4458],{"class":175,"line":558},[173,4443,3641],{"class":194},[173,4445,738],{"class":182},[173,4447,428],{"class":194},[173,4449,968],{"class":182},[173,4451,3480],{"class":921},[173,4453,3653],{"class":921},[173,4455,3656],{"class":921},[173,4457,3659],{"class":921},[173,4459,4234],{"class":921},[173,4461,4462,4464,4466,4468,4470,4472,4474,4476],{"class":175,"line":603},[173,4463,3667],{"class":194},[173,4465,738],{"class":182},[173,4467,529],{"class":194},[173,4469,968],{"class":182},[173,4471,3480],{"class":921},[173,4473,3679],{"class":921},[173,4475,3656],{"class":921},[173,4477,4254],{"class":921},[173,4479,4480,4482,4484,4486,4488,4490,4492,4494],{"class":175,"line":608},[173,4481,3687],{"class":194},[173,4483,738],{"class":182},[173,4485,208],{"class":194},[173,4487,968],{"class":182},[173,4489,3480],{"class":921},[173,4491,3653],{"class":921},[173,4493,3701],{"class":921},[173,4495,3704],{"class":921},[173,4497,4498,4500,4502,4504,4506,4508,4510,4512,4514],{"class":175,"line":654},[173,4499,3709],{"class":194},[173,4501,738],{"class":182},[173,4503,208],{"class":194},[173,4505,968],{"class":182},[173,4507,3480],{"class":921},[173,4509,3653],{"class":921},[173,4511,3656],{"class":921},[173,4513,3659],{"class":921},[173,4515,3704],{"class":921},[173,4517,4518],{"class":175,"line":659},[173,4519,3614],{"class":921},[173,4521,4522],{"class":175,"line":666},[173,4523,3204],{"class":182},[173,4525,4526],{"class":175,"line":890},[173,4527,3738],{"class":921},[173,4529,4530],{"class":175,"line":903},[173,4531,3306],{"class":182},[30,4533,4534],{},"Le temps de réponse a grandement diminué, on utilise un index et on examine beaucoup moins de\ndocuments.",[30,4536,4537],{},"Mais il est encore possible d’améliorer notre résultat en examinant des indexes à la place des\ndocuments.",[30,4539,4540],{},"Supprimons notre index pour en créer un autre :",[165,4542,4544],{"className":3339,"code":4543,"language":3341,"meta":10,"style":10},"db.getCollection(\"transactions\").createIndex({\n  id_user: 1,\n  \"subdivisions.accounting_account\": 1,\n  date: 1,\n});\n",[42,4545,4546,4563,4572,4583,4592],{"__ignoreMap":10},[173,4547,4548,4550,4552,4554,4556,4558,4561],{"class":175,"line":18},[173,4549,3348],{"class":182},[173,4551,3351],{"class":936},[173,4553,1874],{"class":182},[173,4555,4043],{"class":734},[173,4557,3359],{"class":182},[173,4559,4560],{"class":936},"createIndex",[173,4562,4055],{"class":182},[173,4564,4565,4568,4570],{"class":175,"line":11},[173,4566,4567],{"class":182},"  id_user: ",[173,4569,271],{"class":194},[173,4571,744],{"class":182},[173,4573,4574,4577,4579,4581],{"class":175,"line":243},[173,4575,4576],{"class":734},"  \"subdivisions.accounting_account\"",[173,4578,738],{"class":182},[173,4580,271],{"class":194},[173,4582,744],{"class":182},[173,4584,4585,4588,4590],{"class":175,"line":291},[173,4586,4587],{"class":182},"  date: ",[173,4589,271],{"class":194},[173,4591,744],{"class":182},[173,4593,4594],{"class":175,"line":296},[173,4595,4596],{"class":182},"});\n",[30,4598,4599],{},"Ce qui nous donne :",[165,4601,4603],{"className":3145,"code":4602,"language":3147,"meta":10,"style":10},"{\n    \"queryPlanner\": {\n        \"winningPlan\": {\n            \"stage\": \"FETCH\",\n            \"inputStage\": {\n                \"stage\": \"IXSCAN\",\n                \"indexName\": \"id_user_1_subdivisions.accounting_account_1_date_1\", -- index utilisé\n                ...\n            },\n        },\n        \"rejectedPlans\": []\n    },\n    \"executionStats\": {\n        \"executionSuccess\": true,\n        \"nReturned\": 5, -- nombre de documents retournés\n        \"executionTimeMillis\": 5, -- temps de réponse\n        \"totalKeysExamined\": 45, -- nombre d'indexes examinés\n        \"totalDocsExamined\": 5, -- nombre de documents examinés\n        ...\n    },\n    ...\n}\n",[42,4604,4605,4609,4615,4621,4631,4637,4647,4664,4668,4672,4676,4683,4687,4693,4703,4723,4741,4760,4780,4784,4788,4792],{"__ignoreMap":10},[173,4606,4607],{"class":175,"line":18},[173,4608,3154],{"class":182},[173,4610,4611,4613],{"class":175,"line":11},[173,4612,3453],{"class":194},[173,4614,3174],{"class":182},[173,4616,4617,4619],{"class":175,"line":243},[173,4618,3474],{"class":194},[173,4620,3174],{"class":182},[173,4622,4623,4625,4627,4629],{"class":175,"line":291},[173,4624,3491],{"class":194},[173,4626,738],{"class":182},[173,4628,3497],{"class":734},[173,4630,744],{"class":182},[173,4632,4633,4635],{"class":175,"line":296},[173,4634,3515],{"class":194},[173,4636,3174],{"class":182},[173,4638,4639,4641,4643,4645],{"class":175,"line":343},[173,4640,3522],{"class":194},[173,4642,738],{"class":182},[173,4644,3527],{"class":734},[173,4646,744],{"class":182},[173,4648,4649,4651,4653,4656,4658,4660,4662],{"class":175,"line":348},[173,4650,3556],{"class":194},[173,4652,738],{"class":182},[173,4654,4655],{"class":734},"\"id_user_1_subdivisions.accounting_account_1_date_1\"",[173,4657,968],{"class":182},[173,4659,3480],{"class":921},[173,4661,4383],{"class":921},[173,4663,3486],{"class":921},[173,4665,4666],{"class":175,"line":393},[173,4667,3591],{"class":921},[173,4669,4670],{"class":175,"line":398},[173,4671,4394],{"class":182},[173,4673,4674],{"class":175,"line":449},[173,4675,3601],{"class":182},[173,4677,4678,4680],{"class":175,"line":454},[173,4679,3606],{"class":194},[173,4681,4682],{"class":182},": []\n",[173,4684,4685],{"class":175,"line":499},[173,4686,3204],{"class":182},[173,4688,4689,4691],{"class":175,"line":504},[173,4690,3623],{"class":194},[173,4692,3174],{"class":182},[173,4694,4695,4697,4699,4701],{"class":175,"line":553},[173,4696,3630],{"class":194},[173,4698,738],{"class":182},[173,4700,3249],{"class":194},[173,4702,744],{"class":182},[173,4704,4705,4707,4709,4711,4713,4715,4717,4719,4721],{"class":175,"line":558},[173,4706,3641],{"class":194},[173,4708,738],{"class":182},[173,4710,428],{"class":194},[173,4712,968],{"class":182},[173,4714,3480],{"class":921},[173,4716,3653],{"class":921},[173,4718,3656],{"class":921},[173,4720,3659],{"class":921},[173,4722,4234],{"class":921},[173,4724,4725,4727,4729,4731,4733,4735,4737,4739],{"class":175,"line":603},[173,4726,3667],{"class":194},[173,4728,738],{"class":182},[173,4730,428],{"class":194},[173,4732,968],{"class":182},[173,4734,3480],{"class":921},[173,4736,3679],{"class":921},[173,4738,3656],{"class":921},[173,4740,4254],{"class":921},[173,4742,4743,4745,4747,4750,4752,4754,4756,4758],{"class":175,"line":608},[173,4744,3687],{"class":194},[173,4746,738],{"class":182},[173,4748,4749],{"class":194},"45",[173,4751,968],{"class":182},[173,4753,3480],{"class":921},[173,4755,3653],{"class":921},[173,4757,3701],{"class":921},[173,4759,3704],{"class":921},[173,4761,4762,4764,4766,4768,4770,4772,4774,4776,4778],{"class":175,"line":654},[173,4763,3709],{"class":194},[173,4765,738],{"class":182},[173,4767,428],{"class":194},[173,4769,968],{"class":182},[173,4771,3480],{"class":921},[173,4773,3653],{"class":921},[173,4775,3656],{"class":921},[173,4777,3659],{"class":921},[173,4779,3704],{"class":921},[173,4781,4782],{"class":175,"line":659},[173,4783,3614],{"class":921},[173,4785,4786],{"class":175,"line":666},[173,4787,3204],{"class":182},[173,4789,4790],{"class":175,"line":890},[173,4791,3738],{"class":921},[173,4793,4794],{"class":175,"line":903},[173,4795,3306],{"class":182},[30,4797,4798],{},"Avec cette index, le nombre de documents examinés est égal au nombre de documents retournés. Le\nnombre d’indexes examinés a augmenté mais cela n’est pas un problème pour les performances sur cet\nordre de grandeur.",[30,4800,4801],{},"Attention toutefois, ici l’exemple ne s’appuie que sur une seule requête. Il est peu probable que\nvous ayez à faire une seule requête par collection. Il vous faudra alors penser vos index pour\nqu’ils servent sur la majorité de vos requêtes.",[30,4803,4804],{},"Créer des index dans tous les sens pourra aussi vous desservir : Mongo choisira d’utiliser un des\nindexes créés, il est possible que ce ne soit pas forcément celui auquel vous pensiez !",[30,4806,4807,4808,4813,4814],{},"Pour visualiser l’utilisation de vos indexes, utilisez\n",[34,4809,4812],{"href":4810,"rel":4811},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Freference\u002Foperator\u002Faggregation\u002FindexStats\u002F",[38],"$indexStats"," :\n",[42,4815,4816],{},"db.getCollection('transactions').aggregate( [ { $indexStats: { } } ] )",[50,4818,4820],{"id":4819},"monitorer","Monitorer",[30,4822,4823],{},"Les graphiques disponibles sur Atlas présentés plus haut nous donnent une idée de l’état de la base\nà un instant t. Sur Query Executor et Query Targeting il n’est pas possible de différencier les\ncollections. Sur le Profiler, c’est un petit peu plus précis, mais on ne peut remonter que sur les\ndernières 24h.",[30,4825,4826],{},"Pour avoir une vue plus globale des évolutions de performance suite aux différentes modifications,\nil est possible de monitorer les temps de réponse des routes. Certes, on mesurera tout un tas de\nchoses en plus de “l’amélioration de la requête”, mais cela permet de voir si notre feature a besoin\nde plus de travail (possiblement autre que sur Mongo).",[30,4828,4829,4830,4835],{},"Par exemple, une des requêtes améliorées lors de nos sessions avec la\n",[34,4831,4834],{"href":4832,"rel":4833},"https:\u002F\u002Ftech.indy.fr\u002F2022\u002F03\u002F03\u002Fles-guildes\u002F",[38],"guilde Mongo"," a été monitorée. Cette route ne fait\nqu’une requête Mongo et peu de traitements JS, nous étions donc assez confiants sur les impacts\npositifs de notre travail.",[30,4837,4838],{},[110,4839],{"alt":10,"src":4840},"\u002Fimages\u002FCapture-decran-2022-07-21-a-17.08.18.png",[50,4842,4844],{"id":4843},"pour-aller-plus-loin","Pour aller plus loin …",[3033,4846,4847,4860,4872],{},[3036,4848,4849,4853,4857],{},[4850,4851,4852],"strong",{},"Créer un index B-tree composé efficace",[34,4854],{"href":4855,"rel":4856},"https:\u002F\u002Ftech.indy.fr\u002F2022\u002F04\u002F07\u002Fcreer-un-index-b-tree-compose-efficace\u002F",[38],[34,4858,4855],{"href":4855,"rel":4859},[38],[3036,4861,4862,4865,4869],{},[4850,4863,4864],{},"Let’s .explain() MongoDB Performance | Twitch Live Coding",[34,4866],{"href":4867,"rel":4868},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=HAtnkHw_fJ8",[38],[34,4870,4867],{"href":4867,"rel":4871},[38],[3036,4873,4874,4877,4881],{},[4850,4875,4876],{},"Mongo University",[34,4878],{"href":4879,"rel":4880},"https:\u002F\u002Funiversity.mongodb.com\u002Fcourses\u002FM201\u002Fabout",[38],[34,4882,4879],{"href":4879,"rel":4883},[38],[2972,4885,4886],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":10,"searchDepth":11,"depth":11,"links":4888},[4889,4894,4897,4901,4902],{"id":3007,"depth":11,"text":3008,"children":4890},[4891,4892,4893],{"id":3020,"depth":243,"text":3021},{"id":3027,"depth":243,"text":3028},{"id":3076,"depth":243,"text":3077},{"id":3098,"depth":11,"text":3099,"children":4895},[4896],{"id":3119,"depth":243,"text":3120},{"id":3315,"depth":11,"text":3316,"children":4898},[4899,4900],{"id":3319,"depth":243,"text":3320},{"id":3834,"depth":243,"text":3835},{"id":4819,"depth":11,"text":4820},{"id":4843,"depth":11,"text":4844},"2023-03-30","Quoi de plus frustrant qu’un site qui rame ? Rien. Si à chaque clic l’utilisateur·rice doit patienter en cherchant des formes dans les nuages pour faire passer le temps, pas sûr que grand monde reste sur votre site …",{},"\u002Farticles\u002F2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain",{"title":2996,"description":4904},"articles\u002F2023-03-30-ameliorer-ses-requetes-mongo-avec-atlas-et-explain",[2991],"dZk8IGcORfEaBLtD9YjVkSNHAY49-uihMaHIjrUtu3w",{"id":4912,"title":4913,"author":26,"body":4914,"date":4956,"description":4957,"extension":13,"lang":2985,"meta":4958,"navigation":16,"path":4959,"published":16,"readingTime":243,"seo":4960,"stem":4961,"tags":4962,"__hash__":4964},"articles\u002Farticles\u002F2022-03-03-les-guildes.md","Les guildes",{"type":7,"value":4915,"toc":4952},[4916,4920,4923,4926,4929,4932,4936,4939,4942,4949],[50,4917,4919],{"id":4918},"les-guildes-techniques","Les guildes techniques",[30,4921,4922],{},"Chez Indy, l'équipe tech est composée de plusieurs squads qui comprennent un Product Manager, un\nlead ainsi qu'un ou plusieurs devs. Ces squads travaillent indépendamment sur des sujets divers et\nsont parfois amenées à travailler ensemble à court terme sur un sujet commun de refacto ou lors des\nphases de conception.",[30,4924,4925],{},"Cependant, il est parfois un peu compliqué de créer du lien inter-squad.",[30,4927,4928],{},"De là est née l'envie de créer un autre format d'équipe, qui serait transverse aux squads : les\nguildes. N'importe qui pourrait alors proposer un sujet sur lequel il ou elle a envie de travailler,\nles interessé(e)s se manifestent pour ainsi former un groupe, idéalement avec une personne par squad\npour creuser ce sujet.",[30,4930,4931],{},"Les guildes n'ont pas d'obligation de résultat, ni de roadmap imposée, elles sont là pour étudier en\namont des sujets qui sont ensuite proposés à l'ensemble de l'équipe tech pour validation. Elles se\nréunissent 1h par semaine ou toutes les 2 semaines et choisissent elles-même les sujets sur lesquels\nelles veulent travailler. Les participants ne sont pas forcément experts du sujet mais ont envie de\nse former dessus.",[50,4933,4935],{"id":4934},"exemple-de-guildes","Exemple de guildes",[30,4937,4938],{},"Deux guildes sont déjà en place : une guilde Mongo et une guilde TypeScript.",[30,4940,4941],{},"La guilde TypeScript a étudié la possibilité de migrer l'app vers TypeScript, puis après validation\nde l'équipe tech, a permis que l'app puisse vivre à la fois en Javascript et en TypeScript, pour que\nchaque personne puisse (ou non, car ce n'est pas obligatoire) coder avec ce qu'elle préfère. Cela\nnous permet ainsi de tester sur une petite partie de l'app et dans plusieurs cas, si TypeScript est\nadapté ou non à nos besoins.",[30,4943,4944,4945,99],{},"La guilde Mongo travaille quant à elle sur l'optimisation des index, elle est aussi intervenue sur\nle sujet de l'automatisation des migrations de données ou encore la mise en place d'une BDD de\nstaging pour des tests de performance. La première action de cette guilde lors de sa création a\nd'ailleurs été de passer un\n",[34,4946,4948],{"href":4879,"rel":4947},[38],"cours Atlas sur les index",[30,4950,4951],{},"En résumé, on peut voir ces guildes comme un moyen de veille et de formation en petit groupe. C'est\naussi l'occasion de travailler avec d'autres collègues, et ainsi d'échanger sur des besoins ou des\nméthodes qui gagnent à être partagés.",{"title":10,"searchDepth":11,"depth":11,"links":4953},[4954,4955],{"id":4918,"depth":11,"text":4919},{"id":4934,"depth":11,"text":4935},"2022-03-03","Chez Indy, l'équipe tech est composée de plusieurs squads qui comprennent un Product Manager, un lead ainsi qu'un ou plusieurs devs...",{},"\u002Farticles\u002F2022-03-03-les-guildes",{"title":4913,"description":4957},"articles\u002F2022-03-03-les-guildes",[2991,4963],"Organisation","N6SG4UPWOk88awHvYyliBERbcrG8X8Wwc--CamLtYnE",[4966,4979,4991,5004,5017,5029,5041,5054,5061,5074,5086,5098,5111,5123,5135,5147,5159,5171,5183,5195,5208,5220,5232,5245,5257,5269],{"id":4967,"title":4968,"body":4969,"description":10,"extension":13,"meta":4973,"name":4974,"navigation":16,"path":4975,"readingTime":18,"seo":4976,"stem":4977,"__hash__":4978},"authors\u002Fauthors\u002Falexandre-guillon.md","Software Engineer",{"type":7,"value":4970,"toc":4971},[],{"title":10,"searchDepth":11,"depth":11,"links":4972},[],{},"Alexandre Guillon","\u002Fauthors\u002Falexandre-guillon",{"title":4968,"description":10},"authors\u002Falexandre-guillon","4tf48mjyjFNqItOHaulICbrjeCyMag1o6801uHeTz98",{"id":4980,"title":4968,"body":4981,"description":10,"extension":13,"meta":4985,"name":4986,"navigation":16,"path":4987,"readingTime":18,"seo":4988,"stem":4989,"__hash__":4990},"authors\u002Fauthors\u002Falexis-ablain.md",{"type":7,"value":4982,"toc":4983},[],{"title":10,"searchDepth":11,"depth":11,"links":4984},[],{},"Alexis Ablain","\u002Fauthors\u002Falexis-ablain",{"title":4968,"description":10},"authors\u002Falexis-ablain","_SIAtB7f-39e5t3GiJof81NP47s6MGo2n4gaHkTy1uQ",{"id":4992,"title":4993,"body":4994,"description":10,"extension":13,"meta":4998,"name":4999,"navigation":16,"path":5000,"readingTime":18,"seo":5001,"stem":5002,"__hash__":5003},"authors\u002Fauthors\u002Faxel-shaita.md","Engineering Manager",{"type":7,"value":4995,"toc":4996},[],{"title":10,"searchDepth":11,"depth":11,"links":4997},[],{},"Axel Shaïta","\u002Fauthors\u002Faxel-shaita",{"title":4993,"description":10},"authors\u002Faxel-shaita","fK0argUhsBkWLjpTAhY13oYLVzQthcEYkCEdtHWmIgE",{"id":5005,"title":5006,"body":5007,"description":10,"extension":13,"meta":5011,"name":5012,"navigation":16,"path":5013,"readingTime":18,"seo":5014,"stem":5015,"__hash__":5016},"authors\u002Fauthors\u002Fbaptiste-faure.md","Head of Talent Acquisition",{"type":7,"value":5008,"toc":5009},[],{"title":10,"searchDepth":11,"depth":11,"links":5010},[],{},"Baptiste Faure","\u002Fauthors\u002Fbaptiste-faure",{"title":5006,"description":10},"authors\u002Fbaptiste-faure","ELisToYtcgHmgdVWZkCclTPV6exZtfyXqhpx1jjbJHs",{"id":5018,"title":4968,"body":5019,"description":10,"extension":13,"meta":5023,"name":5024,"navigation":16,"path":5025,"readingTime":18,"seo":5026,"stem":5027,"__hash__":5028},"authors\u002Fauthors\u002Fbenjamin-bouillot.md",{"type":7,"value":5020,"toc":5021},[],{"title":10,"searchDepth":11,"depth":11,"links":5022},[],{},"Benjamin Bouillot","\u002Fauthors\u002Fbenjamin-bouillot",{"title":4968,"description":10},"authors\u002Fbenjamin-bouillot","tbhCFZyfTt7ZM5b5YgqQ2nhgnSTl8BweaQQryc87fHo",{"id":5030,"title":4993,"body":5031,"description":10,"extension":13,"meta":5035,"name":5036,"navigation":16,"path":5037,"readingTime":18,"seo":5038,"stem":5039,"__hash__":5040},"authors\u002Fauthors\u002Fcedric-nicoloso.md",{"type":7,"value":5032,"toc":5033},[],{"title":10,"searchDepth":11,"depth":11,"links":5034},[],{},"Cédric Nicoloso","\u002Fauthors\u002Fcedric-nicoloso",{"title":4993,"description":10},"authors\u002Fcedric-nicoloso","ibSoh4VZYiWYTuLOnZTedaAfcnvet1Q9H7ogW0LgorY",{"id":5042,"title":5043,"body":5044,"description":10,"extension":13,"meta":5048,"name":5049,"navigation":16,"path":5050,"readingTime":18,"seo":5051,"stem":5052,"__hash__":5053},"authors\u002Fauthors\u002Fdavid-touzet.md","Staff Engineer",{"type":7,"value":5045,"toc":5046},[],{"title":10,"searchDepth":11,"depth":11,"links":5047},[],{},"David Touzet","\u002Fauthors\u002Fdavid-touzet",{"title":5043,"description":10},"authors\u002Fdavid-touzet","dHWwnQxb1Ubt-WwXWEODGEo9AFoq1cJUhfg3kdnYSBM",{"id":4,"title":5,"body":5055,"description":10,"extension":13,"meta":5059,"name":15,"navigation":16,"path":17,"readingTime":18,"seo":5060,"stem":20,"__hash__":21},{"type":7,"value":5056,"toc":5057},[],{"title":10,"searchDepth":11,"depth":11,"links":5058},[],{},{"title":5,"description":10},{"id":5062,"title":5063,"body":5064,"description":10,"extension":13,"meta":5068,"name":5069,"navigation":16,"path":5070,"readingTime":18,"seo":5071,"stem":5072,"__hash__":5073},"authors\u002Fauthors\u002Femmanuel-auclair.md","Staff engineer",{"type":7,"value":5065,"toc":5066},[],{"title":10,"searchDepth":11,"depth":11,"links":5067},[],{},"Emmanuel Auclair","\u002Fauthors\u002Femmanuel-auclair",{"title":5063,"description":10},"authors\u002Femmanuel-auclair","MtsA8THNLEn0dTtYEIQaGwDuf7MjQL55IOeei5gugEg",{"id":5075,"title":4968,"body":5076,"description":10,"extension":13,"meta":5080,"name":5081,"navigation":16,"path":5082,"readingTime":18,"seo":5083,"stem":5084,"__hash__":5085},"authors\u002Fauthors\u002Fhoreb-parraud.md",{"type":7,"value":5077,"toc":5078},[],{"title":10,"searchDepth":11,"depth":11,"links":5079},[],{},"Horeb Parraud","\u002Fauthors\u002Fhoreb-parraud",{"title":4968,"description":10},"authors\u002Fhoreb-parraud","ajjsnUX4ohZI-ghMdbb92q_taWDkKXVZSLZXoAeLQtg",{"id":5087,"title":4993,"body":5088,"description":10,"extension":13,"meta":5092,"name":5093,"navigation":16,"path":5094,"readingTime":18,"seo":5095,"stem":5096,"__hash__":5097},"authors\u002Fauthors\u002Fhugo-contreras.md",{"type":7,"value":5089,"toc":5090},[],{"title":10,"searchDepth":11,"depth":11,"links":5091},[],{},"Hugo Contreras","\u002Fauthors\u002Fhugo-contreras",{"title":4993,"description":10},"authors\u002Fhugo-contreras","2nc3VMu9ASq9Z6Pwx2-7-Ye991Pww4p-UEDBQFfjF-Q",{"id":5099,"title":5100,"body":5101,"description":10,"extension":13,"meta":5105,"name":5106,"navigation":16,"path":5107,"readingTime":18,"seo":5108,"stem":5109,"__hash__":5110},"authors\u002Fauthors\u002Fjulien-tassin.md","Head of Engineering",{"type":7,"value":5102,"toc":5103},[],{"title":10,"searchDepth":11,"depth":11,"links":5104},[],{},"Julien Tassin","\u002Fauthors\u002Fjulien-tassin",{"title":5100,"description":10},"authors\u002Fjulien-tassin","iUIHI7SITje38Jh9X9uvYs4-VsHx4eCdt6hAlyLFG_o",{"id":5112,"title":4968,"body":5113,"description":10,"extension":13,"meta":5117,"name":5118,"navigation":16,"path":5119,"readingTime":18,"seo":5120,"stem":5121,"__hash__":5122},"authors\u002Fauthors\u002Flaurent-renard.md",{"type":7,"value":5114,"toc":5115},[],{"title":10,"searchDepth":11,"depth":11,"links":5116},[],{},"Laurent Renard","\u002Fauthors\u002Flaurent-renard",{"title":4968,"description":10},"authors\u002Flaurent-renard","5BP7Ed-pt1SQHjh0UJ1XUrlLTcdlFaDoKBCP4deHq8A",{"id":5124,"title":4968,"body":5125,"description":10,"extension":13,"meta":5129,"name":5130,"navigation":16,"path":5131,"readingTime":18,"seo":5132,"stem":5133,"__hash__":5134},"authors\u002Fauthors\u002Fleo-martin.md",{"type":7,"value":5126,"toc":5127},[],{"title":10,"searchDepth":11,"depth":11,"links":5128},[],{},"Léo Martin","\u002Fauthors\u002Fleo-martin",{"title":4968,"description":10},"authors\u002Fleo-martin","eYxCHkRgbGDV7shKdTA9s7Tu0zGV4yDGFoKR5MHQntY",{"id":5136,"title":4968,"body":5137,"description":10,"extension":13,"meta":5141,"name":5142,"navigation":16,"path":5143,"readingTime":18,"seo":5144,"stem":5145,"__hash__":5146},"authors\u002Fauthors\u002Floic-bousquet.md",{"type":7,"value":5138,"toc":5139},[],{"title":10,"searchDepth":11,"depth":11,"links":5140},[],{},"Loïc Bousquet","\u002Fauthors\u002Floic-bousquet",{"title":4968,"description":10},"authors\u002Floic-bousquet","ko12qZwiGL8XNjAoy9oWypPkIjr29Pbq7vhdtgldqeQ",{"id":5148,"title":4968,"body":5149,"description":10,"extension":13,"meta":5153,"name":5154,"navigation":16,"path":5155,"readingTime":18,"seo":5156,"stem":5157,"__hash__":5158},"authors\u002Fauthors\u002Floic-poullain.md",{"type":7,"value":5150,"toc":5151},[],{"title":10,"searchDepth":11,"depth":11,"links":5152},[],{},"Loïc Poullain","\u002Fauthors\u002Floic-poullain",{"title":4968,"description":10},"authors\u002Floic-poullain","oRIyJhFRTqxy5dLCYQ2OnYZ1DB-gLDUM-85vTSYuTF0",{"id":5160,"title":5,"body":5161,"description":10,"extension":13,"meta":5165,"name":5166,"navigation":16,"path":5167,"readingTime":18,"seo":5168,"stem":5169,"__hash__":5170},"authors\u002Fauthors\u002Fmaud-lelu.md",{"type":7,"value":5162,"toc":5163},[],{"title":10,"searchDepth":11,"depth":11,"links":5164},[],{},"Maud Lélu","\u002Fauthors\u002Fmaud-lelu",{"title":5,"description":10},"authors\u002Fmaud-lelu","MMbsCKuE41OMHusrl12FIEsI-Trx7l8Nn_ANhvj2_y4",{"id":5172,"title":4993,"body":5173,"description":10,"extension":13,"meta":5177,"name":5178,"navigation":16,"path":5179,"readingTime":18,"seo":5180,"stem":5181,"__hash__":5182},"authors\u002Fauthors\u002Fnicolas-poirier.md",{"type":7,"value":5174,"toc":5175},[],{"title":10,"searchDepth":11,"depth":11,"links":5176},[],{},"Nicolas Poirier","\u002Fauthors\u002Fnicolas-poirier",{"title":4993,"description":10},"authors\u002Fnicolas-poirier","dXrJkYo8az4SN_D23aYc3fQ7z8s1dR2a0lt1ogjAjJs",{"id":5184,"title":4993,"body":5185,"description":10,"extension":13,"meta":5189,"name":5190,"navigation":16,"path":5191,"readingTime":18,"seo":5192,"stem":5193,"__hash__":5194},"authors\u002Fauthors\u002Fraphael-sauget.md",{"type":7,"value":5186,"toc":5187},[],{"title":10,"searchDepth":11,"depth":11,"links":5188},[],{},"Raphaël Sauget","\u002Fauthors\u002Fraphael-sauget",{"title":4993,"description":10},"authors\u002Fraphael-sauget","Uri9bcq0QDuxRA0PbBoNtu7p_5L3dALu4kzcXVW0xyM",{"id":5196,"title":5197,"body":5198,"description":10,"extension":13,"meta":5202,"name":5203,"navigation":16,"path":5204,"readingTime":18,"seo":5205,"stem":5206,"__hash__":5207},"authors\u002Fauthors\u002Fromain-koenig.md","Co-funder & Head of innovation",{"type":7,"value":5199,"toc":5200},[],{"title":10,"searchDepth":11,"depth":11,"links":5201},[],{},"Romain Koenig","\u002Fauthors\u002Fromain-koenig",{"title":5197,"description":10},"authors\u002Fromain-koenig","uyS8--eG2_ezyqRABcJnMJmQKKuSArhPWd14aUvFeEw",{"id":5209,"title":4993,"body":5210,"description":10,"extension":13,"meta":5214,"name":5215,"navigation":16,"path":5216,"readingTime":18,"seo":5217,"stem":5218,"__hash__":5219},"authors\u002Fauthors\u002Fromaric-juniet.md",{"type":7,"value":5211,"toc":5212},[],{"title":10,"searchDepth":11,"depth":11,"links":5213},[],{},"Romaric Juniet","\u002Fauthors\u002Fromaric-juniet",{"title":4993,"description":10},"authors\u002Fromaric-juniet","4Zb2artgT-eo-PHLXi3xi4d5t7s6PfhUxeSfXIikSUY",{"id":5221,"title":4968,"body":5222,"description":10,"extension":13,"meta":5226,"name":5227,"navigation":16,"path":5228,"readingTime":18,"seo":5229,"stem":5230,"__hash__":5231},"authors\u002Fauthors\u002Fstanyslas-bres.md",{"type":7,"value":5223,"toc":5224},[],{"title":10,"searchDepth":11,"depth":11,"links":5225},[],{},"Stanyslas Bres","\u002Fauthors\u002Fstanyslas-bres",{"title":4968,"description":10},"authors\u002Fstanyslas-bres","Xa0SahETuiN4q1jrmR2ych3moAqcZ2LbU7vSfEt2RuU",{"id":5233,"title":5234,"body":5235,"description":10,"extension":13,"meta":5239,"name":5240,"navigation":16,"path":5241,"readingTime":18,"seo":5242,"stem":5243,"__hash__":5244},"authors\u002Fauthors\u002Ftalent-acquisition.md","Talent Acquisition",{"type":7,"value":5236,"toc":5237},[],{"title":10,"searchDepth":11,"depth":11,"links":5238},[],{},"Équipe Talent Acquisition","\u002Fauthors\u002Ftalent-acquisition",{"description":10},"authors\u002Ftalent-acquisition","doDfE76txftQ4wIiKjJoDmSpyzSKk0tzlgVAp6-opAY",{"id":5246,"title":4968,"body":5247,"description":10,"extension":13,"meta":5251,"name":5252,"navigation":16,"path":5253,"readingTime":18,"seo":5254,"stem":5255,"__hash__":5256},"authors\u002Fauthors\u002Fvictor-borg.md",{"type":7,"value":5248,"toc":5249},[],{"title":10,"searchDepth":11,"depth":11,"links":5250},[],{},"Victor Borg","\u002Fauthors\u002Fvictor-borg",{"title":4968,"description":10},"authors\u002Fvictor-borg","-Za-JweoiP6hyclue_WkxMXdRUDTczPGlJf6AZckjUc",{"id":5258,"title":4968,"body":5259,"description":10,"extension":13,"meta":5263,"name":5264,"navigation":16,"path":5265,"readingTime":18,"seo":5266,"stem":5267,"__hash__":5268},"authors\u002Fauthors\u002Fvirgil-roger.md",{"type":7,"value":5260,"toc":5261},[],{"title":10,"searchDepth":11,"depth":11,"links":5262},[],{},"Virgil Roger","\u002Fauthors\u002Fvirgil-roger",{"title":4968,"description":10},"authors\u002Fvirgil-roger","DfVFe5j0bCgXeEr381ZYOM5DP4m-pWb93J9-m_muKJ0",{"id":5270,"title":4968,"body":5271,"description":10,"extension":13,"meta":5275,"name":5276,"navigation":16,"path":5277,"readingTime":18,"seo":5278,"stem":5279,"__hash__":5280},"authors\u002Fauthors\u002Fyukan-zhao.md",{"type":7,"value":5272,"toc":5273},[],{"title":10,"searchDepth":11,"depth":11,"links":5274},[],{},"Yukan Zhao","\u002Fauthors\u002Fyukan-zhao",{"title":4968,"description":10},"authors\u002Fyukan-zhao","LRPHugtAJnWHsmHxy9_SR5Zas_C5p-GR_uHEs1Fhk_E",1778159244497]