[{"data":1,"prerenderedAt":4876},["ShallowReactive",2],{"navigation":3,"\u002Factions-and-metrics\u002Fmetrics":307,"\u002Factions-and-metrics\u002Fmetrics-surround":4871},{"3.x":4,"2.x":203},[5,32,61,99,121,147,165],{"title":6,"icon":7,"path":8,"stem":9,"children":10,"page":31},"Getting Started","i-heroicons-star","\u002Fgetting-started","1.getting-started",[11,15,19,23,27],{"title":12,"path":13,"stem":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":16,"path":17,"stem":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":20,"path":21,"stem":22},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":24,"path":25,"stem":26},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F4.configuration",{"title":28,"path":29,"stem":30},"Upgrade guide","\u002Fgetting-started\u002Fupgrade-guide","1.getting-started\u002F5.upgrade-guide",false,{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":31},"Resources","i-heroicons-document-text","\u002Fresources","2.resources",[38,41,45,49,53,57],{"title":33,"path":39,"stem":40},"\u002Fresources\u002Fresources","2.resources\u002F1.resources",{"title":42,"path":43,"stem":44},"Fields","\u002Fresources\u002Ffields","2.resources\u002F2.fields",{"title":46,"path":47,"stem":48},"Relationships","\u002Fresources\u002Frelations","2.resources\u002F3.relations",{"title":50,"path":51,"stem":52},"Validation","\u002Fresources\u002Fvalidation","2.resources\u002F4.validation",{"title":54,"path":55,"stem":56},"Perimeter","\u002Fresources\u002Fperimeter","2.resources\u002F5.perimeter",{"title":58,"path":59,"stem":60},"Limits","\u002Fresources\u002Flimits","2.resources\u002F6.limits",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":31},"Search","i-heroicons-magnifying-glass","\u002Fsearch","3.search",[67,71,75,79,83,87,91,95],{"title":68,"path":69,"stem":70},"Search overview","\u002Fsearch\u002Foverview","3.search\u002F1.overview",{"title":72,"path":73,"stem":74},"Search filters","\u002Fsearch\u002Ffilters","3.search\u002F2.filters",{"title":76,"path":77,"stem":78},"Sorts and selects","\u002Fsearch\u002Fsorts-and-selects","3.search\u002F3.sorts-and-selects",{"title":80,"path":81,"stem":82},"Includes and aggregates","\u002Fsearch\u002Fincludes-and-aggregates","3.search\u002F4.includes-and-aggregates",{"title":84,"path":85,"stem":86},"Scopes and instructions","\u002Fsearch\u002Fscopes-and-instructions","3.search\u002F5.scopes-and-instructions",{"title":88,"path":89,"stem":90},"Text search","\u002Fsearch\u002Ftext-search","3.search\u002F6.text-search",{"title":92,"path":93,"stem":94},"Search engines","\u002Fsearch\u002Fsearch-engines","3.search\u002F7.search-engines",{"title":96,"path":97,"stem":98},"Searching outside HTTP","\u002Fsearch\u002Foutside-http","3.search\u002F8.outside-http",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":31},"Writing","i-heroicons-pencil-square","\u002Fwriting","4.writing",[105,109,113,117],{"title":106,"path":107,"stem":108},"Mutate","\u002Fwriting\u002Fmutate","4.writing\u002F1.mutate",{"title":110,"path":111,"stem":112},"Writing relations","\u002Fwriting\u002Frelations","4.writing\u002F2.relations",{"title":114,"path":115,"stem":116},"Versioned rows","\u002Fwriting\u002Fversioned-rows","4.writing\u002F3.versioned-rows",{"title":118,"path":119,"stem":120},"Deleting and restoring","\u002Fwriting\u002Fdeleting","4.writing\u002F4.deleting",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":31},"Actions and Metrics","i-heroicons-bolt","\u002Factions-and-metrics","5.actions-and-metrics",[127,131,135,139,143],{"title":128,"path":129,"stem":130},"Actions","\u002Factions-and-metrics\u002Factions","5.actions-and-metrics\u002F1.actions",{"title":132,"path":133,"stem":134},"Queued Actions","\u002Factions-and-metrics\u002Fqueued-actions","5.actions-and-metrics\u002F2.queued-actions",{"title":136,"path":137,"stem":138},"Confirmation","\u002Factions-and-metrics\u002Fconfirmation","5.actions-and-metrics\u002F3.confirmation",{"title":140,"path":141,"stem":142},"Metrics","\u002Factions-and-metrics\u002Fmetrics","5.actions-and-metrics\u002F4.metrics",{"title":144,"path":145,"stem":146},"Exports","\u002Factions-and-metrics\u002Fexports","5.actions-and-metrics\u002F5.exports",{"title":148,"icon":149,"path":150,"stem":151,"children":152,"page":31},"Authorization","i-heroicons-lock-closed","\u002Fauthorization","6.authorization",[153,157,161],{"title":154,"path":155,"stem":156},"Policies","\u002Fauthorization\u002Fpolicies","6.authorization\u002F1.policies",{"title":158,"path":159,"stem":160},"Gates","\u002Fauthorization\u002Fgates","6.authorization\u002F2.gates",{"title":162,"path":163,"stem":164},"Decision Cache","\u002Fauthorization\u002Fdecision-cache","6.authorization\u002F3.decision-cache",{"title":166,"icon":167,"path":168,"stem":169,"children":170,"page":31},"Digging Deeper","i-heroicons-list-bullet","\u002Fdigging-deeper","7.digging-deeper",[171,175,179,183,187,191,195,199],{"title":172,"path":173,"stem":174},"Details","\u002Fdigging-deeper\u002Fdetails","7.digging-deeper\u002F1.details",{"title":176,"path":177,"stem":178},"Events and Hooks","\u002Fdigging-deeper\u002Fevents-and-hooks","7.digging-deeper\u002F2.events-and-hooks",{"title":180,"path":181,"stem":182},"Custom Responses","\u002Fdigging-deeper\u002Fresponses","7.digging-deeper\u002F3.responses",{"title":184,"path":185,"stem":186},"OpenAPI Documentation","\u002Fdigging-deeper\u002Fopenapi","7.digging-deeper\u002F4.openapi",{"title":188,"path":189,"stem":190},"Precognition","\u002Fdigging-deeper\u002Fprecognition","7.digging-deeper\u002F5.precognition",{"title":192,"path":193,"stem":194},"Artisan Commands","\u002Fdigging-deeper\u002Fartisan","7.digging-deeper\u002F6.artisan",{"title":196,"path":197,"stem":198},"Laravel Boost Skill","\u002Fdigging-deeper\u002Fai-skill","7.digging-deeper\u002F7.ai-skill",{"title":200,"path":201,"stem":202},"Translations","\u002Fdigging-deeper\u002Ftranslations","7.digging-deeper\u002F8.translations",[204,215,237,260,297],{"title":6,"icon":7,"path":205,"stem":206,"children":207,"page":31},"\u002F2.x\u002Fgetting-started","2.x\u002F1.getting-started",[208,211],{"title":16,"path":209,"stem":210},"\u002F2.x\u002Fgetting-started\u002Finstallation","2.x\u002F1.getting-started\u002F1.installation",{"title":212,"path":213,"stem":214},"Upgrade Guide","\u002F2.x\u002Fgetting-started\u002Fupgrade-guide","2.x\u002F1.getting-started\u002F2.upgrade-guide",{"title":216,"icon":217,"path":218,"stem":219,"children":220,"page":31},"Endpoints","i-heroicons-arrow-uturn-left","\u002F2.x\u002Fendpoints","2.x\u002F2.endpoints",[221,224,227,230,233],{"title":172,"path":222,"stem":223},"\u002F2.x\u002Fendpoints\u002Fdetails","2.x\u002F2.endpoints\u002F1.details",{"title":62,"path":225,"stem":226},"\u002F2.x\u002Fendpoints\u002Fsearch","2.x\u002F2.endpoints\u002F2.search",{"title":106,"path":228,"stem":229},"\u002F2.x\u002Fendpoints\u002Fmutate","2.x\u002F2.endpoints\u002F3.mutate",{"title":128,"path":231,"stem":232},"\u002F2.x\u002Fendpoints\u002Factions","2.x\u002F2.endpoints\u002F4.actions",{"title":234,"path":235,"stem":236},"Delete","\u002F2.x\u002Fendpoints\u002Fdelete","2.x\u002F2.endpoints\u002F5.delete",{"title":33,"icon":34,"path":238,"stem":239,"children":240,"page":31},"\u002F2.x\u002Fresources","2.x\u002F3.resources",[241,245,249,252,256],{"title":242,"path":243,"stem":244},"Basics","\u002F2.x\u002Fresources\u002Fbasics","2.x\u002F3.resources\u002F1.basics",{"title":246,"path":247,"stem":248},"Exposed Data","\u002F2.x\u002Fresources\u002Fexposed-data","2.x\u002F3.resources\u002F2.exposed-data",{"title":46,"path":250,"stem":251},"\u002F2.x\u002Fresources\u002Frelationships","2.x\u002F3.resources\u002F3.relationships",{"title":253,"path":254,"stem":255},"Validations","\u002F2.x\u002Fresources\u002Fvalidations","2.x\u002F3.resources\u002F4.validations",{"title":257,"path":258,"stem":259},"Interactions","\u002F2.x\u002Fresources\u002Finteractions","2.x\u002F3.resources\u002F5.interactions",{"title":166,"icon":167,"path":261,"stem":262,"children":263,"page":31},"\u002F2.x\u002Fdigging-deeper","2.x\u002F4.digging-deeper",[264,267,271,274,278,282,286,290,294],{"title":128,"path":265,"stem":266},"\u002F2.x\u002Fdigging-deeper\u002Factions","2.x\u002F4.digging-deeper\u002F1.actions",{"title":268,"path":269,"stem":270},"Hooks","\u002F2.x\u002Fdigging-deeper\u002Fhooks","2.x\u002F4.digging-deeper\u002F2.hooks",{"title":158,"path":272,"stem":273},"\u002F2.x\u002Fdigging-deeper\u002Fgates","2.x\u002F4.digging-deeper\u002F3.gates",{"title":275,"path":276,"stem":277},"Authorizations","\u002F2.x\u002Fdigging-deeper\u002Fauthorizations","2.x\u002F4.digging-deeper\u002F4.authorizations",{"title":279,"path":280,"stem":281},"Full Text Search","\u002F2.x\u002Fdigging-deeper\u002Ffull-text-search","2.x\u002F4.digging-deeper\u002F5.full-text-search",{"title":283,"path":284,"stem":285},"Instructions","\u002F2.x\u002Fdigging-deeper\u002Finstructions","2.x\u002F4.digging-deeper\u002F6.instructions",{"title":287,"path":288,"stem":289},"Responses","\u002F2.x\u002Fdigging-deeper\u002Fresponses","2.x\u002F4.digging-deeper\u002F7.responses",{"title":291,"path":292,"stem":293},"Documentation","\u002F2.x\u002Fdigging-deeper\u002Fdocumentation","2.x\u002F4.digging-deeper\u002F8.documentation",{"title":188,"path":295,"stem":296},"\u002F2.x\u002Fdigging-deeper\u002Fprecognition","2.x\u002F4.digging-deeper\u002F9.precognition",{"title":298,"icon":299,"path":300,"stem":301,"children":302,"page":31},"Integrations","i-lucide-puzzle","\u002F2.x\u002Fintegrations","2.x\u002F5.integrations",[303],{"title":304,"path":305,"stem":306},"Flutter","\u002F2.x\u002Fintegrations\u002Fflutter","2.x\u002F5.integrations\u002F1.flutter",{"id":308,"title":140,"body":309,"description":4864,"extension":4865,"links":4866,"meta":4867,"navigation":496,"path":141,"seo":4868,"sitemap":4869,"stem":142,"__hash__":4870},"docs3x\u002F5.actions-and-metrics\u002F4.metrics.md",{"type":310,"value":311,"toc":4847},"minimark",[312,321,326,338,387,411,678,685,731,796,800,810,821,832,902,905,1011,1089,1151,1153,1158,1224,1243,1263,1266,1271,1392,1584,1680,1685,1700,1752,1927,1933,1936,1941,1978,2040,2059,2062,2070,2272,2293,2567,2637,2641,2647,2688,3263,3318,3320,3325,3678,3969,4033,4037,4067,4114,4135,4139,4153,4469,4529,4574,4578,4584,4675,4752,4764,4768,4843],[313,314,315,316,320],"p",{},"A metric computes one result over the rows of a search: a count, a total, a breakdown, a series over time. It runs on the ",[317,318,319],"a",{"href":55},"perimeter"," of the resource and on the search that the client sends, so a dashboard reads the same rows as the list next to it.",[322,323,325],"h2",{"id":324},"defining-a-metric","Defining a metric",[313,327,328,329,333,334,337],{},"Generate a metric with ",[330,331,332],"code",{},"rest:metric",". The class is written in ",[330,335,336],{},"app\u002FRest\u002FMetrics",":",[339,340,345],"pre",{"className":341,"code":342,"language":343,"meta":344,"style":344},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","php artisan rest:metric TotalRevenue --type=value\nphp artisan rest:metric OrdersByStatus --type=partition --group-by=status\n","bash","",[330,346,347,369],{"__ignoreMap":344},[348,349,352,356,360,363,366],"span",{"class":350,"line":351},"line",1,[348,353,355],{"class":354},"sBMFI","php",[348,357,359],{"class":358},"sfazB"," artisan",[348,361,362],{"class":358}," rest:metric",[348,364,365],{"class":358}," TotalRevenue",[348,367,368],{"class":358}," --type=value\n",[348,370,372,374,376,378,381,384],{"class":350,"line":371},2,[348,373,355],{"class":354},[348,375,359],{"class":358},[348,377,362],{"class":358},[348,379,380],{"class":358}," OrdersByStatus",[348,382,383],{"class":358}," --type=partition",[348,385,386],{"class":358}," --group-by=status\n",[313,388,389,390,393,394,393,397,393,400,403,404,407,408,337],{},"Five built-in types compute the usual results in one query: ",[330,391,392],{},"Value",", ",[330,395,396],{},"Partition",[330,398,399],{},"Progress",[330,401,402],{},"Trend"," and ",[330,405,406],{},"Table",". Extend one and call its helpers in ",[330,409,410],{},"calculate()",[339,412,415],{"className":413,"code":414,"language":355,"meta":344,"style":344},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Illuminate\\Database\\Eloquent\\Builder;\nuse Lomkit\\Rest\\Metrics\\Value;\nuse Lomkit\\Rest\\Metrics\\ValueResult;\n\nclass TotalRevenue extends Value\n{\n    public function calculate(Builder $query): ValueResult\n    {\n        return $this->sum($query, 'price', 'placed_at');\n    }\n\n    public function ranges(): array\n    {\n        return [30 => '30 days', 90 => '90 days'];\n    }\n}\n",[330,416,417,447,469,491,498,513,519,549,555,597,603,608,624,629,667,672],{"__ignoreMap":344},[348,418,419,423,427,431,434,436,439,441,444],{"class":350,"line":351},[348,420,422],{"class":421},"sbssI","use",[348,424,426],{"class":425},"sTEyZ"," Illuminate",[348,428,430],{"class":429},"sMK4o","\\",[348,432,433],{"class":425},"Database",[348,435,430],{"class":429},[348,437,438],{"class":425},"Eloquent",[348,440,430],{"class":429},[348,442,443],{"class":425},"Builder",[348,445,446],{"class":429},";\n",[348,448,449,451,454,456,459,461,463,465,467],{"class":350,"line":371},[348,450,422],{"class":421},[348,452,453],{"class":425}," Lomkit",[348,455,430],{"class":429},[348,457,458],{"class":425},"Rest",[348,460,430],{"class":429},[348,462,140],{"class":425},[348,464,430],{"class":429},[348,466,392],{"class":425},[348,468,446],{"class":429},[348,470,472,474,476,478,480,482,484,486,489],{"class":350,"line":471},3,[348,473,422],{"class":421},[348,475,453],{"class":425},[348,477,430],{"class":429},[348,479,458],{"class":425},[348,481,430],{"class":429},[348,483,140],{"class":425},[348,485,430],{"class":429},[348,487,488],{"class":425},"ValueResult",[348,490,446],{"class":429},[348,492,494],{"class":350,"line":493},4,[348,495,497],{"emptyLinePlaceholder":496},true,"\n",[348,499,501,505,507,510],{"class":350,"line":500},5,[348,502,504],{"class":503},"spNyl","class",[348,506,365],{"class":354},[348,508,509],{"class":503}," extends",[348,511,512],{"class":354}," Value\n",[348,514,516],{"class":350,"line":515},6,[348,517,518],{"class":429},"{\n",[348,520,522,525,528,532,535,537,540,543,546],{"class":350,"line":521},7,[348,523,524],{"class":503},"    public",[348,526,527],{"class":503}," function",[348,529,531],{"class":530},"s2Zo4"," calculate",[348,533,534],{"class":429},"(",[348,536,443],{"class":354},[348,538,539],{"class":429}," $",[348,541,542],{"class":425},"query",[348,544,545],{"class":429},"):",[348,547,548],{"class":354}," ValueResult\n",[348,550,552],{"class":350,"line":551},8,[348,553,554],{"class":429},"    {\n",[348,556,558,562,565,568,571,573,576,579,582,585,587,589,592,594],{"class":350,"line":557},9,[348,559,561],{"class":560},"s7zQu","        return",[348,563,564],{"class":429}," $this->",[348,566,567],{"class":530},"sum",[348,569,570],{"class":429},"($",[348,572,542],{"class":425},[348,574,575],{"class":429},",",[348,577,578],{"class":429}," '",[348,580,581],{"class":358},"price",[348,583,584],{"class":429},"'",[348,586,575],{"class":429},[348,588,578],{"class":429},[348,590,591],{"class":358},"placed_at",[348,593,584],{"class":429},[348,595,596],{"class":429},");\n",[348,598,600],{"class":350,"line":599},10,[348,601,602],{"class":429},"    }\n",[348,604,606],{"class":350,"line":605},11,[348,607,497],{"emptyLinePlaceholder":496},[348,609,611,613,615,618,621],{"class":350,"line":610},12,[348,612,524],{"class":503},[348,614,527],{"class":503},[348,616,617],{"class":530}," ranges",[348,619,620],{"class":429},"():",[348,622,623],{"class":421}," array\n",[348,625,627],{"class":350,"line":626},13,[348,628,554],{"class":429},[348,630,632,634,637,640,643,645,648,650,652,655,657,659,662,664],{"class":350,"line":631},14,[348,633,561],{"class":560},[348,635,636],{"class":429}," [",[348,638,639],{"class":421},"30",[348,641,642],{"class":429}," =>",[348,644,578],{"class":429},[348,646,647],{"class":358},"30 days",[348,649,584],{"class":429},[348,651,575],{"class":429},[348,653,654],{"class":421}," 90",[348,656,642],{"class":429},[348,658,578],{"class":429},[348,660,661],{"class":358},"90 days",[348,663,584],{"class":429},[348,665,666],{"class":429},"];\n",[348,668,670],{"class":350,"line":669},15,[348,671,602],{"class":429},[348,673,675],{"class":350,"line":674},16,[348,676,677],{"class":429},"}\n",[313,679,680,681,684],{},"Declare it in the ",[330,682,683],{},"metrics()"," method of the resource:",[339,686,688],{"className":413,"code":687,"language":355,"meta":344,"style":344},"public function metrics(): array\n{\n    return [TotalRevenue::make()];\n}\n",[330,689,690,704,708,727],{"__ignoreMap":344},[348,691,692,695,697,700,702],{"class":350,"line":351},[348,693,694],{"class":503},"public",[348,696,527],{"class":503},[348,698,699],{"class":530}," metrics",[348,701,620],{"class":429},[348,703,623],{"class":421},[348,705,706],{"class":350,"line":371},[348,707,518],{"class":429},[348,709,710,713,715,718,721,724],{"class":350,"line":471},[348,711,712],{"class":560},"    return",[348,714,636],{"class":429},[348,716,717],{"class":354},"TotalRevenue",[348,719,720],{"class":429},"::",[348,722,723],{"class":530},"make",[348,725,726],{"class":429},"()];\n",[348,728,729],{"class":350,"line":493},[348,730,677],{"class":429},[732,733,734,744,778],"ul",{},[735,736,737,739,740,743],"li",{},[330,738,410],{}," receives an Eloquent query on the model: the perimeter of the resource, then the ",[330,741,742],{},"search"," of the request, without order, selected columns or limit.",[735,745,746,747,750,751,754,755,750,758,761,762,393,765,393,768,750,770,773,774,777],{},"The helpers read the fields that the resource declares. A sum, an average, a min, a max, a median or a percentile needs a ",[330,748,749],{},"Number"," or ",[330,752,753],{},"Integer"," field, a date column a ",[330,756,757],{},"Date",[330,759,760],{},"DateTime"," field, and a group column a ",[330,763,764],{},"Text",[330,766,767],{},"Enum",[330,769,753],{},[330,771,772],{},"Boolean"," field. Another field throws ",[330,775,776],{},"Lomkit\\Rest\\Exceptions\\InvalidMetricException"," when the metric runs.",[735,779,780,781,784,785,787,788,791,792,795],{},"The metric is named after its class, without a ",[330,782,783],{},"Metric"," suffix: ",[330,786,717],{}," gives ",[330,789,790],{},"Total Revenue"," and the key ",[330,793,794],{},"total-revenue",".",[322,797,799],{"id":798},"requesting-a-metric","Requesting a metric",[313,801,802,803,806,807,337],{},"Each metric gets the route ",[330,804,805],{},"POST \u002F{resource}\u002Fmetrics\u002F{uriKey}",", named ",[330,808,809],{},"{name}.metric.{uriKey}",[339,811,815],{"className":812,"code":813,"language":814,"meta":344,"style":344},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POST \u002Fapi\u002Forders\u002Fmetrics\u002Ftotal-revenue\n","http",[330,816,817],{"__ignoreMap":344},[348,818,819],{"class":350,"line":351},[348,820,813],{},[339,822,826],{"className":823,"code":824,"language":825,"meta":344,"style":344},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{}\n","json",[330,827,828],{"__ignoreMap":344},[348,829,830],{"class":350,"line":351},[348,831,824],{"class":429},[339,833,835],{"className":823,"code":834,"language":825,"meta":344,"style":344},"{\"data\": {\"type\": \"value\", \"value\": 52.0, \"previous\": 37.25}}\n",[330,836,837],{"__ignoreMap":344},[348,838,839,842,845,848,850,852,855,857,860,862,864,867,870,872,874,876,878,880,882,885,887,889,892,894,896,899],{"class":350,"line":351},[348,840,841],{"class":429},"{",[348,843,844],{"class":429},"\"",[348,846,847],{"class":503},"data",[348,849,844],{"class":429},[348,851,337],{"class":429},[348,853,854],{"class":429}," {",[348,856,844],{"class":429},[348,858,859],{"class":354},"type",[348,861,844],{"class":429},[348,863,337],{"class":429},[348,865,866],{"class":429}," \"",[348,868,869],{"class":358},"value",[348,871,844],{"class":429},[348,873,575],{"class":429},[348,875,866],{"class":429},[348,877,869],{"class":354},[348,879,844],{"class":429},[348,881,337],{"class":429},[348,883,884],{"class":421}," 52.0",[348,886,575],{"class":429},[348,888,866],{"class":429},[348,890,891],{"class":354},"previous",[348,893,844],{"class":429},[348,895,337],{"class":429},[348,897,898],{"class":421}," 37.25",[348,900,901],{"class":429},"}}\n",[313,903,904],{},"The body takes three optional keys:",[906,907,908,920],"table",{},[909,910,911],"thead",{},[912,913,914,918],"tr",{},[915,916,917],"th",{},"Key",[915,919,392],{},[921,922,923,980,994],"tbody",{},[912,924,925,930],{},[926,927,928],"td",{},[330,929,742],{},[926,931,932,393,935,393,938,393,941,403,944,947,948,950,951,393,954,393,957,393,960,393,963,393,966,403,969,972,973,976,977],{},[330,933,934],{},"text",[330,936,937],{},"trashed",[330,939,940],{},"filters",[330,942,943],{},"scopes",[330,945,946],{},"instructions"," of a ",[317,949,742],{"href":69},". ",[330,952,953],{},"sorts",[330,955,956],{},"selects",[330,958,959],{},"includes",[330,961,962],{},"aggregates",[330,964,965],{},"gates",[330,967,968],{},"limit",[330,970,971],{},"page"," are a ",[330,974,975],{},"422",", such as ",[330,978,979],{},"The search.limit field is prohibited.",[912,981,982,987],{},[926,983,984],{},[330,985,986],{},"range",[926,988,989,990,993],{},"a key of ",[330,991,992],{},"ranges()",". The first range applies when the request sends none.",[912,995,996,1001],{},[926,997,998],{},[330,999,1000],{},"timezone",[926,1002,1003,1004,950,1007,1010],{},"a time zone name, such as ",[330,1005,1006],{},"Europe\u002FParis",[330,1008,1009],{},"config('app.timezone')"," applies when the request sends none.",[339,1012,1014],{"className":823,"code":1013,"language":825,"meta":344,"style":344},"{\"range\": 90, \"search\": {\"filters\": [{\"field\": \"status\", \"value\": \"paid\"}]}}\n",[330,1015,1016],{"__ignoreMap":344},[348,1017,1018,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1053,1055,1058,1060,1062,1064,1067,1069,1071,1073,1075,1077,1079,1081,1084,1086],{"class":350,"line":351},[348,1019,841],{"class":429},[348,1021,844],{"class":429},[348,1023,986],{"class":503},[348,1025,844],{"class":429},[348,1027,337],{"class":429},[348,1029,654],{"class":421},[348,1031,575],{"class":429},[348,1033,866],{"class":429},[348,1035,742],{"class":503},[348,1037,844],{"class":429},[348,1039,337],{"class":429},[348,1041,854],{"class":429},[348,1043,844],{"class":429},[348,1045,940],{"class":354},[348,1047,844],{"class":429},[348,1049,337],{"class":429},[348,1051,1052],{"class":429}," [{",[348,1054,844],{"class":429},[348,1056,1057],{"class":421},"field",[348,1059,844],{"class":429},[348,1061,337],{"class":429},[348,1063,866],{"class":429},[348,1065,1066],{"class":358},"status",[348,1068,844],{"class":429},[348,1070,575],{"class":429},[348,1072,866],{"class":429},[348,1074,869],{"class":421},[348,1076,844],{"class":429},[348,1078,337],{"class":429},[348,1080,866],{"class":429},[348,1082,1083],{"class":358},"paid",[348,1085,844],{"class":429},[348,1087,1088],{"class":429},"}]}}\n",[732,1090,1091,1103,1112,1127,1141],{},[735,1092,1093,1094,1096,1097,1099,1100,1102],{},"A ",[330,1095,986],{}," that the metric does not declare is a ",[330,1098,975],{},", and so is ",[330,1101,986],{}," on a metric without ranges.",[735,1104,1105,1106,1109,1110,795],{},"An unknown zone, or an offset such as ",[330,1107,1108],{},"+01:00",", is a ",[330,1111,975],{},[735,1113,1114,1115,1118,1119,1122,1123,1126],{},"An unknown metric answers ",[330,1116,1117],{},"404"," to a user allowed ",[330,1120,1121],{},"viewAny"," on the resource, and ",[330,1124,1125],{},"403"," to the others.",[735,1128,1129,1130,1133,1134,1137,1138,795],{},"The search runs the resource's ",[330,1131,1132],{},"searching()"," event first. A metric that must skip it declares ",[330,1135,1136],{},"->withoutSearching()",", or ",[330,1139,1140],{},"public bool $withoutSearching = true;",[735,1142,1143,1144,1147,1148,795],{},"Floats keep their fraction in the response: ",[330,1145,1146],{},"52.0",", not ",[330,1149,1150],{},"52",[322,1152,392],{"id":869},[313,1154,1093,1155,1157],{},[330,1156,392],{}," gives one number, and the same number over the previous period when the metric declares ranges. A range key counts days.",[906,1159,1160,1170],{},[909,1161,1162],{},[912,1163,1164,1167],{},[915,1165,1166],{},"Helper",[915,1168,1169],{},"Computes",[921,1171,1172,1182,1192,1214],{},[912,1173,1174,1179],{},[926,1175,1176],{},[330,1177,1178],{},"count($query, $dateColumn = 'created_at')",[926,1180,1181],{},"the number of rows",[912,1183,1184,1189],{},[926,1185,1186],{},[330,1187,1188],{},"sum($query, $column, $dateColumn = 'created_at')",[926,1190,1191],{},"the total of a column",[912,1193,1194,1208],{},[926,1195,1196,393,1199,393,1202,393,1205],{},[330,1197,1198],{},"average()",[330,1200,1201],{},"min()",[330,1203,1204],{},"max()",[330,1206,1207],{},"median()",[926,1209,1210,1211],{},"with the parameters of ",[330,1212,1213],{},"sum()",[912,1215,1216,1221],{},[926,1217,1218],{},[330,1219,1220],{},"percentile($query, $column, $percentile, $dateColumn = 'created_at')",[926,1222,1223],{},"the value under which a share of the values falls",[313,1225,1226,1227,1229,1230,1232,1233,1235,1236,1238,1239,1242],{},"With ranges, ",[330,1228,869],{}," covers the last N days and ",[330,1231,891],{}," the N days before. Without ranges, ",[330,1234,869],{}," covers every row, ",[330,1237,891],{}," is ",[330,1240,1241],{},"null"," and the date column is not read.",[732,1244,1245,1254],{},[735,1246,1247,1248,1250,1251,1253],{},"A count is an integer. A sum, min or max is an integer for an ",[330,1249,753],{}," field and a float for a ",[330,1252,749],{}," field. An average, a median or a percentile is a float.",[735,1255,1256,1257,1260,1261,795],{},"Over no row, a count and a sum give ",[330,1258,1259],{},"0",", the others ",[330,1262,1241],{},[322,1264,396],{"id":1265},"partition",[313,1267,1093,1268,1270],{},[330,1269,396],{}," gives one part per value of a column:",[339,1272,1274],{"className":413,"code":1273,"language":355,"meta":344,"style":344},"use Lomkit\\Rest\\Metrics\\Partition;\nuse Lomkit\\Rest\\Metrics\\PartitionResult;\n\nclass OrdersByStatus extends Partition\n{\n    public function calculate(Builder $query): PartitionResult\n    {\n        return $this->count($query, 'status');\n    }\n}\n",[330,1275,1276,1296,1317,1321,1332,1336,1357,1361,1384,1388],{"__ignoreMap":344},[348,1277,1278,1280,1282,1284,1286,1288,1290,1292,1294],{"class":350,"line":351},[348,1279,422],{"class":421},[348,1281,453],{"class":425},[348,1283,430],{"class":429},[348,1285,458],{"class":425},[348,1287,430],{"class":429},[348,1289,140],{"class":425},[348,1291,430],{"class":429},[348,1293,396],{"class":425},[348,1295,446],{"class":429},[348,1297,1298,1300,1302,1304,1306,1308,1310,1312,1315],{"class":350,"line":371},[348,1299,422],{"class":421},[348,1301,453],{"class":425},[348,1303,430],{"class":429},[348,1305,458],{"class":425},[348,1307,430],{"class":429},[348,1309,140],{"class":425},[348,1311,430],{"class":429},[348,1313,1314],{"class":425},"PartitionResult",[348,1316,446],{"class":429},[348,1318,1319],{"class":350,"line":471},[348,1320,497],{"emptyLinePlaceholder":496},[348,1322,1323,1325,1327,1329],{"class":350,"line":493},[348,1324,504],{"class":503},[348,1326,380],{"class":354},[348,1328,509],{"class":503},[348,1330,1331],{"class":354}," Partition\n",[348,1333,1334],{"class":350,"line":500},[348,1335,518],{"class":429},[348,1337,1338,1340,1342,1344,1346,1348,1350,1352,1354],{"class":350,"line":515},[348,1339,524],{"class":503},[348,1341,527],{"class":503},[348,1343,531],{"class":530},[348,1345,534],{"class":429},[348,1347,443],{"class":354},[348,1349,539],{"class":429},[348,1351,542],{"class":425},[348,1353,545],{"class":429},[348,1355,1356],{"class":354}," PartitionResult\n",[348,1358,1359],{"class":350,"line":521},[348,1360,554],{"class":429},[348,1362,1363,1365,1367,1370,1372,1374,1376,1378,1380,1382],{"class":350,"line":551},[348,1364,561],{"class":560},[348,1366,564],{"class":429},[348,1368,1369],{"class":530},"count",[348,1371,570],{"class":429},[348,1373,542],{"class":425},[348,1375,575],{"class":429},[348,1377,578],{"class":429},[348,1379,1066],{"class":358},[348,1381,584],{"class":429},[348,1383,596],{"class":429},[348,1385,1386],{"class":350,"line":557},[348,1387,602],{"class":429},[348,1389,1390],{"class":350,"line":599},[348,1391,677],{"class":429},[339,1393,1395],{"className":823,"code":1394,"language":825,"meta":344,"style":344},"{\"data\": {\"type\": \"partition\", \"parts\": [{\"key\": \"paid\", \"label\": \"Paid\", \"value\": 5}, {\"key\": \"pending\", \"label\": \"Pending\", \"value\": 1}, {\"key\": null, \"label\": null, \"value\": 1}], \"other\": null}}\n",[330,1396,1397],{"__ignoreMap":344},[348,1398,1399,1401,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425,1427,1429,1432,1434,1436,1438,1440,1443,1445,1447,1449,1451,1453,1455,1457,1460,1462,1464,1466,1469,1471,1473,1475,1477,1479,1481,1484,1487,1489,1491,1493,1495,1497,1499,1502,1504,1506,1508,1510,1512,1514,1516,1519,1521,1523,1525,1527,1529,1531,1534,1536,1538,1540,1542,1544,1546,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1572,1574,1577,1579,1581],{"class":350,"line":351},[348,1400,841],{"class":429},[348,1402,844],{"class":429},[348,1404,847],{"class":503},[348,1406,844],{"class":429},[348,1408,337],{"class":429},[348,1410,854],{"class":429},[348,1412,844],{"class":429},[348,1414,859],{"class":354},[348,1416,844],{"class":429},[348,1418,337],{"class":429},[348,1420,866],{"class":429},[348,1422,1265],{"class":358},[348,1424,844],{"class":429},[348,1426,575],{"class":429},[348,1428,866],{"class":429},[348,1430,1431],{"class":354},"parts",[348,1433,844],{"class":429},[348,1435,337],{"class":429},[348,1437,1052],{"class":429},[348,1439,844],{"class":429},[348,1441,1442],{"class":421},"key",[348,1444,844],{"class":429},[348,1446,337],{"class":429},[348,1448,866],{"class":429},[348,1450,1083],{"class":358},[348,1452,844],{"class":429},[348,1454,575],{"class":429},[348,1456,866],{"class":429},[348,1458,1459],{"class":421},"label",[348,1461,844],{"class":429},[348,1463,337],{"class":429},[348,1465,866],{"class":429},[348,1467,1468],{"class":358},"Paid",[348,1470,844],{"class":429},[348,1472,575],{"class":429},[348,1474,866],{"class":429},[348,1476,869],{"class":421},[348,1478,844],{"class":429},[348,1480,337],{"class":429},[348,1482,1483],{"class":421}," 5",[348,1485,1486],{"class":429},"},",[348,1488,854],{"class":429},[348,1490,844],{"class":429},[348,1492,1442],{"class":421},[348,1494,844],{"class":429},[348,1496,337],{"class":429},[348,1498,866],{"class":429},[348,1500,1501],{"class":358},"pending",[348,1503,844],{"class":429},[348,1505,575],{"class":429},[348,1507,866],{"class":429},[348,1509,1459],{"class":421},[348,1511,844],{"class":429},[348,1513,337],{"class":429},[348,1515,866],{"class":429},[348,1517,1518],{"class":358},"Pending",[348,1520,844],{"class":429},[348,1522,575],{"class":429},[348,1524,866],{"class":429},[348,1526,869],{"class":421},[348,1528,844],{"class":429},[348,1530,337],{"class":429},[348,1532,1533],{"class":421}," 1",[348,1535,1486],{"class":429},[348,1537,854],{"class":429},[348,1539,844],{"class":429},[348,1541,1442],{"class":421},[348,1543,844],{"class":429},[348,1545,337],{"class":429},[348,1547,1548],{"class":429}," null,",[348,1550,866],{"class":429},[348,1552,1459],{"class":421},[348,1554,844],{"class":429},[348,1556,337],{"class":429},[348,1558,1548],{"class":429},[348,1560,866],{"class":429},[348,1562,869],{"class":421},[348,1564,844],{"class":429},[348,1566,337],{"class":429},[348,1568,1533],{"class":421},[348,1570,1571],{"class":429},"}],",[348,1573,866],{"class":429},[348,1575,1576],{"class":354},"other",[348,1578,844],{"class":429},[348,1580,337],{"class":429},[348,1582,1583],{"class":429}," null}}\n",[732,1585,1586,1610,1624,1627,1648,1672],{},[735,1587,1588,1589,393,1592,393,1595,393,1597,393,1599,403,1601,1603,1604,1606,1607,795],{},"Helpers: ",[330,1590,1591],{},"count($query, $groupBy, $dateColumn = null)",[330,1593,1594],{},"sum($query, $column, $groupBy, $dateColumn = null)",[330,1596,1198],{},[330,1598,1201],{},[330,1600,1204],{},[330,1602,1207],{}," with the parameters of ",[330,1605,1213],{},", and ",[330,1608,1609],{},"percentile($query, $column, $percentile, $groupBy, $dateColumn = null)",[735,1611,1612,1613,1615,1616,1618,1619,1621,1622,795],{},"Each part holds the stored value as ",[330,1614,1442],{}," and a ",[330,1617,1459],{},": the enum case name for an ",[330,1620,767],{}," field, the key as text otherwise. The rows without a value form the part whose key is ",[330,1623,1241],{},[735,1625,1626],{},"Parts are sorted by value, largest first, then by key.",[735,1628,1629,1632,1633,1636,1637,1639,1640,950,1643,1238,1645,1647],{},[330,1630,1631],{},"->limit(5)"," when the resource declares the metric, or ",[330,1634,1635],{},"public ?int $limit = 5;",", keeps the 5 largest parts and folds the others into ",[330,1638,1576],{},": ",[330,1641,1642],{},"{\"label\": \"Other\", \"value\": 3}",[330,1644,1576],{},[330,1646,1241],{}," when nothing is folded.",[735,1649,1650,1651,1654,1655,1658,1659,1662,1663,950,1666,1668,1669,795],{},"Without ",[330,1652,1653],{},"limit()",", a partition keeps its ",[330,1656,1657],{},"rest.limits.sizes.groups"," largest parts, ",[330,1660,1661],{},"100"," by default and at least ",[330,1664,1665],{},"1",[330,1667,1653],{}," raises or lowers that number for one metric. See ",[317,1670,58],{"href":1671},"\u002Fresources\u002Flimits#metric-groups",[735,1673,1674,1677,1678,795],{},[330,1675,1676],{},"->labels(['paid' => 'Payée'], other: 'Autre')"," on the result renames parts and ",[330,1679,1576],{},[1681,1682,1684],"h3",{"id":1683},"comparing-with-the-previous-period","Comparing with the previous period",[313,1686,1687,1688,403,1691,1693,1694,1696,1697,1699],{},"With a named ",[330,1689,1690],{},"dateColumn",[330,1692,992],{},", a partition reads the last N days and gives each part and ",[330,1695,1576],{}," a ",[330,1698,891],{}," value over the N days before:",[339,1701,1703],{"className":413,"code":1702,"language":355,"meta":344,"style":344},"return $this->sum($query, 'amount', 'currency', dateColumn: 'paid_at');\n",[330,1704,1705],{"__ignoreMap":344},[348,1706,1707,1710,1712,1714,1716,1718,1720,1722,1725,1727,1729,1731,1734,1736,1738,1741,1743,1745,1748,1750],{"class":350,"line":351},[348,1708,1709],{"class":560},"return",[348,1711,564],{"class":429},[348,1713,567],{"class":530},[348,1715,570],{"class":429},[348,1717,542],{"class":425},[348,1719,575],{"class":429},[348,1721,578],{"class":429},[348,1723,1724],{"class":358},"amount",[348,1726,584],{"class":429},[348,1728,575],{"class":429},[348,1730,578],{"class":429},[348,1732,1733],{"class":358},"currency",[348,1735,584],{"class":429},[348,1737,575],{"class":429},[348,1739,1740],{"class":354}," dateColumn",[348,1742,337],{"class":429},[348,1744,578],{"class":429},[348,1746,1747],{"class":358},"paid_at",[348,1749,584],{"class":429},[348,1751,596],{"class":429},[339,1753,1755],{"className":823,"code":1754,"language":825,"meta":344,"style":344},"{\"data\": {\"type\": \"partition\", \"parts\": [{\"key\": \"EUR\", \"label\": \"EUR\", \"value\": 18240.5, \"previous\": 16002.0}, {\"key\": \"USD\", \"label\": \"USD\", \"value\": 9100.0, \"previous\": 9875.25}], \"other\": null}}\n",[330,1756,1757],{"__ignoreMap":344},[348,1758,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1841,1843,1845,1847,1849,1851,1854,1856,1858,1860,1862,1864,1866,1868,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1902,1904,1906,1908,1910,1912,1915,1917,1919,1921,1923,1925],{"class":350,"line":351},[348,1760,841],{"class":429},[348,1762,844],{"class":429},[348,1764,847],{"class":503},[348,1766,844],{"class":429},[348,1768,337],{"class":429},[348,1770,854],{"class":429},[348,1772,844],{"class":429},[348,1774,859],{"class":354},[348,1776,844],{"class":429},[348,1778,337],{"class":429},[348,1780,866],{"class":429},[348,1782,1265],{"class":358},[348,1784,844],{"class":429},[348,1786,575],{"class":429},[348,1788,866],{"class":429},[348,1790,1431],{"class":354},[348,1792,844],{"class":429},[348,1794,337],{"class":429},[348,1796,1052],{"class":429},[348,1798,844],{"class":429},[348,1800,1442],{"class":421},[348,1802,844],{"class":429},[348,1804,337],{"class":429},[348,1806,866],{"class":429},[348,1808,1809],{"class":358},"EUR",[348,1811,844],{"class":429},[348,1813,575],{"class":429},[348,1815,866],{"class":429},[348,1817,1459],{"class":421},[348,1819,844],{"class":429},[348,1821,337],{"class":429},[348,1823,866],{"class":429},[348,1825,1809],{"class":358},[348,1827,844],{"class":429},[348,1829,575],{"class":429},[348,1831,866],{"class":429},[348,1833,869],{"class":421},[348,1835,844],{"class":429},[348,1837,337],{"class":429},[348,1839,1840],{"class":421}," 18240.5",[348,1842,575],{"class":429},[348,1844,866],{"class":429},[348,1846,891],{"class":421},[348,1848,844],{"class":429},[348,1850,337],{"class":429},[348,1852,1853],{"class":421}," 16002.0",[348,1855,1486],{"class":429},[348,1857,854],{"class":429},[348,1859,844],{"class":429},[348,1861,1442],{"class":421},[348,1863,844],{"class":429},[348,1865,337],{"class":429},[348,1867,866],{"class":429},[348,1869,1870],{"class":358},"USD",[348,1872,844],{"class":429},[348,1874,575],{"class":429},[348,1876,866],{"class":429},[348,1878,1459],{"class":421},[348,1880,844],{"class":429},[348,1882,337],{"class":429},[348,1884,866],{"class":429},[348,1886,1870],{"class":358},[348,1888,844],{"class":429},[348,1890,575],{"class":429},[348,1892,866],{"class":429},[348,1894,869],{"class":421},[348,1896,844],{"class":429},[348,1898,337],{"class":429},[348,1900,1901],{"class":421}," 9100.0",[348,1903,575],{"class":429},[348,1905,866],{"class":429},[348,1907,891],{"class":421},[348,1909,844],{"class":429},[348,1911,337],{"class":429},[348,1913,1914],{"class":421}," 9875.25",[348,1916,1571],{"class":429},[348,1918,866],{"class":429},[348,1920,1576],{"class":354},[348,1922,844],{"class":429},[348,1924,337],{"class":429},[348,1926,1583],{"class":429},[313,1928,1929,1930,1932],{},"A key without rows in one of the two periods gets ",[330,1931,1241],{}," there.",[322,1934,399],{"id":1935},"progress",[313,1937,1093,1938,1940],{},[330,1939,399],{}," gives a value and its target:",[339,1942,1944],{"className":413,"code":1943,"language":355,"meta":344,"style":344},"return $this->sum($query, 'price', target: 100000);\n",[330,1945,1946],{"__ignoreMap":344},[348,1947,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1971,1973,1976],{"class":350,"line":351},[348,1949,1709],{"class":560},[348,1951,564],{"class":429},[348,1953,567],{"class":530},[348,1955,570],{"class":429},[348,1957,542],{"class":425},[348,1959,575],{"class":429},[348,1961,578],{"class":429},[348,1963,581],{"class":358},[348,1965,584],{"class":429},[348,1967,575],{"class":429},[348,1969,1970],{"class":354}," target",[348,1972,337],{"class":429},[348,1974,1975],{"class":421}," 100000",[348,1977,596],{"class":429},[339,1979,1981],{"className":823,"code":1980,"language":825,"meta":344,"style":344},"{\"data\": {\"type\": \"progress\", \"value\": 52000.0, \"target\": 100000.0}}\n",[330,1982,1983],{"__ignoreMap":344},[348,1984,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2024,2026,2028,2031,2033,2035,2038],{"class":350,"line":351},[348,1986,841],{"class":429},[348,1988,844],{"class":429},[348,1990,847],{"class":503},[348,1992,844],{"class":429},[348,1994,337],{"class":429},[348,1996,854],{"class":429},[348,1998,844],{"class":429},[348,2000,859],{"class":354},[348,2002,844],{"class":429},[348,2004,337],{"class":429},[348,2006,866],{"class":429},[348,2008,1935],{"class":358},[348,2010,844],{"class":429},[348,2012,575],{"class":429},[348,2014,866],{"class":429},[348,2016,869],{"class":354},[348,2018,844],{"class":429},[348,2020,337],{"class":429},[348,2022,2023],{"class":421}," 52000.0",[348,2025,575],{"class":429},[348,2027,866],{"class":429},[348,2029,2030],{"class":354},"target",[348,2032,844],{"class":429},[348,2034,337],{"class":429},[348,2036,2037],{"class":421}," 100000.0",[348,2039,901],{"class":429},[313,2041,2042,2043,393,2046,393,2049,393,2051,403,2053,2055,2056,795],{},"The helpers are ",[330,2044,2045],{},"count($query, $target, $dateColumn = 'created_at')",[330,2047,2048],{},"sum($query, $column, $target, $dateColumn = 'created_at')",[330,2050,1198],{},[330,2052,1201],{},[330,2054,1204],{},". The target can come from the request: ",[330,2057,2058],{},"target: $this->request()->user()->monthly_goal",[322,2060,402],{"id":2061},"trend",[313,2063,1093,2064,2066,2067,2069],{},[330,2065,402],{}," gives one value per day, week or month. A trend declares ",[330,2068,992],{},", and a range key counts periods, the current one included:",[339,2071,2073],{"className":413,"code":2072,"language":355,"meta":344,"style":344},"use Lomkit\\Rest\\Metrics\\Trend;\nuse Lomkit\\Rest\\Metrics\\TrendResult;\n\nclass RevenuePerMonth extends Trend\n{\n    public function calculate(Builder $query): TrendResult\n    {\n        return $this->sumByMonths($query, 'price', 'placed_at');\n    }\n\n    public function ranges(): array\n    {\n        return [3 => '3 months', 6 => '6 months', 12 => '12 months'];\n    }\n}\n",[330,2074,2075,2095,2116,2120,2132,2136,2157,2161,2192,2196,2200,2212,2216,2264,2268],{"__ignoreMap":344},[348,2076,2077,2079,2081,2083,2085,2087,2089,2091,2093],{"class":350,"line":351},[348,2078,422],{"class":421},[348,2080,453],{"class":425},[348,2082,430],{"class":429},[348,2084,458],{"class":425},[348,2086,430],{"class":429},[348,2088,140],{"class":425},[348,2090,430],{"class":429},[348,2092,402],{"class":425},[348,2094,446],{"class":429},[348,2096,2097,2099,2101,2103,2105,2107,2109,2111,2114],{"class":350,"line":371},[348,2098,422],{"class":421},[348,2100,453],{"class":425},[348,2102,430],{"class":429},[348,2104,458],{"class":425},[348,2106,430],{"class":429},[348,2108,140],{"class":425},[348,2110,430],{"class":429},[348,2112,2113],{"class":425},"TrendResult",[348,2115,446],{"class":429},[348,2117,2118],{"class":350,"line":471},[348,2119,497],{"emptyLinePlaceholder":496},[348,2121,2122,2124,2127,2129],{"class":350,"line":493},[348,2123,504],{"class":503},[348,2125,2126],{"class":354}," RevenuePerMonth",[348,2128,509],{"class":503},[348,2130,2131],{"class":354}," Trend\n",[348,2133,2134],{"class":350,"line":500},[348,2135,518],{"class":429},[348,2137,2138,2140,2142,2144,2146,2148,2150,2152,2154],{"class":350,"line":515},[348,2139,524],{"class":503},[348,2141,527],{"class":503},[348,2143,531],{"class":530},[348,2145,534],{"class":429},[348,2147,443],{"class":354},[348,2149,539],{"class":429},[348,2151,542],{"class":425},[348,2153,545],{"class":429},[348,2155,2156],{"class":354}," TrendResult\n",[348,2158,2159],{"class":350,"line":521},[348,2160,554],{"class":429},[348,2162,2163,2165,2167,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190],{"class":350,"line":551},[348,2164,561],{"class":560},[348,2166,564],{"class":429},[348,2168,2169],{"class":530},"sumByMonths",[348,2171,570],{"class":429},[348,2173,542],{"class":425},[348,2175,575],{"class":429},[348,2177,578],{"class":429},[348,2179,581],{"class":358},[348,2181,584],{"class":429},[348,2183,575],{"class":429},[348,2185,578],{"class":429},[348,2187,591],{"class":358},[348,2189,584],{"class":429},[348,2191,596],{"class":429},[348,2193,2194],{"class":350,"line":557},[348,2195,602],{"class":429},[348,2197,2198],{"class":350,"line":599},[348,2199,497],{"emptyLinePlaceholder":496},[348,2201,2202,2204,2206,2208,2210],{"class":350,"line":605},[348,2203,524],{"class":503},[348,2205,527],{"class":503},[348,2207,617],{"class":530},[348,2209,620],{"class":429},[348,2211,623],{"class":421},[348,2213,2214],{"class":350,"line":610},[348,2215,554],{"class":429},[348,2217,2218,2220,2222,2225,2227,2229,2232,2234,2236,2239,2241,2243,2246,2248,2250,2253,2255,2257,2260,2262],{"class":350,"line":626},[348,2219,561],{"class":560},[348,2221,636],{"class":429},[348,2223,2224],{"class":421},"3",[348,2226,642],{"class":429},[348,2228,578],{"class":429},[348,2230,2231],{"class":358},"3 months",[348,2233,584],{"class":429},[348,2235,575],{"class":429},[348,2237,2238],{"class":421}," 6",[348,2240,642],{"class":429},[348,2242,578],{"class":429},[348,2244,2245],{"class":358},"6 months",[348,2247,584],{"class":429},[348,2249,575],{"class":429},[348,2251,2252],{"class":421}," 12",[348,2254,642],{"class":429},[348,2256,578],{"class":429},[348,2258,2259],{"class":358},"12 months",[348,2261,584],{"class":429},[348,2263,666],{"class":429},[348,2265,2266],{"class":350,"line":631},[348,2267,602],{"class":429},[348,2269,2270],{"class":350,"line":669},[348,2271,677],{"class":429},[339,2273,2275],{"className":823,"code":2274,"language":825,"meta":344,"style":344},"{\"range\": 6}\n",[330,2276,2277],{"__ignoreMap":344},[348,2278,2279,2281,2283,2285,2287,2289,2291],{"class":350,"line":351},[348,2280,841],{"class":429},[348,2282,844],{"class":429},[348,2284,986],{"class":503},[348,2286,844],{"class":429},[348,2288,337],{"class":429},[348,2290,2238],{"class":421},[348,2292,677],{"class":429},[339,2294,2296],{"className":823,"code":2295,"language":825,"meta":344,"style":344},"{\n  \"data\": {\n    \"type\": \"trend\",\n    \"series\": [\n      {\"label\": \"2026-06\", \"value\": 0.0},\n      {\"label\": \"2026-07\", \"value\": 0.0},\n      {\"label\": \"2026-08\", \"value\": 0.0},\n      {\"label\": \"2026-09\", \"value\": 0.0},\n      {\"label\": \"2026-10\", \"value\": 20.0},\n      {\"label\": \"2026-11\", \"value\": 43.5}\n    ]\n  }\n}\n",[330,2297,2298,2302,2316,2336,2350,2386,2419,2452,2485,2519,2553,2558,2563],{"__ignoreMap":344},[348,2299,2300],{"class":350,"line":351},[348,2301,518],{"class":429},[348,2303,2304,2307,2309,2311,2313],{"class":350,"line":371},[348,2305,2306],{"class":429},"  \"",[348,2308,847],{"class":503},[348,2310,844],{"class":429},[348,2312,337],{"class":429},[348,2314,2315],{"class":429}," {\n",[348,2317,2318,2321,2323,2325,2327,2329,2331,2333],{"class":350,"line":471},[348,2319,2320],{"class":429},"    \"",[348,2322,859],{"class":354},[348,2324,844],{"class":429},[348,2326,337],{"class":429},[348,2328,866],{"class":429},[348,2330,2061],{"class":358},[348,2332,844],{"class":429},[348,2334,2335],{"class":429},",\n",[348,2337,2338,2340,2343,2345,2347],{"class":350,"line":493},[348,2339,2320],{"class":429},[348,2341,2342],{"class":354},"series",[348,2344,844],{"class":429},[348,2346,337],{"class":429},[348,2348,2349],{"class":429}," [\n",[348,2351,2352,2355,2357,2359,2361,2363,2365,2368,2370,2372,2374,2376,2378,2380,2383],{"class":350,"line":500},[348,2353,2354],{"class":429},"      {",[348,2356,844],{"class":429},[348,2358,1459],{"class":421},[348,2360,844],{"class":429},[348,2362,337],{"class":429},[348,2364,866],{"class":429},[348,2366,2367],{"class":358},"2026-06",[348,2369,844],{"class":429},[348,2371,575],{"class":429},[348,2373,866],{"class":429},[348,2375,869],{"class":421},[348,2377,844],{"class":429},[348,2379,337],{"class":429},[348,2381,2382],{"class":421}," 0.0",[348,2384,2385],{"class":429},"},\n",[348,2387,2388,2390,2392,2394,2396,2398,2400,2403,2405,2407,2409,2411,2413,2415,2417],{"class":350,"line":515},[348,2389,2354],{"class":429},[348,2391,844],{"class":429},[348,2393,1459],{"class":421},[348,2395,844],{"class":429},[348,2397,337],{"class":429},[348,2399,866],{"class":429},[348,2401,2402],{"class":358},"2026-07",[348,2404,844],{"class":429},[348,2406,575],{"class":429},[348,2408,866],{"class":429},[348,2410,869],{"class":421},[348,2412,844],{"class":429},[348,2414,337],{"class":429},[348,2416,2382],{"class":421},[348,2418,2385],{"class":429},[348,2420,2421,2423,2425,2427,2429,2431,2433,2436,2438,2440,2442,2444,2446,2448,2450],{"class":350,"line":521},[348,2422,2354],{"class":429},[348,2424,844],{"class":429},[348,2426,1459],{"class":421},[348,2428,844],{"class":429},[348,2430,337],{"class":429},[348,2432,866],{"class":429},[348,2434,2435],{"class":358},"2026-08",[348,2437,844],{"class":429},[348,2439,575],{"class":429},[348,2441,866],{"class":429},[348,2443,869],{"class":421},[348,2445,844],{"class":429},[348,2447,337],{"class":429},[348,2449,2382],{"class":421},[348,2451,2385],{"class":429},[348,2453,2454,2456,2458,2460,2462,2464,2466,2469,2471,2473,2475,2477,2479,2481,2483],{"class":350,"line":551},[348,2455,2354],{"class":429},[348,2457,844],{"class":429},[348,2459,1459],{"class":421},[348,2461,844],{"class":429},[348,2463,337],{"class":429},[348,2465,866],{"class":429},[348,2467,2468],{"class":358},"2026-09",[348,2470,844],{"class":429},[348,2472,575],{"class":429},[348,2474,866],{"class":429},[348,2476,869],{"class":421},[348,2478,844],{"class":429},[348,2480,337],{"class":429},[348,2482,2382],{"class":421},[348,2484,2385],{"class":429},[348,2486,2487,2489,2491,2493,2495,2497,2499,2502,2504,2506,2508,2510,2512,2514,2517],{"class":350,"line":557},[348,2488,2354],{"class":429},[348,2490,844],{"class":429},[348,2492,1459],{"class":421},[348,2494,844],{"class":429},[348,2496,337],{"class":429},[348,2498,866],{"class":429},[348,2500,2501],{"class":358},"2026-10",[348,2503,844],{"class":429},[348,2505,575],{"class":429},[348,2507,866],{"class":429},[348,2509,869],{"class":421},[348,2511,844],{"class":429},[348,2513,337],{"class":429},[348,2515,2516],{"class":421}," 20.0",[348,2518,2385],{"class":429},[348,2520,2521,2523,2525,2527,2529,2531,2533,2536,2538,2540,2542,2544,2546,2548,2551],{"class":350,"line":599},[348,2522,2354],{"class":429},[348,2524,844],{"class":429},[348,2526,1459],{"class":421},[348,2528,844],{"class":429},[348,2530,337],{"class":429},[348,2532,866],{"class":429},[348,2534,2535],{"class":358},"2026-11",[348,2537,844],{"class":429},[348,2539,575],{"class":429},[348,2541,866],{"class":429},[348,2543,869],{"class":421},[348,2545,844],{"class":429},[348,2547,337],{"class":429},[348,2549,2550],{"class":421}," 43.5",[348,2552,677],{"class":429},[348,2554,2555],{"class":350,"line":605},[348,2556,2557],{"class":429},"    ]\n",[348,2559,2560],{"class":350,"line":610},[348,2561,2562],{"class":429},"  }\n",[348,2564,2565],{"class":350,"line":626},[348,2566,677],{"class":429},[732,2568,2569,2606,2622,2632],{},[735,2570,1588,2571,393,2574,393,2577,2580,2581,393,2584,393,2587,393,2590,403,2593,2596,2597,1606,2600,2596,2603,795],{},[330,2572,2573],{},"countByDays($query, $dateColumn = 'created_at', $splitBy = null)",[330,2575,2576],{},"countByWeeks()",[330,2578,2579],{},"countByMonths()",", then ",[330,2582,2583],{},"sumBy...",[330,2585,2586],{},"averageBy...",[330,2588,2589],{},"minBy...",[330,2591,2592],{},"maxBy...",[330,2594,2595],{},"medianBy..."," with ",[330,2598,2599],{},"($query, $column, $dateColumn = 'created_at', $splitBy = null)",[330,2601,2602],{},"percentileBy...",[330,2604,2605],{},"($query, $column, $percentile, $dateColumn = 'created_at', $splitBy = null)",[735,2607,2608,2609,2612,2613,2615,2616,2618,2619,2621],{},"Labels: a day ",[330,2610,2611],{},"2026-11-07",", a week the date of its first day, a month ",[330,2614,2535],{},". Every period of the range is in the series, oldest first. A period without rows is ",[330,2617,1259],{}," for a count or a sum, ",[330,2620,1241],{}," for the others.",[735,2623,2624,2625,1137,2628,2631],{},"Weeks start on Monday. ",[330,2626,2627],{},"->weekStartsOn(Carbon::SUNDAY)",[330,2629,2630],{},"public int $weekStartsOn = Carbon::SUNDAY;",", starts them on another day.",[735,2633,2634,2636],{},[330,2635,1000],{}," counts the periods in that zone, changes of offset included.",[1681,2638,2640],{"id":2639},"splitting-a-trend","Splitting a trend",[313,2642,2643,2646],{},[330,2644,2645],{},"splitBy"," adds one series per value of a column, here over the first range, 3 months:",[339,2648,2650],{"className":413,"code":2649,"language":355,"meta":344,"style":344},"return $this->countByMonths($query, 'placed_at', splitBy: 'status');\n",[330,2651,2652],{"__ignoreMap":344},[348,2653,2654,2656,2658,2661,2663,2665,2667,2669,2671,2673,2675,2678,2680,2682,2684,2686],{"class":350,"line":351},[348,2655,1709],{"class":560},[348,2657,564],{"class":429},[348,2659,2660],{"class":530},"countByMonths",[348,2662,570],{"class":429},[348,2664,542],{"class":425},[348,2666,575],{"class":429},[348,2668,578],{"class":429},[348,2670,591],{"class":358},[348,2672,584],{"class":429},[348,2674,575],{"class":429},[348,2676,2677],{"class":354}," splitBy",[348,2679,337],{"class":429},[348,2681,578],{"class":429},[348,2683,1066],{"class":358},[348,2685,584],{"class":429},[348,2687,596],{"class":429},[339,2689,2691],{"className":823,"code":2690,"language":825,"meta":344,"style":344},"{\n  \"data\": {\n    \"type\": \"trend\",\n    \"series\": [{\"label\": \"2026-09\", \"value\": 0}, {\"label\": \"2026-10\", \"value\": 1}, {\"label\": \"2026-11\", \"value\": 4}],\n    \"splits\": [\n      {\"key\": \"paid\", \"label\": \"Paid\", \"series\": [{\"label\": \"2026-09\", \"value\": 0}, {\"label\": \"2026-10\", \"value\": 0}, {\"label\": \"2026-11\", \"value\": 2}]},\n      {\"key\": \"pending\", \"label\": \"Pending\", \"series\": [{\"label\": \"2026-09\", \"value\": 0}, {\"label\": \"2026-10\", \"value\": 1}, {\"label\": \"2026-11\", \"value\": 1}]},\n      {\"key\": null, \"label\": null, \"series\": [{\"label\": \"2026-09\", \"value\": 0}, {\"label\": \"2026-10\", \"value\": 0}, {\"label\": \"2026-11\", \"value\": 1}]}\n    ],\n    \"other\": null\n  }\n}\n",[330,2692,2693,2697,2709,2727,2830,2843,2980,3114,3237,3242,3255,3259],{"__ignoreMap":344},[348,2694,2695],{"class":350,"line":351},[348,2696,518],{"class":429},[348,2698,2699,2701,2703,2705,2707],{"class":350,"line":371},[348,2700,2306],{"class":429},[348,2702,847],{"class":503},[348,2704,844],{"class":429},[348,2706,337],{"class":429},[348,2708,2315],{"class":429},[348,2710,2711,2713,2715,2717,2719,2721,2723,2725],{"class":350,"line":471},[348,2712,2320],{"class":429},[348,2714,859],{"class":354},[348,2716,844],{"class":429},[348,2718,337],{"class":429},[348,2720,866],{"class":429},[348,2722,2061],{"class":358},[348,2724,844],{"class":429},[348,2726,2335],{"class":429},[348,2728,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2827],{"class":350,"line":493},[348,2730,2320],{"class":429},[348,2732,2342],{"class":354},[348,2734,844],{"class":429},[348,2736,337],{"class":429},[348,2738,1052],{"class":429},[348,2740,844],{"class":429},[348,2742,1459],{"class":421},[348,2744,844],{"class":429},[348,2746,337],{"class":429},[348,2748,866],{"class":429},[348,2750,2468],{"class":358},[348,2752,844],{"class":429},[348,2754,575],{"class":429},[348,2756,866],{"class":429},[348,2758,869],{"class":421},[348,2760,844],{"class":429},[348,2762,337],{"class":429},[348,2764,2765],{"class":421}," 0",[348,2767,1486],{"class":429},[348,2769,854],{"class":429},[348,2771,844],{"class":429},[348,2773,1459],{"class":421},[348,2775,844],{"class":429},[348,2777,337],{"class":429},[348,2779,866],{"class":429},[348,2781,2501],{"class":358},[348,2783,844],{"class":429},[348,2785,575],{"class":429},[348,2787,866],{"class":429},[348,2789,869],{"class":421},[348,2791,844],{"class":429},[348,2793,337],{"class":429},[348,2795,1533],{"class":421},[348,2797,1486],{"class":429},[348,2799,854],{"class":429},[348,2801,844],{"class":429},[348,2803,1459],{"class":421},[348,2805,844],{"class":429},[348,2807,337],{"class":429},[348,2809,866],{"class":429},[348,2811,2535],{"class":358},[348,2813,844],{"class":429},[348,2815,575],{"class":429},[348,2817,866],{"class":429},[348,2819,869],{"class":421},[348,2821,844],{"class":429},[348,2823,337],{"class":429},[348,2825,2826],{"class":421}," 4",[348,2828,2829],{"class":429},"}],\n",[348,2831,2832,2834,2837,2839,2841],{"class":350,"line":500},[348,2833,2320],{"class":429},[348,2835,2836],{"class":354},"splits",[348,2838,844],{"class":429},[348,2840,337],{"class":429},[348,2842,2349],{"class":429},[348,2844,2845,2847,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891,2894,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2977],{"class":350,"line":515},[348,2846,2354],{"class":429},[348,2848,844],{"class":429},[348,2850,1442],{"class":421},[348,2852,844],{"class":429},[348,2854,337],{"class":429},[348,2856,866],{"class":429},[348,2858,1083],{"class":358},[348,2860,844],{"class":429},[348,2862,575],{"class":429},[348,2864,866],{"class":429},[348,2866,1459],{"class":421},[348,2868,844],{"class":429},[348,2870,337],{"class":429},[348,2872,866],{"class":429},[348,2874,1468],{"class":358},[348,2876,844],{"class":429},[348,2878,575],{"class":429},[348,2880,866],{"class":429},[348,2882,2342],{"class":421},[348,2884,844],{"class":429},[348,2886,337],{"class":429},[348,2888,1052],{"class":429},[348,2890,844],{"class":429},[348,2892,1459],{"class":2893},"swJcz",[348,2895,844],{"class":429},[348,2897,337],{"class":429},[348,2899,866],{"class":429},[348,2901,2468],{"class":358},[348,2903,844],{"class":429},[348,2905,575],{"class":429},[348,2907,866],{"class":429},[348,2909,869],{"class":2893},[348,2911,844],{"class":429},[348,2913,337],{"class":429},[348,2915,2765],{"class":421},[348,2917,1486],{"class":429},[348,2919,854],{"class":429},[348,2921,844],{"class":429},[348,2923,1459],{"class":2893},[348,2925,844],{"class":429},[348,2927,337],{"class":429},[348,2929,866],{"class":429},[348,2931,2501],{"class":358},[348,2933,844],{"class":429},[348,2935,575],{"class":429},[348,2937,866],{"class":429},[348,2939,869],{"class":2893},[348,2941,844],{"class":429},[348,2943,337],{"class":429},[348,2945,2765],{"class":421},[348,2947,1486],{"class":429},[348,2949,854],{"class":429},[348,2951,844],{"class":429},[348,2953,1459],{"class":2893},[348,2955,844],{"class":429},[348,2957,337],{"class":429},[348,2959,866],{"class":429},[348,2961,2535],{"class":358},[348,2963,844],{"class":429},[348,2965,575],{"class":429},[348,2967,866],{"class":429},[348,2969,869],{"class":2893},[348,2971,844],{"class":429},[348,2973,337],{"class":429},[348,2975,2976],{"class":421}," 2",[348,2978,2979],{"class":429},"}]},\n",[348,2981,2982,2984,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3110,3112],{"class":350,"line":521},[348,2983,2354],{"class":429},[348,2985,844],{"class":429},[348,2987,1442],{"class":421},[348,2989,844],{"class":429},[348,2991,337],{"class":429},[348,2993,866],{"class":429},[348,2995,1501],{"class":358},[348,2997,844],{"class":429},[348,2999,575],{"class":429},[348,3001,866],{"class":429},[348,3003,1459],{"class":421},[348,3005,844],{"class":429},[348,3007,337],{"class":429},[348,3009,866],{"class":429},[348,3011,1518],{"class":358},[348,3013,844],{"class":429},[348,3015,575],{"class":429},[348,3017,866],{"class":429},[348,3019,2342],{"class":421},[348,3021,844],{"class":429},[348,3023,337],{"class":429},[348,3025,1052],{"class":429},[348,3027,844],{"class":429},[348,3029,1459],{"class":2893},[348,3031,844],{"class":429},[348,3033,337],{"class":429},[348,3035,866],{"class":429},[348,3037,2468],{"class":358},[348,3039,844],{"class":429},[348,3041,575],{"class":429},[348,3043,866],{"class":429},[348,3045,869],{"class":2893},[348,3047,844],{"class":429},[348,3049,337],{"class":429},[348,3051,2765],{"class":421},[348,3053,1486],{"class":429},[348,3055,854],{"class":429},[348,3057,844],{"class":429},[348,3059,1459],{"class":2893},[348,3061,844],{"class":429},[348,3063,337],{"class":429},[348,3065,866],{"class":429},[348,3067,2501],{"class":358},[348,3069,844],{"class":429},[348,3071,575],{"class":429},[348,3073,866],{"class":429},[348,3075,869],{"class":2893},[348,3077,844],{"class":429},[348,3079,337],{"class":429},[348,3081,1533],{"class":421},[348,3083,1486],{"class":429},[348,3085,854],{"class":429},[348,3087,844],{"class":429},[348,3089,1459],{"class":2893},[348,3091,844],{"class":429},[348,3093,337],{"class":429},[348,3095,866],{"class":429},[348,3097,2535],{"class":358},[348,3099,844],{"class":429},[348,3101,575],{"class":429},[348,3103,866],{"class":429},[348,3105,869],{"class":2893},[348,3107,844],{"class":429},[348,3109,337],{"class":429},[348,3111,1533],{"class":421},[348,3113,2979],{"class":429},[348,3115,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234],{"class":350,"line":551},[348,3117,2354],{"class":429},[348,3119,844],{"class":429},[348,3121,1442],{"class":421},[348,3123,844],{"class":429},[348,3125,337],{"class":429},[348,3127,1548],{"class":429},[348,3129,866],{"class":429},[348,3131,1459],{"class":421},[348,3133,844],{"class":429},[348,3135,337],{"class":429},[348,3137,1548],{"class":429},[348,3139,866],{"class":429},[348,3141,2342],{"class":421},[348,3143,844],{"class":429},[348,3145,337],{"class":429},[348,3147,1052],{"class":429},[348,3149,844],{"class":429},[348,3151,1459],{"class":2893},[348,3153,844],{"class":429},[348,3155,337],{"class":429},[348,3157,866],{"class":429},[348,3159,2468],{"class":358},[348,3161,844],{"class":429},[348,3163,575],{"class":429},[348,3165,866],{"class":429},[348,3167,869],{"class":2893},[348,3169,844],{"class":429},[348,3171,337],{"class":429},[348,3173,2765],{"class":421},[348,3175,1486],{"class":429},[348,3177,854],{"class":429},[348,3179,844],{"class":429},[348,3181,1459],{"class":2893},[348,3183,844],{"class":429},[348,3185,337],{"class":429},[348,3187,866],{"class":429},[348,3189,2501],{"class":358},[348,3191,844],{"class":429},[348,3193,575],{"class":429},[348,3195,866],{"class":429},[348,3197,869],{"class":2893},[348,3199,844],{"class":429},[348,3201,337],{"class":429},[348,3203,2765],{"class":421},[348,3205,1486],{"class":429},[348,3207,854],{"class":429},[348,3209,844],{"class":429},[348,3211,1459],{"class":2893},[348,3213,844],{"class":429},[348,3215,337],{"class":429},[348,3217,866],{"class":429},[348,3219,2535],{"class":358},[348,3221,844],{"class":429},[348,3223,575],{"class":429},[348,3225,866],{"class":429},[348,3227,869],{"class":2893},[348,3229,844],{"class":429},[348,3231,337],{"class":429},[348,3233,1533],{"class":421},[348,3235,3236],{"class":429},"}]}\n",[348,3238,3239],{"class":350,"line":557},[348,3240,3241],{"class":429},"    ],\n",[348,3243,3244,3246,3248,3250,3252],{"class":350,"line":599},[348,3245,2320],{"class":429},[348,3247,1576],{"class":354},[348,3249,844],{"class":429},[348,3251,337],{"class":429},[348,3253,3254],{"class":429}," null\n",[348,3256,3257],{"class":350,"line":605},[348,3258,2562],{"class":429},[348,3260,3261],{"class":350,"line":610},[348,3262,677],{"class":429},[732,3264,3265,3283,3304],{},[735,3266,3267,3268,393,3270,3272,3273,3275,3276,3279,3280,3282],{},"Each split holds ",[330,3269,1442],{},[330,3271,1459],{}," and its ",[330,3274,2342],{},", labelled as the parts of a ",[317,3277,1265],{"href":3278},"#partition",". The splits come in the order of their key, the ",[330,3281,1241],{}," key last.",[735,3284,3285,3287,3288,3290,3291,393,3293,3296,3297,3299,3300,1238,3302,1647],{},[330,3286,1631],{}," keeps the 5 splits with the largest total over the range and folds the others into ",[330,3289,1576],{},": an object with ",[330,3292,1459],{},[330,3294,3295],{},"Other",", and a ",[330,3298,2342],{}," that holds their values per period. ",[330,3301,1576],{},[330,3303,1241],{},[735,3305,1650,3306,3308,3309,3311,3312,3314,3315,3317],{},[330,3307,1653],{},", a trend keeps its ",[330,3310,1657],{}," largest splits, ",[330,3313,1661],{}," by default, as a ",[317,3316,1265],{"href":3278}," keeps its parts.",[322,3319,406],{"id":906},[313,3321,1093,3322,3324],{},[330,3323,406],{}," gives the top rows of a grouped aggregate, one column per count, sum, average, min, max, median or percentile:",[339,3326,3328],{"className":413,"code":3327,"language":355,"meta":344,"style":344},"use Lomkit\\Rest\\Metrics\\Table;\nuse Lomkit\\Rest\\Metrics\\TableColumn;\nuse Lomkit\\Rest\\Metrics\\TableResult;\n\nclass TopCustomers extends Table\n{\n    public int $limit = 5;\n\n    public function calculate(Builder $query): TableResult\n    {\n        return $this->rows($query, 'customer', [\n            'orders' => TableColumn::count(),\n            'revenue' => TableColumn::sum('price'),\n            'basket' => TableColumn::average('price')->label('Average basket'),\n        ], orderBy: 'revenue', dateColumn: 'placed_at');\n    }\n\n    public function ranges(): array\n    {\n        return [30 => '30 days', 365 => '365 days'];\n    }\n}\n",[330,3329,3330,3350,3371,3392,3396,3408,3412,3431,3435,3456,3460,3486,3508,3536,3578,3608,3612,3617,3630,3635,3668,3673],{"__ignoreMap":344},[348,3331,3332,3334,3336,3338,3340,3342,3344,3346,3348],{"class":350,"line":351},[348,3333,422],{"class":421},[348,3335,453],{"class":425},[348,3337,430],{"class":429},[348,3339,458],{"class":425},[348,3341,430],{"class":429},[348,3343,140],{"class":425},[348,3345,430],{"class":429},[348,3347,406],{"class":425},[348,3349,446],{"class":429},[348,3351,3352,3354,3356,3358,3360,3362,3364,3366,3369],{"class":350,"line":371},[348,3353,422],{"class":421},[348,3355,453],{"class":425},[348,3357,430],{"class":429},[348,3359,458],{"class":425},[348,3361,430],{"class":429},[348,3363,140],{"class":425},[348,3365,430],{"class":429},[348,3367,3368],{"class":425},"TableColumn",[348,3370,446],{"class":429},[348,3372,3373,3375,3377,3379,3381,3383,3385,3387,3390],{"class":350,"line":471},[348,3374,422],{"class":421},[348,3376,453],{"class":425},[348,3378,430],{"class":429},[348,3380,458],{"class":425},[348,3382,430],{"class":429},[348,3384,140],{"class":425},[348,3386,430],{"class":429},[348,3388,3389],{"class":425},"TableResult",[348,3391,446],{"class":429},[348,3393,3394],{"class":350,"line":493},[348,3395,497],{"emptyLinePlaceholder":496},[348,3397,3398,3400,3403,3405],{"class":350,"line":500},[348,3399,504],{"class":503},[348,3401,3402],{"class":354}," TopCustomers",[348,3404,509],{"class":503},[348,3406,3407],{"class":354}," Table\n",[348,3409,3410],{"class":350,"line":515},[348,3411,518],{"class":429},[348,3413,3414,3416,3419,3421,3424,3427,3429],{"class":350,"line":521},[348,3415,524],{"class":503},[348,3417,3418],{"class":421}," int",[348,3420,539],{"class":429},[348,3422,3423],{"class":425},"limit ",[348,3425,3426],{"class":429},"=",[348,3428,1483],{"class":421},[348,3430,446],{"class":429},[348,3432,3433],{"class":350,"line":551},[348,3434,497],{"emptyLinePlaceholder":496},[348,3436,3437,3439,3441,3443,3445,3447,3449,3451,3453],{"class":350,"line":557},[348,3438,524],{"class":503},[348,3440,527],{"class":503},[348,3442,531],{"class":530},[348,3444,534],{"class":429},[348,3446,443],{"class":354},[348,3448,539],{"class":429},[348,3450,542],{"class":425},[348,3452,545],{"class":429},[348,3454,3455],{"class":354}," TableResult\n",[348,3457,3458],{"class":350,"line":599},[348,3459,554],{"class":429},[348,3461,3462,3464,3466,3469,3471,3473,3475,3477,3480,3482,3484],{"class":350,"line":605},[348,3463,561],{"class":560},[348,3465,564],{"class":429},[348,3467,3468],{"class":530},"rows",[348,3470,570],{"class":429},[348,3472,542],{"class":425},[348,3474,575],{"class":429},[348,3476,578],{"class":429},[348,3478,3479],{"class":358},"customer",[348,3481,584],{"class":429},[348,3483,575],{"class":429},[348,3485,2349],{"class":429},[348,3487,3488,3491,3494,3496,3498,3501,3503,3505],{"class":350,"line":610},[348,3489,3490],{"class":429},"            '",[348,3492,3493],{"class":358},"orders",[348,3495,584],{"class":429},[348,3497,642],{"class":429},[348,3499,3500],{"class":354}," TableColumn",[348,3502,720],{"class":429},[348,3504,1369],{"class":530},[348,3506,3507],{"class":429},"(),\n",[348,3509,3510,3512,3515,3517,3519,3521,3523,3525,3527,3529,3531,3533],{"class":350,"line":626},[348,3511,3490],{"class":429},[348,3513,3514],{"class":358},"revenue",[348,3516,584],{"class":429},[348,3518,642],{"class":429},[348,3520,3500],{"class":354},[348,3522,720],{"class":429},[348,3524,567],{"class":530},[348,3526,534],{"class":429},[348,3528,584],{"class":429},[348,3530,581],{"class":358},[348,3532,584],{"class":429},[348,3534,3535],{"class":429},"),\n",[348,3537,3538,3540,3543,3545,3547,3549,3551,3554,3556,3558,3560,3562,3565,3567,3569,3571,3574,3576],{"class":350,"line":631},[348,3539,3490],{"class":429},[348,3541,3542],{"class":358},"basket",[348,3544,584],{"class":429},[348,3546,642],{"class":429},[348,3548,3500],{"class":354},[348,3550,720],{"class":429},[348,3552,3553],{"class":530},"average",[348,3555,534],{"class":429},[348,3557,584],{"class":429},[348,3559,581],{"class":358},[348,3561,584],{"class":429},[348,3563,3564],{"class":429},")->",[348,3566,1459],{"class":530},[348,3568,534],{"class":429},[348,3570,584],{"class":429},[348,3572,3573],{"class":358},"Average basket",[348,3575,584],{"class":429},[348,3577,3535],{"class":429},[348,3579,3580,3583,3586,3588,3590,3592,3594,3596,3598,3600,3602,3604,3606],{"class":350,"line":669},[348,3581,3582],{"class":429},"        ],",[348,3584,3585],{"class":354}," orderBy",[348,3587,337],{"class":429},[348,3589,578],{"class":429},[348,3591,3514],{"class":358},[348,3593,584],{"class":429},[348,3595,575],{"class":429},[348,3597,1740],{"class":354},[348,3599,337],{"class":429},[348,3601,578],{"class":429},[348,3603,591],{"class":358},[348,3605,584],{"class":429},[348,3607,596],{"class":429},[348,3609,3610],{"class":350,"line":674},[348,3611,602],{"class":429},[348,3613,3615],{"class":350,"line":3614},17,[348,3616,497],{"emptyLinePlaceholder":496},[348,3618,3620,3622,3624,3626,3628],{"class":350,"line":3619},18,[348,3621,524],{"class":503},[348,3623,527],{"class":503},[348,3625,617],{"class":530},[348,3627,620],{"class":429},[348,3629,623],{"class":421},[348,3631,3633],{"class":350,"line":3632},19,[348,3634,554],{"class":429},[348,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3657,3659,3661,3664,3666],{"class":350,"line":3637},20,[348,3639,561],{"class":560},[348,3641,636],{"class":429},[348,3643,639],{"class":421},[348,3645,642],{"class":429},[348,3647,578],{"class":429},[348,3649,647],{"class":358},[348,3651,584],{"class":429},[348,3653,575],{"class":429},[348,3655,3656],{"class":421}," 365",[348,3658,642],{"class":429},[348,3660,578],{"class":429},[348,3662,3663],{"class":358},"365 days",[348,3665,584],{"class":429},[348,3667,666],{"class":429},[348,3669,3671],{"class":350,"line":3670},21,[348,3672,602],{"class":429},[348,3674,3676],{"class":350,"line":3675},22,[348,3677,677],{"class":429},[339,3679,3681],{"className":823,"code":3680,"language":825,"meta":344,"style":344},"{\"data\": {\"type\": \"table\", \"columns\": [{\"name\": \"orders\", \"label\": \"Orders\", \"aggregate\": \"count\"}, {\"name\": \"revenue\", \"label\": \"Revenue\", \"aggregate\": \"sum\"}, {\"name\": \"basket\", \"label\": \"Average basket\", \"aggregate\": \"average\"}], \"rows\": [{\"key\": \"acme\", \"label\": \"acme\", \"values\": {\"orders\": 2, \"revenue\": 150.0, \"basket\": 75.0}}]}}\n",[330,3682,3683],{"__ignoreMap":344},[348,3684,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3718,3720,3722,3724,3726,3729,3731,3733,3735,3737,3739,3741,3743,3745,3747,3749,3751,3754,3756,3758,3760,3763,3765,3767,3769,3771,3773,3775,3777,3779,3781,3783,3785,3787,3789,3791,3793,3795,3797,3799,3801,3803,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844,3846,3848,3850,3852,3854,3856,3858,3860,3862,3864,3866,3868,3870,3872,3874,3876,3878,3880,3882,3884,3886,3888,3890,3892,3894,3896,3899,3901,3903,3905,3907,3909,3911,3913,3915,3917,3919,3921,3924,3926,3928,3930,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950,3953,3955,3957,3959,3961,3963,3966],{"class":350,"line":351},[348,3686,841],{"class":429},[348,3688,844],{"class":429},[348,3690,847],{"class":503},[348,3692,844],{"class":429},[348,3694,337],{"class":429},[348,3696,854],{"class":429},[348,3698,844],{"class":429},[348,3700,859],{"class":354},[348,3702,844],{"class":429},[348,3704,337],{"class":429},[348,3706,866],{"class":429},[348,3708,906],{"class":358},[348,3710,844],{"class":429},[348,3712,575],{"class":429},[348,3714,866],{"class":429},[348,3716,3717],{"class":354},"columns",[348,3719,844],{"class":429},[348,3721,337],{"class":429},[348,3723,1052],{"class":429},[348,3725,844],{"class":429},[348,3727,3728],{"class":421},"name",[348,3730,844],{"class":429},[348,3732,337],{"class":429},[348,3734,866],{"class":429},[348,3736,3493],{"class":358},[348,3738,844],{"class":429},[348,3740,575],{"class":429},[348,3742,866],{"class":429},[348,3744,1459],{"class":421},[348,3746,844],{"class":429},[348,3748,337],{"class":429},[348,3750,866],{"class":429},[348,3752,3753],{"class":358},"Orders",[348,3755,844],{"class":429},[348,3757,575],{"class":429},[348,3759,866],{"class":429},[348,3761,3762],{"class":421},"aggregate",[348,3764,844],{"class":429},[348,3766,337],{"class":429},[348,3768,866],{"class":429},[348,3770,1369],{"class":358},[348,3772,844],{"class":429},[348,3774,1486],{"class":429},[348,3776,854],{"class":429},[348,3778,844],{"class":429},[348,3780,3728],{"class":421},[348,3782,844],{"class":429},[348,3784,337],{"class":429},[348,3786,866],{"class":429},[348,3788,3514],{"class":358},[348,3790,844],{"class":429},[348,3792,575],{"class":429},[348,3794,866],{"class":429},[348,3796,1459],{"class":421},[348,3798,844],{"class":429},[348,3800,337],{"class":429},[348,3802,866],{"class":429},[348,3804,3805],{"class":358},"Revenue",[348,3807,844],{"class":429},[348,3809,575],{"class":429},[348,3811,866],{"class":429},[348,3813,3762],{"class":421},[348,3815,844],{"class":429},[348,3817,337],{"class":429},[348,3819,866],{"class":429},[348,3821,567],{"class":358},[348,3823,844],{"class":429},[348,3825,1486],{"class":429},[348,3827,854],{"class":429},[348,3829,844],{"class":429},[348,3831,3728],{"class":421},[348,3833,844],{"class":429},[348,3835,337],{"class":429},[348,3837,866],{"class":429},[348,3839,3542],{"class":358},[348,3841,844],{"class":429},[348,3843,575],{"class":429},[348,3845,866],{"class":429},[348,3847,1459],{"class":421},[348,3849,844],{"class":429},[348,3851,337],{"class":429},[348,3853,866],{"class":429},[348,3855,3573],{"class":358},[348,3857,844],{"class":429},[348,3859,575],{"class":429},[348,3861,866],{"class":429},[348,3863,3762],{"class":421},[348,3865,844],{"class":429},[348,3867,337],{"class":429},[348,3869,866],{"class":429},[348,3871,3553],{"class":358},[348,3873,844],{"class":429},[348,3875,1571],{"class":429},[348,3877,866],{"class":429},[348,3879,3468],{"class":354},[348,3881,844],{"class":429},[348,3883,337],{"class":429},[348,3885,1052],{"class":429},[348,3887,844],{"class":429},[348,3889,1442],{"class":421},[348,3891,844],{"class":429},[348,3893,337],{"class":429},[348,3895,866],{"class":429},[348,3897,3898],{"class":358},"acme",[348,3900,844],{"class":429},[348,3902,575],{"class":429},[348,3904,866],{"class":429},[348,3906,1459],{"class":421},[348,3908,844],{"class":429},[348,3910,337],{"class":429},[348,3912,866],{"class":429},[348,3914,3898],{"class":358},[348,3916,844],{"class":429},[348,3918,575],{"class":429},[348,3920,866],{"class":429},[348,3922,3923],{"class":421},"values",[348,3925,844],{"class":429},[348,3927,337],{"class":429},[348,3929,854],{"class":429},[348,3931,844],{"class":429},[348,3933,3493],{"class":2893},[348,3935,844],{"class":429},[348,3937,337],{"class":429},[348,3939,2976],{"class":421},[348,3941,575],{"class":429},[348,3943,866],{"class":429},[348,3945,3514],{"class":2893},[348,3947,844],{"class":429},[348,3949,337],{"class":429},[348,3951,3952],{"class":421}," 150.0",[348,3954,575],{"class":429},[348,3956,866],{"class":429},[348,3958,3542],{"class":2893},[348,3960,844],{"class":429},[348,3962,337],{"class":429},[348,3964,3965],{"class":421}," 75.0",[348,3967,3968],{"class":429},"}}]}}\n",[732,3970,3971,3977,4004,4015,4024],{},[735,3972,3973,3976],{},[330,3974,3975],{},"rows($query, $groupBy, $columns, $orderBy = null, $direction = 'desc', $dateColumn = 'created_at')",". A column name starts with a lowercase letter and holds letters, digits and underscores.",[735,3978,3979,393,3982,393,3985,393,3988,393,3991,393,3994,403,3997,950,4000,4003],{},[330,3980,3981],{},"TableColumn::count()",[330,3983,3984],{},"sum($field)",[330,3986,3987],{},"average($field)",[330,3989,3990],{},"min($field)",[330,3992,3993],{},"max($field)",[330,3995,3996],{},"median($field)",[330,3998,3999],{},"percentile($field, $percentile)",[330,4001,4002],{},"->label()"," names a column, else its name in words.",[735,4005,4006,4007,4010,4011,4014],{},"The rows are ordered by ",[330,4008,4009],{},"$orderBy",", the first column by default, largest first. ",[330,4012,4013],{},"'asc'"," puts the smallest first.",[735,4016,4017,4020,4021,4023],{},[330,4018,4019],{},"$limit"," keeps from 1 to 100 rows, 10 by default. ",[330,4022,1631],{}," sets it when the resource declares the metric.",[735,4025,4026,4029,4030,795],{},[330,4027,4028],{},"->labels([...])"," on the result renames rows. For labels stored elsewhere, read them for ",[330,4031,4032],{},"$table->keys()",[322,4034,4036],{"id":4035},"median-and-percentile","Median and percentile",[313,4038,4039,403,4041,4044,4045,393,4047,393,4049,4051,4052,393,4055,4058,4059,4051,4061,393,4064,545],{},[330,4040,1207],{},[330,4042,4043],{},"percentile()"," work on ",[330,4046,392],{},[330,4048,396],{},[330,4050,402],{}," (",[330,4053,4054],{},"medianByMonths()",[330,4056,4057],{},"percentileByMonths()",") and ",[330,4060,406],{},[330,4062,4063],{},"TableColumn::median()",[330,4065,4066],{},"TableColumn::percentile()",[339,4068,4070],{"className":413,"code":4069,"language":355,"meta":344,"style":344},"return $this->percentile($query, 'resolution_minutes', 0.9, 'closed_at');\n",[330,4071,4072],{"__ignoreMap":344},[348,4073,4074,4076,4078,4081,4083,4085,4087,4089,4092,4094,4096,4098,4100,4103,4105,4107,4110,4112],{"class":350,"line":351},[348,4075,1709],{"class":560},[348,4077,564],{"class":429},[348,4079,4080],{"class":530},"percentile",[348,4082,570],{"class":429},[348,4084,542],{"class":425},[348,4086,575],{"class":429},[348,4088,578],{"class":429},[348,4090,4091],{"class":358},"resolution_minutes",[348,4093,584],{"class":429},[348,4095,575],{"class":429},[348,4097,2765],{"class":421},[348,4099,795],{"class":429},[348,4101,4102],{"class":421},"9",[348,4104,575],{"class":429},[348,4106,578],{"class":429},[348,4108,4109],{"class":358},"closed_at",[348,4111,584],{"class":429},[348,4113,596],{"class":429},[732,4115,4116,4122,4129,4132],{},[735,4117,4118,4119,777],{},"The percentile is a number from 0 to 1. Another value throws ",[330,4120,4121],{},"InvalidMetricException",[735,4123,4124,4125,4128],{},"The result is interpolated between the two nearest rows, as PostgreSQL ",[330,4126,4127],{},"percentile_cont()"," does. Rows without a value are left out.",[735,4130,4131],{},"The database sorts the rows of each group: index the column on a large table.",[735,4133,4134],{},"SQLite, MySQL, MariaDB and PostgreSQL are supported.",[322,4136,4138],{"id":4137},"your-own-metric","Your own metric",[313,4140,4141,4142,4145,4146,4149,4150,337],{},"A metric of your own extends ",[330,4143,4144],{},"Lomkit\\Rest\\Metrics\\Metric",", names its type in ",[330,4147,4148],{},"type()"," and returns a ",[330,4151,4152],{},"MetricResult",[339,4154,4156],{"className":413,"code":4155,"language":355,"meta":344,"style":344},"use Lomkit\\Rest\\Metrics\\Metric;\nuse Lomkit\\Rest\\Metrics\\MetricResult;\n\nclass TicketBacklog extends Metric\n{\n    public function type(): string\n    {\n        return 'gauge';\n    }\n\n    public function calculate(Builder $query): MetricResult\n    {\n        return new Gauge($query->where('status', 'open')->count(), 500);\n    }\n}\n\nfinal readonly class Gauge implements MetricResult\n{\n    public function __construct(private int $value, private int $max) {}\n\n    public function jsonSerialize(): array\n    {\n        return ['value' => $this->value, 'max' => $this->max];\n    }\n}\n",[330,4157,4158,4178,4198,4202,4214,4218,4232,4236,4249,4253,4257,4278,4282,4331,4335,4339,4343,4361,4365,4403,4407,4420,4424,4459,4464],{"__ignoreMap":344},[348,4159,4160,4162,4164,4166,4168,4170,4172,4174,4176],{"class":350,"line":351},[348,4161,422],{"class":421},[348,4163,453],{"class":425},[348,4165,430],{"class":429},[348,4167,458],{"class":425},[348,4169,430],{"class":429},[348,4171,140],{"class":425},[348,4173,430],{"class":429},[348,4175,783],{"class":425},[348,4177,446],{"class":429},[348,4179,4180,4182,4184,4186,4188,4190,4192,4194,4196],{"class":350,"line":371},[348,4181,422],{"class":421},[348,4183,453],{"class":425},[348,4185,430],{"class":429},[348,4187,458],{"class":425},[348,4189,430],{"class":429},[348,4191,140],{"class":425},[348,4193,430],{"class":429},[348,4195,4152],{"class":425},[348,4197,446],{"class":429},[348,4199,4200],{"class":350,"line":471},[348,4201,497],{"emptyLinePlaceholder":496},[348,4203,4204,4206,4209,4211],{"class":350,"line":493},[348,4205,504],{"class":503},[348,4207,4208],{"class":354}," TicketBacklog",[348,4210,509],{"class":503},[348,4212,4213],{"class":354}," Metric\n",[348,4215,4216],{"class":350,"line":500},[348,4217,518],{"class":429},[348,4219,4220,4222,4224,4227,4229],{"class":350,"line":515},[348,4221,524],{"class":503},[348,4223,527],{"class":503},[348,4225,4226],{"class":530}," type",[348,4228,620],{"class":429},[348,4230,4231],{"class":421}," string\n",[348,4233,4234],{"class":350,"line":521},[348,4235,554],{"class":429},[348,4237,4238,4240,4242,4245,4247],{"class":350,"line":551},[348,4239,561],{"class":560},[348,4241,578],{"class":429},[348,4243,4244],{"class":358},"gauge",[348,4246,584],{"class":429},[348,4248,446],{"class":429},[348,4250,4251],{"class":350,"line":557},[348,4252,602],{"class":429},[348,4254,4255],{"class":350,"line":599},[348,4256,497],{"emptyLinePlaceholder":496},[348,4258,4259,4261,4263,4265,4267,4269,4271,4273,4275],{"class":350,"line":605},[348,4260,524],{"class":503},[348,4262,527],{"class":503},[348,4264,531],{"class":530},[348,4266,534],{"class":429},[348,4268,443],{"class":354},[348,4270,539],{"class":429},[348,4272,542],{"class":425},[348,4274,545],{"class":429},[348,4276,4277],{"class":354}," MetricResult\n",[348,4279,4280],{"class":350,"line":610},[348,4281,554],{"class":429},[348,4283,4284,4286,4289,4292,4294,4296,4299,4302,4304,4306,4308,4310,4312,4314,4317,4319,4321,4323,4326,4329],{"class":350,"line":626},[348,4285,561],{"class":560},[348,4287,4288],{"class":421}," new",[348,4290,4291],{"class":354}," Gauge",[348,4293,570],{"class":429},[348,4295,542],{"class":425},[348,4297,4298],{"class":429},"->",[348,4300,4301],{"class":530},"where",[348,4303,534],{"class":429},[348,4305,584],{"class":429},[348,4307,1066],{"class":358},[348,4309,584],{"class":429},[348,4311,575],{"class":429},[348,4313,578],{"class":429},[348,4315,4316],{"class":358},"open",[348,4318,584],{"class":429},[348,4320,3564],{"class":429},[348,4322,1369],{"class":530},[348,4324,4325],{"class":429},"(),",[348,4327,4328],{"class":421}," 500",[348,4330,596],{"class":429},[348,4332,4333],{"class":350,"line":631},[348,4334,602],{"class":429},[348,4336,4337],{"class":350,"line":669},[348,4338,677],{"class":429},[348,4340,4341],{"class":350,"line":674},[348,4342,497],{"emptyLinePlaceholder":496},[348,4344,4345,4348,4351,4354,4356,4359],{"class":350,"line":3614},[348,4346,4347],{"class":503},"final",[348,4349,4350],{"class":503}," readonly",[348,4352,4353],{"class":503}," class",[348,4355,4291],{"class":354},[348,4357,4358],{"class":503}," implements",[348,4360,4277],{"class":354},[348,4362,4363],{"class":350,"line":3619},[348,4364,518],{"class":429},[348,4366,4367,4369,4371,4374,4376,4379,4381,4383,4385,4387,4390,4392,4394,4397,4400],{"class":350,"line":3632},[348,4368,524],{"class":503},[348,4370,527],{"class":503},[348,4372,4373],{"class":530}," __construct",[348,4375,534],{"class":429},[348,4377,4378],{"class":503},"private",[348,4380,3418],{"class":421},[348,4382,539],{"class":429},[348,4384,869],{"class":425},[348,4386,575],{"class":429},[348,4388,4389],{"class":503}," private",[348,4391,3418],{"class":421},[348,4393,539],{"class":429},[348,4395,4396],{"class":425},"max",[348,4398,4399],{"class":429},")",[348,4401,4402],{"class":429}," {}\n",[348,4404,4405],{"class":350,"line":3637},[348,4406,497],{"emptyLinePlaceholder":496},[348,4408,4409,4411,4413,4416,4418],{"class":350,"line":3670},[348,4410,524],{"class":503},[348,4412,527],{"class":503},[348,4414,4415],{"class":530}," jsonSerialize",[348,4417,620],{"class":429},[348,4419,623],{"class":421},[348,4421,4422],{"class":350,"line":3675},[348,4423,554],{"class":429},[348,4425,4427,4429,4431,4433,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457],{"class":350,"line":4426},23,[348,4428,561],{"class":560},[348,4430,636],{"class":429},[348,4432,584],{"class":429},[348,4434,869],{"class":358},[348,4436,584],{"class":429},[348,4438,642],{"class":429},[348,4440,564],{"class":429},[348,4442,869],{"class":425},[348,4444,575],{"class":429},[348,4446,578],{"class":429},[348,4448,4396],{"class":358},[348,4450,584],{"class":429},[348,4452,642],{"class":429},[348,4454,564],{"class":429},[348,4456,4396],{"class":425},[348,4458,666],{"class":429},[348,4460,4462],{"class":350,"line":4461},24,[348,4463,602],{"class":429},[348,4465,4467],{"class":350,"line":4466},25,[348,4468,677],{"class":429},[339,4470,4472],{"className":823,"code":4471,"language":825,"meta":344,"style":344},"{\"data\": {\"type\": \"gauge\", \"value\": 42, \"max\": 500}}\n",[330,4473,4474],{"__ignoreMap":344},[348,4475,4476,4478,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510,4512,4515,4517,4519,4521,4523,4525,4527],{"class":350,"line":351},[348,4477,841],{"class":429},[348,4479,844],{"class":429},[348,4481,847],{"class":503},[348,4483,844],{"class":429},[348,4485,337],{"class":429},[348,4487,854],{"class":429},[348,4489,844],{"class":429},[348,4491,859],{"class":354},[348,4493,844],{"class":429},[348,4495,337],{"class":429},[348,4497,866],{"class":429},[348,4499,4244],{"class":358},[348,4501,844],{"class":429},[348,4503,575],{"class":429},[348,4505,866],{"class":429},[348,4507,869],{"class":354},[348,4509,844],{"class":429},[348,4511,337],{"class":429},[348,4513,4514],{"class":421}," 42",[348,4516,575],{"class":429},[348,4518,866],{"class":429},[348,4520,4396],{"class":354},[348,4522,844],{"class":429},[348,4524,337],{"class":429},[348,4526,4328],{"class":421},[348,4528,901],{"class":429},[732,4530,4531,4541,4555],{},[735,4532,4533,4535,4536,4538,4539,795],{},[330,4534,4148],{}," holds lowercase letters, digits and dashes. A result with its own ",[330,4537,859],{}," key throws ",[330,4540,4121],{},[735,4542,4543,4546,4547,4550,4551,4554],{},[330,4544,4545],{},"$this->range()"," gives the selected range, ",[330,4548,4549],{},"$this->timezone()"," the zone of the request, and ",[330,4552,4553],{},"$this->periods($query, 'placed_at', PeriodUnit::Day, 7)"," the periods of a series.",[735,4556,4557,4560,4561,4564,4565,1137,4568,4570,4571,4573],{},[330,4558,4559],{},"schema()"," describes the result in the ",[317,4562,4563],{"href":185},"OpenAPI document",". It returns a Scramble type, ",[330,4566,4567],{},"?Type",[330,4569,1241],{}," by default: the document then gives ",[330,4572,859],{}," alone.",[322,4575,4577],{"id":4576},"caching-a-result","Caching a result",[313,4579,4580,4583],{},[330,4581,4582],{},"->cacheFor()"," keeps the result between requests:",[339,4585,4587],{"className":413,"code":4586,"language":355,"meta":344,"style":344},"public function metrics(): array\n{\n    return [\n        TotalRevenue::make()->cacheFor(600),\n        OrdersByStatus::make()->cacheFor(600)->cacheScope('global'),\n    ];\n}\n",[330,4588,4589,4601,4605,4611,4633,4666,4671],{"__ignoreMap":344},[348,4590,4591,4593,4595,4597,4599],{"class":350,"line":351},[348,4592,694],{"class":503},[348,4594,527],{"class":503},[348,4596,699],{"class":530},[348,4598,620],{"class":429},[348,4600,623],{"class":421},[348,4602,4603],{"class":350,"line":371},[348,4604,518],{"class":429},[348,4606,4607,4609],{"class":350,"line":471},[348,4608,712],{"class":560},[348,4610,2349],{"class":429},[348,4612,4613,4616,4618,4620,4623,4626,4628,4631],{"class":350,"line":493},[348,4614,4615],{"class":354},"        TotalRevenue",[348,4617,720],{"class":429},[348,4619,723],{"class":530},[348,4621,4622],{"class":429},"()->",[348,4624,4625],{"class":530},"cacheFor",[348,4627,534],{"class":429},[348,4629,4630],{"class":421},"600",[348,4632,3535],{"class":429},[348,4634,4635,4638,4640,4642,4644,4646,4648,4650,4652,4655,4657,4659,4662,4664],{"class":350,"line":500},[348,4636,4637],{"class":354},"        OrdersByStatus",[348,4639,720],{"class":429},[348,4641,723],{"class":530},[348,4643,4622],{"class":429},[348,4645,4625],{"class":530},[348,4647,534],{"class":429},[348,4649,4630],{"class":421},[348,4651,3564],{"class":429},[348,4653,4654],{"class":530},"cacheScope",[348,4656,534],{"class":429},[348,4658,584],{"class":429},[348,4660,4661],{"class":358},"global",[348,4663,584],{"class":429},[348,4665,3535],{"class":429},[348,4667,4668],{"class":350,"line":515},[348,4669,4670],{"class":429},"    ];\n",[348,4672,4673],{"class":350,"line":521},[348,4674,677],{"class":429},[732,4676,4677,4694,4708,4721,4727],{},[735,4678,4679,4682,4683,4686,4687,4690,4691,795],{},[330,4680,4681],{},"cacheFor()"," takes seconds, a ",[330,4684,4685],{},"DateInterval"," or an instant such as ",[330,4688,4689],{},"now()->addMinutes(10)",". A metric class can declare ",[330,4692,4693],{},"public ?int $cacheFor = 600;",[735,4695,4696,4697,1137,4700,4703,4704,4707],{},"Each user gets their own result. ",[330,4698,4699],{},"cacheScope('global')",[330,4701,4702],{},"public CacheScope $cacheScope = CacheScope::Global;",", shares one result between the users whose ",[330,4705,4706],{},"perimeterQuery()"," compiles to the same SQL and bindings: the users of one team share it, another team gets its own.",[735,4709,4710,4711,393,4713,403,4715,4717,4718,795],{},"The key also holds the resource, the metric and its settings, the ",[330,4712,986],{},[330,4714,1000],{},[330,4716,742],{}," of the request, and the values of the resource's ",[330,4719,4720],{},"authorizationCacheContext()",[735,4722,4723,4724,4726],{},"A kept result still runs validation, the abilities, the middleware and ",[330,4725,1132],{},". It skips the queries of the metric.",[735,4728,4729,4730,950,4733,4736,4737,4740,4741,4744,4745,4748,4749,795],{},"The results go to the store of ",[330,4731,4732],{},"authorizations.cache.store",[330,4734,4735],{},"Rest::forgetAuthorizationsFor($user)"," drops the results of a user, ",[330,4738,4739],{},"Rest::forgetAuthorizations()"," drops every result, and ",[330,4742,4743],{},"authorizations.cache.enabled"," set to ",[330,4746,4747],{},"false"," keeps none. See ",[317,4750,4751],{"href":163},"Decision cache",[4753,4754,4755],"warning",{},[313,4756,4757,4758,4760,4761,4763],{},"A global result keys the SQL of ",[330,4759,4706],{}," only. A perimeter that also depends on a global scope of the model, or on the tenant of a database per tenant, adds that value to ",[330,4762,4720],{},", or the tenants share one result.",[322,4765,4767],{"id":4766},"abilities-and-routes","Abilities and routes",[732,4769,4770,4794,4814,4827],{},[735,4771,4772,4773,4775,4776,4779,4780,4783,4784,393,4786,4789,4790,4793],{},"A metric checks ",[330,4774,1121],{}," on the resource, the abilities of the resource's ",[330,4777,4778],{},"abilities()"," for ",[330,4781,4782],{},"Endpoint::Metric",", then the metric's ",[330,4785,4778],{},[330,4787,4788],{},"['viewAny']"," by default. ",[330,4791,4792],{},"[]"," runs without these checks.",[735,4795,4796,403,4799,4802,4803,403,4806,4809,4810,795],{},[330,4797,4798],{},"->middleware()",[330,4800,4801],{},"->withoutMiddleware()",", or the ",[330,4804,4805],{},"$middleware",[330,4807,4808],{},"$withoutMiddleware"," properties, work as for ",[317,4811,4813],{"href":4812},"\u002Factions-and-metrics\u002Factions#middleware","actions",[735,4815,4816,4819,4820,4822,4823,4826],{},[330,4817,4818],{},"Rest::resource()"," reads ",[330,4821,683],{}," when it registers the routes: keep the list the same for every user. ",[330,4824,4825],{},"except('metric')"," removes the metric routes.",[735,4828,4829,4830,4833,4834,4837,4838,403,4840,795],{},"The ",[317,4831,4832],{"href":173},"details",", with ",[330,4835,4836],{},"?with=metrics",", list each metric with its ",[330,4839,859],{},[330,4841,4842],{},"ranges",[4844,4845,4846],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":344,"searchDepth":351,"depth":371,"links":4848},[4849,4850,4851,4852,4855,4856,4859,4860,4861,4862,4863],{"id":324,"depth":371,"text":325},{"id":798,"depth":371,"text":799},{"id":869,"depth":371,"text":392},{"id":1265,"depth":371,"text":396,"children":4853},[4854],{"id":1683,"depth":471,"text":1684},{"id":1935,"depth":371,"text":399},{"id":2061,"depth":371,"text":402,"children":4857},[4858],{"id":2639,"depth":471,"text":2640},{"id":906,"depth":371,"text":406},{"id":4035,"depth":371,"text":4036},{"id":4137,"depth":371,"text":4138},{"id":4576,"depth":371,"text":4577},{"id":4766,"depth":371,"text":4767},"Compute counts, totals, breakdowns, trends and top lists over the rows of a resource, with ranges, time zones and a result cache.","md",null,{},{"title":140,"description":4864},{"loc":141},"jpj41brgcz2BZ3xUh3NklTfqglmK3s1yZb631hHcDxs",[4872,4874],{"title":136,"path":137,"stem":138,"description":4873,"children":-1},"Make the endpoint check that the user confirmed an action or a write before it runs, with a signed token and a 428 response.",{"title":144,"path":145,"stem":146,"description":4875,"children":-1},"Export the rows of a search to a CSV file in the background, in the columns the client picks, with a queued, batched action.",1794181355024]