Repository navigation
What's Changed
- Map the file for a parallel CSV read by @randyzwitch in #144
- Take signed decimals on the one-pass Float64 parser by @randyzwitch in #145
- Pipeline CSV decoding and reduce parsing and assembly overhead by @randyzwitch in #153
- Avoid reparsing wide decimal floats in CSV and casts by @randyzwitch in #154
- Accelerate numeric reductions, ordered joins, and decimal parsing by @randyzwitch in #155
- CSV: translate Polars atoi_simd integer parsing by @randyzwitch in #159
- Replace public CSV reader with the Polars-derived pipeline by @randyzwitch in #161
- Avoid owned strings in numeric casts and measure the path by @randyzwitch in #162
- Append single CSV chunks directly during assembly by @randyzwitch in #163
- Stop rechunking fused CSV expressions on every batch by @randyzwitch in #164
- Move benchmark research to wiki and remove third_party directory by @randyzwitch in #166
- Filter large chunked frames without input rechunking by @randyzwitch in #167
- Keep CSV source attribution in central notice by @randyzwitch in #168
- Keep moderately repeated grouping keys on serial route by @randyzwitch in #169
- Encode chunked string group keys without rechunking by @randyzwitch in #170
- Gather serial group keys from source chunks by @randyzwitch in #171
- Assemble parallel string gathers as chunks by @randyzwitch in #172
- Gather medium multicolumn frames by column by @randyzwitch in #173
- Gather partitioned group inputs in one pass by @randyzwitch in #174
- Share left columns for identity-order join output by @randyzwitch in #175
- Rechunk parallel gather inputs by column by @randyzwitch in #176
- Count grouped bare columns without row batches by @randyzwitch in #177
- Accumulate Float64 reductions eight values at a time by @randyzwitch in #178
- Keep CSV integer source history out of code comments by @randyzwitch in #179
- Size CSV decode workers to mapped input by @randyzwitch in #180
- Scan chunked Float64 sums without materializing chunk views by @randyzwitch in #181
- Sort medium low-cardinality first keys by independent buckets by @randyzwitch in #182
- Pack fused expression validity by byte by @randyzwitch in #184
- Use constant-size hash storage for group cardinality sampling by @randyzwitch in #186
- Reuse hash worker histograms for group scatter by @randyzwitch in #187
- Encode single string group keys in parallel by @randyzwitch in #189
- Select simple Float64 filter rows directly by @randyzwitch in #183
- Use direct row lookup for dense ascending Int64 right joins by @randyzwitch in #190
- Evaluate large fused expressions on source chunk windows by @randyzwitch in #185
- Keep parallel expression outputs chunked by @randyzwitch in #188
- Split large sorted chunk gathers across workers by @randyzwitch in #191
- Speed up low-cardinality Int64 grouping with direct key lookup by @randyzwitch in #192
- Reduce filter row-index concatenation allocations by @randyzwitch in #193
- Use standard sort for parallel index runs by @randyzwitch in #194
- Inline hot CSV field splitting path by @randyzwitch in #195
- Filter aligned chunks directly with bounded workers by @randyzwitch in #196
- Keep radix sort keys local to low-cardinality buckets by @randyzwitch in #197
- Avoid partition gather for skewed small-domain groups by @randyzwitch in #198
- Parse short CSV integers with scalar digits by @randyzwitch in #199
- Preallocate row evaluation outputs by @randyzwitch in #201
- Skip redundant bounds checks in short CSV integers by @randyzwitch in #203
- Scan plain CSV records with one delimiter vector by @randyzwitch in #204
- perf: write fused comparison results directly to bitmap by @randyzwitch in #205
- Aggregate numeric sum and count directly by hash bucket by @randyzwitch in #200
- perf: preserve absent validity in all-valid column gathers by @randyzwitch in #206
- Scale CSV chunk count with input size by @randyzwitch in #207
- Evaluate expressions in eight-row SIMD batches by @randyzwitch in #208
- Use larger bounded batches for with_columns by @randyzwitch in #209
- Decode CSV columns in bounded row groups by @randyzwitch in #210
- Skip validity work for all-valid parallel gathers by @randyzwitch in #211
- Fuse low-cardinality grouped sum and count across workers by @randyzwitch in #212
- Pipeline lazy CSV filters through decode workers by @randyzwitch in #213
- Fuse bounded grouped Float64 aggregates across worker ranges by @randyzwitch in #214
- Defer sort gathers and push row-local filters below sort by @randyzwitch in #215
- Benchmark general joins against Polars at large row counts by @randyzwitch in #216
- Use direct membership for bounded Int64 semi and anti joins by @randyzwitch in #230
- Parallelize membership probes and select join rows by chunk by @randyzwitch in #231
- Parallelize right joins and avoid unused row index by @randyzwitch in #233
- Index high-cardinality joins by original right rows by @randyzwitch in #234
- Pack join hash entries and specialize Int64 probes by @randyzwitch in #235
- Consolidate related tests into fewer CI modules by @randyzwitch in #243
- Index regular Int64 join domains by compact stride by @randyzwitch in #244
- Skip row-chain traversal for unique bounded join keys by @randyzwitch in #245
- Build large bounded join indexes across key ranges by @randyzwitch in #246
- Gather ordered repeated join rows within source chunks by @randyzwitch in #247
- Compare contiguous string join keys by bytes by @randyzwitch in #248
- Use interval membership for consecutive Int64 join keys by @randyzwitch in #249
- Map ordered strided Int64 join keys directly to rows by @randyzwitch in #250
- Use bounded strided index for smaller right joins by @randyzwitch in #251
- Map repeated ordered join keys directly to row runs by @randyzwitch in #252
- Use open addressing for high-cardinality join indexes by @randyzwitch in #253
- Fuse bounded membership with aligned chunk filtering by @randyzwitch in #254
- Avoid source validity checks in null-extended gathers by @randyzwitch in #259
- Skip redundant validity checks in string join probes by @randyzwitch in #260
- Share null-extension bits across gather columns by @randyzwitch in #261
- Mix string partition hashes once by @randyzwitch in #262
- Probe nonnullable two-key Int64 joins directly by @randyzwitch in #263
- Keep native DuckDB join benchmark in oracle suite by @randyzwitch in #264
- Parallelize full outer join row construction by @randyzwitch in #265
- Read Parquet through a minimal Arrow build behind a swappable backend by @randyzwitch in #275
- Benchmark key layouts and sizes that miss the fast paths by @randyzwitch in #281
- Probe the hash index for semi and anti joins; sweep two row cutoffs by @randyzwitch in #282
- Add list and struct column types with split, explode, unnest and Arrow I/O by @randyzwitch in #283
- CI: build libdfparquet on Linux and require the Parquet tests to run by @randyzwitch in #284
- Add implode, as_struct, and struct columns as group, unique and join keys by @randyzwitch in #285
- Fix and verify the Parquet reader build on Apple Silicon by @randyzwitch in #286
- Measure join cutoffs and bound direct-address tables by bytes by @randyzwitch in #288
- Use progression joins for matching temporal grids by @randyzwitch in #289
- Calibrate bucket sort limits across rank widths and machines by @randyzwitch in #290
- Add concise tuple schemas to read_csv by @randyzwitch in #293
- Stream Parquet row groups into chunked columns by @randyzwitch in #291
- Calibrate worker limits on Threadripper and Apple M1 by @randyzwitch in #292
- Parallelize Arrow import with measured serial fallbacks by @randyzwitch in #295
- Execute lazy plans as bounded ordered batch pipelines by @randyzwitch in #296
- Establish upstream join benchmarks and profile structural gaps by @randyzwitch in #297
- Reuse prepared join state across streaming batches by @randyzwitch in #298
- Choose the smaller join build input at measured cardinality cutoffs by @randyzwitch in #299
- Filter impossible join probes using exact integer key bounds by @randyzwitch in #300
- Count eligible inner joins without materializing matches by @randyzwitch in #301
- Borrow string-view byte blocks instead of retaining each read by @randyzwitch in #302
- Specialize scalar membership and string count probes by @randyzwitch in #303
- Use shared block hashing for long string keys by @randyzwitch in #305
- Use the shared Float64 power-of-ten table in strict parsing by @randyzwitch in #313
- Store the numeric DType inside DataType by @randyzwitch in #314
- Keep parsed DataTypes in expression nodes by @randyzwitch in #315
- Remove the GCD-stride mode from bounded Int64 join indexes by @randyzwitch in #316
- Drop equal-run repeat detection from progression joins by @randyzwitch in #317
- Replace inner-join count fusion with projection pushdown through joins by @randyzwitch in #318
- Aggregate worker row ranges with shared mergeable state by @randyzwitch in #319
- Validate join type once into an integer code by @randyzwitch in #320
- Keep selector kinds as integer codes by @randyzwitch in #321
- Benchmark against external suites with checked answers by @randyzwitch in #322
- Retire benchmarks the external suites supersede by @randyzwitch in #323
- Add arg_min, arg_max, mode, skew, kurtosis, corr and cov by @randyzwitch in #324
- Add describe, sample and value_counts (#220) by @randyzwitch in #325
- Merge streaming group-by states in batches, not per batch (#326) by @randyzwitch in #338
- Add decimal128 column type by @randyzwitch in #339
- Split streaming group-by state by key hash with a persistent key index (#326) by @randyzwitch in #340
- Return Float64 from decimal mean, as Polars does (#341) by @randyzwitch in #343
- Print decimal columns instead of aborting by @randyzwitch in #344
- Add interpolate, cut, and qcut expressions by @randyzwitch in #345
- Round decimal products, quotients and casts half to even (#342) by @randyzwitch in #346
- Keep decimal values through joins and integer casts by @randyzwitch in #347
- Turn on H2O q9 (corr) and a decimal PDS-H variant by @randyzwitch in #348
- Write an HTML benchmark report beside the Markdown one by @randyzwitch in #349
- Write comparisons and Boolean logic as packed bitmaps (#327) by @randyzwitch in #350
- Gather rows in bulk runs instead of one row at a time (#328) by @randyzwitch in #351
- Add time-zone-aware datetimes (#222) by @randyzwitch in #352
- Add binary columns (#120) by @randyzwitch in #353
- Rank numeric columns with one parallel sort per partition (#330) by @randyzwitch in #354
- Group by string keys without gathering or re-hashing them (#334) by @randyzwitch in #355
- Lazy joins on differently named keys (#329) by @randyzwitch in #356
- Write the PDS-H suite with the lazy API (#329) by @randyzwitch in #357
- Sort rows by packing their keys and row index into one integer (#331) by @randyzwitch in #358
- Select the first rows of a sort cut short by a slice (#332) by @randyzwitch in #359
- Scan ungrouped integer reductions and answer len() from the row count (#333) by @randyzwitch in #360
- Run test modules grouped into about ten programs by @randyzwitch in #361
- Count distinct values by hash partition (#336) by @randyzwitch in #362
- Fix the warnings CI reports by @randyzwitch in #363
- Capitalize a benchmark docstring summary by @randyzwitch in #364
- Select quantile positions instead of sorting, and finish groups in parallel (#337) by @randyzwitch in #365
- Concatenate join rows on every worker and stop copying them (#335) by @randyzwitch in #366
- Stream lazy group-bys over frames only when keys repeat; keep a group's first distinct number inline (#326) by @randyzwitch in #367
- Parse string casts straight into the target type, in parallel ranges (#149) by @randyzwitch in #369
- Add categorical columns: dictionary-encoded strings (#106) by @randyzwitch in #370
- Run categorical expressions once per dictionary value; count codes for n_unique (#106) by @randyzwitch in #371
- Allocate fully overwritten buffers without filling them first (#388) by @randyzwitch in #391
- Compare strings with literals and run string is_in over raw bytes on every worker (#373) by @randyzwitch in #392
- Filter fixed-width and Boolean columns straight from the mask's words (#376) by @randyzwitch in #393
- Gather string rows as views into the source's bytes (#375) by @randyzwitch in #394
- Fix the q18 and q1 slowdowns: share and deduplicate view buffers, build views directly, copy kept runs (#395) by @randyzwitch in #396
- Search strings with a SIMD byte filter, slice them as views, and add str.like (#374) by @randyzwitch in #397
- Stop dividing 128-bit integers on every decimal row (#385) by @randyzwitch in #398
- Run narrow-integer arithmetic in SIMD blocks and reduce computed columns directly (#384) by @randyzwitch in #399
- Number group keys through typed open-addressing tables instead of Dict (#380) by @randyzwitch in #400
- Read aggregation inputs through pointers and skip validity when there are no nulls (#382) by @randyzwitch in #401
- Let a single lazy join with a small left input build on it (#377) by @randyzwitch in #402
- Probe the Int64 hash join through pointers and move hashes into the index (#378) by @randyzwitch in #403
- Number over() partitions on every worker and write partitioned ids back in parallel (#387) by @randyzwitch in #404
- Run in-memory lazy group-bys eagerly when faster, and merge string keys in parallel (#381) by @randyzwitch in #405
- Write NaN as NaN in CSV so it reads back as a float (#368) by @randyzwitch in #406
- Make DATAFRAME_THREADS a limit on threads running jobs (#390) by @randyzwitch in #407
- Group several few-valued keys by worker ranges, not hash partitions by @randyzwitch in #408
- Build the deepest small-left join of a lazy chain on its small side (#377) by @randyzwitch in #409
- Read the decimal precision limit once per column, not per row by @randyzwitch in #410
- Run a lazy join eagerly when its left input comes from other joins and its right is large (#377) by @randyzwitch in #411
- Fill Boolean nulls and keep is_in's nulls on bitmaps, not per row by @randyzwitch in #412
- Index the decimal sum's pointers with unsafe_offset= by @randyzwitch in #413
- Write PDS-H's LIKE '%a%b%' filters with str.like by @randyzwitch in #414
- Add and multiply decimals without nulls through pointers, dividing by constant powers of ten by @randyzwitch in #415
- Keep every row without copying, and rank many small partitions with one sort by @randyzwitch in #416
- Number buckets of one numeric key by hash alone, without comparing rows by @randyzwitch in #417
- Stream large inputs through joins in larger batches by @randyzwitch in #418
- Keep a chunked series' first rechunk, and merge view chunks by block copy by @randyzwitch in #419
- Number small Int64 key domains through pointers by @randyzwitch in #420
- Hash the smaller side of semi and anti joins, deciding lazily from real sizes by @randyzwitch in #421
- Return all-valid comparisons without a validity bitmap by @randyzwitch in #422
- Compare string keys eight bytes at a time in hash buckets by @randyzwitch in #423
- Aggregate a moderate-cardinality Int64 key in place per worker range (#383) by @randyzwitch in #424
- Keep decimals at their declared width: Arrow decimal32 and decimal64, and Parquet's smallest decimals by @randyzwitch in #425
- Filter rank(ordinal).over(keys) <= k by keeping each partition's top k rows by @randyzwitch in #426
- Read grouped values at their source rows instead of gathering them per bucket by @randyzwitch in #427
- Order lazy inner-join chains by how much each input narrows its table by @randyzwitch in #428
- Evaluate AND filters one part at a time on the rows earlier parts kept by @randyzwitch in #429
- Keep Parquet dictionary codes beside string columns and group by them by @randyzwitch in #430
- Compare decimals unmasked and combine byte-aligned masks whole bytes at a time by @randyzwitch in #431
- Filter aligned chunks one job each for any row-local predicate by @randyzwitch in #433
- Fix repeated column references in fused chunk windows by @randyzwitch in #443
- Bound grouped top-k memory and replace quadratic insertion by @randyzwitch in #444
- Reuse measured join inputs when join order stays unchanged by @randyzwitch in #445
- Preserve holdout validation and improve benchmark provenance and coverage by @randyzwitch in #446
- Keep supported aggregates indexed and sort general keys by row prefixes by @randyzwitch in #447
- Reuse owned key codes and dense lookup for composite grouping by @randyzwitch in #448
- Batch bounded cardinality sample hashing across key columns by @randyzwitch in #449
- Reuse cardinality preference across group-by strategy selection by @randyzwitch in #450
- Assign string window ranks from packed partition ordering by @randyzwitch in #451
- Hash Int64 join probes directly without a row-sized hash buffer by @randyzwitch in #452
- Feed grouped native sums and means directly by source interval by @randyzwitch in #454
- Cache bitmap reads and separate nullable reduction loops by @randyzwitch in #456
- Cache composite string buffers for exact bucket comparisons by @randyzwitch in #457
- Avoid periodic-key aliasing in hash-aggregation sampling by @randyzwitch in #458
- Sum grouped numeric columns of every width at their own type by @randyzwitch in #459
- Probe hash joins on integer keys of every width without a hash buffer by @randyzwitch in #460
- Keep Parquet dictionary codes through filters, takes, sorts and joins by @randyzwitch in #461
- Let grouped top-k workers scan for their groups instead of routing rows by @randyzwitch in #462
- Skip the bucket gather when no aggregate needs gathered columns by @randyzwitch in #463
- Make PDS-H a development suite and hold out TPC-DS instead by @randyzwitch in #467
- Support decimals in conditionals without otherwise, fill_null and coalesce by @randyzwitch in #468
- Start lazy inner-join chains from the input that saves the most hashing by @randyzwitch in #469
- Translate 13 more TPC-DS queries for this library and Polars by @randyzwitch in #470
- Add an interactive Mermaid explorer for benchmark query plans by @randyzwitch in #471
- Split the Linux CI test step into smaller programs to fit its memory by @randyzwitch in #475
- Fix the mean and distinct count of decimal columns outside group-bys by @randyzwitch in #472
- Cast numeric columns in one typed loop when every value fits by @randyzwitch in #474
- Translate 7 more TPC-DS queries for this library and Polars by @randyzwitch in #473
- Translate 5 more TPC-DS queries for this library and Polars by @randyzwitch in #476
- Count distinct values by group through one set of (group, value) pairs by @randyzwitch in #477
- Add a cross join to LazyFrame by @randyzwitch in #479
- Encode chunked Int64 keys in place and compact column windows in bulk by @randyzwitch in #478
- Select grouped quantiles within one buffer laid out in group order by @randyzwitch in #480
- Translate 7 more TPC-DS queries for this library and Polars by @randyzwitch in #481
- Run the Linux CI tests as two driver programs, one at a time by @randyzwitch in #482
- Collect lazy execution reports in benchmark traces and list imbalanced joins by @randyzwitch in #483
- Report observed execution counters per plan node, and take every eager join direct by @randyzwitch in #484
- Collect a many-group streamed group-by and reduce it once, eagerly by @randyzwitch in #492
- Select conditional branches with SIMD and reduce masked branches in place by @randyzwitch in #493
- Probe hash join slots through a byte of tag per slot, sixteen at a time by @randyzwitch in #494
- Evaluate expressions over dictionary-coded String columns on their codes by @randyzwitch in #495
- Do not stream a frame scan whose only consumer runs eagerly by @randyzwitch in #496
- Drop the micro-benchmark and package smoke steps from pull request CI by @randyzwitch in #497
- Compare composite group keys through typed views; push key filters below group_by by @randyzwitch in #498
- Bound a streamed top-k by its k-th first key, like DuckDB's Top-N filter by @randyzwitch in #499
- Add geospatial storage and GeoJSON, GeoArrow, and GeoParquet interchange by @randyzwitch in #500
- Preserve Arrow field metadata and unknown extensions by @randyzwitch in #501
- Add WKB geometry type, CRS and bounding-box accessors by @randyzwitch in #502
- Pass join key sets sideways; single-pass integer is_in; small-left semi joins first by @randyzwitch in #503
- Complete GeoParquet interoperability with GeoPandas and DuckDB by @randyzwitch in #504
- Do not trade stacked filters over a join by @randyzwitch in #505
- Add eager and lazy as-of joins by @randyzwitch in #506
- Key sets from join-chain inputs, per key, through renames, and into a grouping left side by @randyzwitch in #508
- Answer filters on ascending columns by binary search by @randyzwitch in #509
- Add calendar-aware time windows and rolling std/var by @randyzwitch in #507
- Time each node in the execution report; skip restoring join order nobody reads by @randyzwitch in #510
- Read explicit categorical CSV fields directly into dictionary codes by @randyzwitch in #516
- Add native shapefile reader with typed DBF attributes by @randyzwitch in #515
- Whole-row unique as a parallel group_by; encode short string keys in registers by @randyzwitch in #511
- Balance streamed batches: four a worker, claimed as workers free up by @randyzwitch in #512
- Keep the busy and wall times from execution reports in results.json by @randyzwitch in #513
- Run each query's parallel work on one crew of threads by @randyzwitch in #514
- Build hash join indexes from hashes and keys in bucket order by @randyzwitch in #517
- Count distinct values per group by segments, not one bucket-wide set by @randyzwitch in #518
- Evaluate a filter's column-versus-constant comparisons in one pass by @randyzwitch in #519
- Move example builds off ordinary PRs and record CI costs by @randyzwitch in #520
- Reuse correctness binaries and skip benchmark work in answer checks by @randyzwitch in #521
- Copy only the columns read after a streamed filter by @randyzwitch in #523
- Decide a streamed group-by's collection from the rows held, not one batch by @randyzwitch in #530
- Execute a subplan used in two places once by @randyzwitch in #531
- Sum a column plus a constant from the column's own sum and extremes by @randyzwitch in #532
- Fuse comparisons on columns with nulls by @randyzwitch in #533
- Record the CPU frequency governor in benchmark provenance by @randyzwitch in #534
- Put hash tables and partition buffers on transparent huge pages by @randyzwitch in #536
- Share the filter selection across its jobs; direct-lookup codes for narrow integer keys by @randyzwitch in #537
- Design: thread-owned pipelines over morsels (executor redesign) by @randyzwitch in #539
- Stage 1 follow-ups: filter path selection, morsel size and alignment by @randyzwitch in #548
- Add provider-owned automatic execution dispatch by @randyzwitch in #551
- Fix logical-plan assertions for automatic engine diagnostics by @randyzwitch in #552
- Group rows in the pipeline's sink: per-worker tables or one late gather by @randyzwitch in #553
- Print the plan alone from explain(); the ENGINE line with engine="auto" by @randyzwitch in #554
- Run joins as probe steps of the thread-owned pipeline by @randyzwitch in #555
- Divide the eager group-by at the partition floor, not the scan floor by @randyzwitch in #556
- Keep the k best rows in the pipeline's sink by @randyzwitch in #557
- Load Parquet decimals at the smallest width their precision allows by @randyzwitch in #558
- Cast decimals to Float64 through the pointer under a mask too by @randyzwitch in #559
- Widen decimal32 operands to 64 bits before the decimal kernels by @randyzwitch in #560
- Share accelerator row planning and semantic capability checks by @randyzwitch in #561
- Fold a worker's top-k candidates by the sort keys alone by @randyzwitch in #562
- Encode chunked categorical keys by their codes in place by @randyzwitch in #563
- Add optional native Apple Metal accelerator runtime by @randyzwitch in #565
- Add LazyFrame.concat (UNION ALL) as a plan node by @randyzwitch in #567
- Fuse Metal projections and shrink intermediate storage by @randyzwitch in #566
- Measure Apple Metal DataFrame execution with retained M1 results by @randyzwitch in #568
- feat(metal): support all native integer widths by @randyzwitch in #569
- Keep a filter above a with_columns that holds a window by @randyzwitch in #572
- Running sums of decimal columns, exact at their scale by @randyzwitch in #574
- Add native Metal mixed numeric expressions and casts by @randyzwitch in #570
- feat(metal): preserve native types in extrema reductions by @randyzwitch in #571
- Translate 34 more TPC-DS queries (#564 phases 1 and 2) by @randyzwitch in #575
- Group build-side string keys by their codes in the pipeline by @randyzwitch in #580
- feat(metal): retain temporal and decimal column metadata by @randyzwitch in #573
- feat(metal): execute masked conditionals and integer operators by @randyzwitch in #576
- feat(metal): sort resident rows by multiple stable keys by @randyzwitch in #577
- feat(metal): aggregate resident rows by native typed keys by @randyzwitch in #578
- feat(metal): reduce rows with picks, logic, and arg extrema by @randyzwitch in #579
- Execute native Metal joins and joined lazy queries by @randyzwitch in #581
- Group String keys exactly in the pipeline's insert tables by @randyzwitch in #585
- Check join key progressions over raw values by @randyzwitch in #586
- Drop all-valid bitmaps when importing Arrow arrays by @randyzwitch in #587
- Keep right join keys for every join kind when coalesce=False by @randyzwitch in #588
- Update to Mojo 1.2.0.dev2026100905 by @randyzwitch in #591
- Join name lists losslessly so any column name round-trips by @randyzwitch in #589
- Extend Metal residency, typed algorithms, dictionaries, and analytical placement by @randyzwitch in #590
- Run cumulative windows in one pass and number partitions directly by @randyzwitch in #592
- Add forced-Metal correctness coverage for unchanged external queries by @randyzwitch in #599
- Preserve non-coalesced keys in accelerator joins by @randyzwitch in #593
- Extend Metal dictionary string operations and exact integer membership by @randyzwitch in #594
- Keep distinct rows, slices and UNION ALL resident on Metal by @randyzwitch in #595
- Preserve opaque Float64 payloads through Metal row plans and joins by @randyzwitch in #596
- Execute provably bounded Int64 and UInt64 sums on Metal by @randyzwitch in #597
- Compose Metal aggregates and add distinct counts and temporal fields by @randyzwitch in #598
- Rebuild test suite around maintained dataframe contracts by @randyzwitch in #624
- Fix macOS native Arrow consumer allocator isolation by @randyzwitch in #634
- Sink grouped pipelines into a radix-partitioned aggregate table by @randyzwitch in #641
- Compile fatal contract tests once and preserve isolated crash checks by @randyzwitch in #638
- Keep probe columns under a selection through pipeline joins by @randyzwitch in #648
- Keep decimal sums and means inline in the aggregate table by @randyzwitch in #650
- Share subplans read whole by several joins or aggregations by @randyzwitch in #653
- Extend Metal numeric execution, windows, and zero-column sources by @randyzwitch in #656
- Preserve full-domain Gregorian Date fields on CPU and Metal by @randyzwitch in #657
- Add Apple Metal duration totals across the full tick domain by @randyzwitch in #658
- Number window partitions with the aggregate table's hashing by @randyzwitch in #659
- Match multi-column join keys a column at a time by @randyzwitch in #667
- Add native median and quantiles; preserve UInt64 and decimal samples by @randyzwitch in #660
- Add native scalar-only selections with one-row results by @randyzwitch in #661
- Add checked fixed temporal offsets to Apple Metal by @randyzwitch in #662
- Create a query's worker threads on first parallel use by @randyzwitch in #663
- Upload chunked Apple Metal inputs without host rechunking by @randyzwitch in #664
- Add calendar month and year truncation to Apple Metal by @randyzwitch in #665
- Add signed calendar offsets to Apple Metal by @randyzwitch in #666
- Add Metal exp/log and correct CPU exceptional logarithms and exponentials by @randyzwitch in #668
- Add linear and nearest interpolation to resident Metal windows by @randyzwitch in #669
- Add Metal coordinate interpolation and fix CPU chunked coordinate windows by @randyzwitch in #670
- Read execution reports that lead with a calibration tag by @randyzwitch in #680
- Finish aggregate tables without copying keys or sorting groups by @randyzwitch in #671
- Add floating power on Metal and correct CPU IEEE power semantics by @randyzwitch in #672
- Parse a temporal interval once per column by @randyzwitch in #673
- Support decimal duration arithmetic on CPU and Metal by @randyzwitch in #675
- Support UTC duration rolling and wider calendar day periods on Metal by @randyzwitch in #677
- Evaluate window partitions contiguously, many at once by @randyzwitch in #679
- Keep a pipeline's selection through projections of bare columns by @randyzwitch in #683
- Clear every compiler warning in the library and its tests by @randyzwitch in #685
- Make Arrow string views the one in-memory layout for text by @randyzwitch in #686
- Migrate Metal execution into Mojo and retire native runtime by @randyzwitch in #684
- Keep plan schemas while optimizer passes read them by @randyzwitch in #687
- Run windows in one pass for decimals and share partition layouts by @randyzwitch in #692
- Run full joins through the direct hash route by @randyzwitch in #695
- Cast integers to decimals in one typed pass; multiply small decimals in 64 bits by @randyzwitch in #694
- Push filters through renames, union inputs and shared subplans by @randyzwitch in #688
- Filter the other input of an equi-join by a filter on its keys by @randyzwitch in #689
- Gather string views without per-row appends, prefetching ahead by @randyzwitch in #693
- Spread one-chunk pipeline sources over the workers by @randyzwitch in #696
- Extend Mojo GPU Lists, ordered execution and QCUT by @randyzwitch in #699
- Narrow pipeline morsels by each join build's key range by @randyzwitch in #690
- Clear the compiler warnings in the Mojo GPU modules by @randyzwitch in #703
- Give decimal arithmetic DuckDB's result types by @randyzwitch in #702
- Run a unique over every column as the pipeline's aggregate table by @randyzwitch in #691
- Let freed crew threads join a job list already running by @randyzwitch in #704
- Ask only moved filters' neighbours again; derive empty schemas from types by @randyzwitch in #697
- Join unique integer keys over a small span through slots (perfect hash) by @randyzwitch in #698
- Run a union's inputs at once by @randyzwitch in #705
- Remove an unused reference in the Mojo GPU source projection by @randyzwitch in #707
- Build on a small left inside the stream when its keys index directly by @randyzwitch in #700
- Run a join's computed inputs, and a stream's breaker inputs, at once by @randyzwitch in #708
- Filter aggregates built on by the probe side's keys (semi-join reduction) by @randyzwitch in #709
- Validate Metal on a local Apple silicon Mac and retire the CI job by @randyzwitch in #710
- Feed a filtered morsel to the aggregate table in place by @randyzwitch in #711
- Evaluate when(c).then(x) without an otherwise by validity, not choice by @randyzwitch in #712
- Send few-valued keys that form many groups to the aggregate table by @randyzwitch in #713
- Sort a string key whose values repeat by the values' ranks by @randyzwitch in #714
- Keep each group's top k rows in the aggregate table by @randyzwitch in #715
- Run the aggregate table's insert loops without a selection check when none is given by @randyzwitch in #716
- Reduce aggregates built on by several join keys to the probe side's key tuples by @randyzwitch in #717
- Pack SIMD comparison lanes into bits with one move-mask by @randyzwitch in #718
- Join a nested inner join chain's tables from the one supplying the keys by @randyzwitch in #719
- Reject absent integer probe keys with a bitmap of the build keys by @randyzwitch in #721
- Build on the smaller join side under distinct counts, judging their batches by key-value pairs by @randyzwitch in #720
- Revert join-tree flattening (#719) by @randyzwitch in #723
- Pack Boolean validity lists into bits eight lanes at a time by @randyzwitch in #724
- Spread the aggregate table's keep flags a mask byte at a time by @randyzwitch in #727
- Add Mojo GPU source List EXPLODE and align checked Decimal execution with CPU by @randyzwitch in #726
- Move file-format IO into a dataframe/io subpackage by @randyzwitch in #728
- Order join graphs by estimated cost, after DuckDB's join order optimizer by @randyzwitch in #725
- Fix UTF-8 temporal format literals and escaped percent by @randyzwitch in #730
- Join a crew posting before taking a budget slot, so retire waits for every slot by @randyzwitch in #729
- Match Apple GPU moment updates to CPU rounding and NaN payloads by @randyzwitch in #731
- Preserve checked integer producer errors before GPU consumers by @randyzwitch in #732
- Declare the GPU explode's output row count without an unused initial value by @randyzwitch in #734
- Build a stream's join on its left side when that side is the smaller by @randyzwitch in #733
- Match CPU order for serial grouped floating reductions on Apple Silicon by @randyzwitch in #735
- Preserve eager CUT/QCUT errors and widened integer SUM fusion by @randyzwitch in #737
- Pack multi-column row keys into one 64-bit key per numbering pass by @randyzwitch in #736
- Fix main: split the GPU capability requirement fused by the #735/#737 merge by @randyzwitch in #744
- Encode subset uniques and key counts one hash bucket at a time by @randyzwitch in #738
- Retire benchmark programs that predate the external suites by @randyzwitch in #743
- Fix merged backend capability policy constructor by @randyzwitch in #739
- Run IANA timezone row mutations with Mojo kernels on Apple Silicon by @randyzwitch in #741
- Tidy .gitignore and remove CHANGELOG.md by @randyzwitch in #750
- Narrow filter rows in place with selection trees, and read null tests from bitmaps by @randyzwitch in #745
- Move benchmark scripts into benchmarks/ and drop obsolete scripts by @randyzwitch in #746
- Remove retired dev notes and one-off benchmark results from docs by @randyzwitch in #748
- Build eager joins on the side of fewer rows times columns by @randyzwitch in #747
- Support direct grouped primitive Lists on Apple Silicon by @randyzwitch in #742
- Remove the unused legacy dfq_read_parquet entry point by @randyzwitch in #749
- Support IANA row producers before resident consumers on Apple Silicon by @randyzwitch in #751
- Preserve categorical code identity and dictionary owners on Apple GPU by @randyzwitch in #740
- Evaluate null-otherwise conditionals by validity when nothing can raise by @randyzwitch in #752
- Remove dead code found by two read-only scans by @randyzwitch in #753
- Keep primitive grouped Lists resident through downstream GPU consumers by @randyzwitch in #754
- Support partitioned cut and qcut on Apple GPU by @randyzwitch in #756
- Make TPC-DS a development suite; ClickBench stays held out by @randyzwitch in #757
- Derive Apple query coverage reports from verified receipts by @randyzwitch in #758
- Preserve typed grouped keys through resident GPU explode by @randyzwitch in #755
- Keep DuckDB's distinct-count statistics for loaded tables and order joins by them by @randyzwitch in #759
- Estimate joins the order cannot reorder instead of running them by @randyzwitch in #760
- Compose strict cast row producers with Apple GPU consumers by @randyzwitch in #761
- Cut the fixed cost of making, slicing and framing columns by @randyzwitch in #762
- Preserve eager checked Decimal SUM feed order on Apple GPU by @randyzwitch in #763
- Compose checked integer SUM with Apple GPU consumers by @randyzwitch in #764
- Diagnose complete Apple GPU query comparison differences by @randyzwitch in #765
- Maintain Apple GPU scalar floating SUM and MEAN contracts by @randyzwitch in #766
- Maintain Apple GPU grouped floating SUM and MEAN contracts by @randyzwitch in #767
- Admit checked scalar SUM with infallible Float64 mean siblings by @randyzwitch in #768
- Export complete typed benchmark answers for independent diagnostics by @randyzwitch in #769
- Force staged scalar aggregate materializations through Metal by @randyzwitch in #770
- Keep suite policy entries as markers in the test modules they describe by @randyzwitch in #784
- Exercise populated Apple query results against independent oracles by @randyzwitch in #771
- Fold casts of constants into typed literals while optimizing by @randyzwitch in #772
- Keep checked integer rank operands on the GPU through consumers by @randyzwitch in #773
- Restore a smaller-build join's left-major order on several workers by @randyzwitch in #774
- Observe checked Decimal GROUP operands before consumers by @randyzwitch in #775
- Compose scalar Float64 SUM over checked Decimal operands by @randyzwitch in #776
- Preserve coded String keys through checked Decimal GROUP by @randyzwitch in #777
- Observe checked Decimal operands before grouped Float64 SUM and MEAN by @randyzwitch in #778
- Observe bounded Decimal row producers containing Date YEAR by @randyzwitch in #779
- Prove same-scale Decimal selections before grouped consumers by @randyzwitch in #780
- Allow proven safe arithmetic after observed Decimal group sums by @randyzwitch in #781
- Size aggregate partitions by workers and finish one chunk per worker by @randyzwitch in #782
- Keep whether a key buffer is a progression with the buffer by @randyzwitch in #783
- Gather an unordered left build's rows with a gather that takes any order by @randyzwitch in #785
- Run every Metal contract on the Mac and fix the failures it finds by @randyzwitch in #786
- Build joins on progression-keyed relations instead of hashing the other side by @randyzwitch in #787
- Add lazy tail, reverse, shift and with_row_index by @randyzwitch in #788
- Add lazy group_by_dynamic and rolling by @randyzwitch in #812
- Count a join graph's computed relations at once by @randyzwitch in #814
- Put NaN first in descending sorts, as Polars and DuckDB do by @randyzwitch in #815
- Decide Metal data faults on the CPU instead of proving fault order per query shape by @randyzwitch in #819
- Add lazy unpivot, fill_null, drop_nulls, null_count, n_unique and duplicate flags by @randyzwitch in #813
- Leave sort ties unordered unless maintain_order=True by @randyzwitch in #817
- Run whole-input selections ahead of a join stream like other breakers by @randyzwitch in #818
- Run a stream's computed source through the morsel pipelines like a table by @randyzwitch in #821
- Add string functions that need no regex: titlecase, strip_prefix/suffix, find, split_exact and more by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/822
- Add lazy rename and cast, group_by on expressions, and group_by len and reductions by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/823
- Add lazy pivot with its output columns named up front by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/824
- Pass read_csv's options through scan_csv to every CSV read path by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/825
- Add lazy describe, clear, gather, top_k/bottom_k and diagonal and horizontal concat by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/826
- Sum, average and cum_sum Bool columns as Polars does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/827
- Give a union's inputs the same columns after projection pruning by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/834
- Add log(base), log10, log1p, sign, cbrt, truncate, trig, arctan2, product and cum_prod by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/828
- Probe progression and perfect-hash joins through pointers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/829
- Keep a null-otherwise branch's values whole in aggregate-table inputs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/830
- Add sum/min/max/mean/any/all_horizontal by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/831
- Move the horizontal ops off the math functions' op numbers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/848
- Keep repeated subplans whole so they are still shared by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/847
- Estimate filters between joins as join graph edges, as DuckDB does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/838
- Add replace and replace_strict for recoding values by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/832
- Copy validity a run at a time when compacting a selection by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/833
- Add a linear-time regex engine in the RE2 / Rust regex family (#219) by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/835
- Merge chunks of numeric columns on every worker by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/836
- Use the regex engine in the .str() namespace, as Polars does (#219) by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/841
- Bound a join's large side by the small side's extreme for inequality conditions by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/837
- Reduce aggregates by probe keys through renames and filtering joins by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/839
- Take a probe key's span from its zone maps instead of scanning it by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/842
- Compute repeated subexpressions of aggregations and projections once by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/840
- Restore lazy.mojo's import of _int_bounds (main does not compile) by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/852
- Group small integer keys by perfect hash, as DuckDB does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/843
- Leave a failing perfect hash aggregation to the batch-ordered routes by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/858
- Derive join and group_by schemas from their inputs instead of running them by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/845
- Measure complete CPU and Metal queries on Apple Silicon by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/849
- Render standalone Apple query coverage and performance reports by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/850
- Count a sampled filter's matches from its mask, on copied runs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/846
- Accelerate small dictionary-coded String sums on Metal by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/851
- Prune captured columns before Metal dictionary staging by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/853
- Reuse retained dictionary codes during Metal preparation by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/854
- Upload only source columns into Metal row matrices by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/855
- Sum bounded pairs of String dimensions directly on Metal by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/856
- Share immutable device storage for resident projections by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/857
- Prune source payload before dictionary lookup lowering by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/859
- Keep wide payload out of GPU row-selection matrices by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/860
- Bring the TPC-DS coverage in docs/benchmarks.md up to 89 of 99 by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/879
- Compute a dense selection's with_columns without compacting the morsel by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/863
- Skip top-k morsels by their key's zone maps, as DuckDB's dynamic filter does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/867
- Add bounded GPU equality hash partition construction by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/864
- Sum Int64 column statistics in Int128 lanes so they cannot wrap by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/880
- Skip the DFA passes for anchored capture searches, as RE2 does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/882
- Keep rows together and reject mismatched infinities in the answer check by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/884
- Use equality hash partitions for general Metal grouped reducers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/865
- Add separate Metal grouping development performance gates by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/866
- Establish an attributable Mojo Metal performance baseline by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/883
- Choose the in-memory lazy group-by's route by the routes' own tests (#608) by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/887
- Attribute Metal row execution and final export phases by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/885
- Finish aggregate table groups a vector of rows at a time, as DuckDB's scan does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/886
- Add native Metal storage, reusable resources and bounded fused sums by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/888
- Archive verified M1 development-suite Metal baseline by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/895
- Archive paired Metal reduction, grouping and join performance evidence by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/889
- Document Metal replacement coverage and retirement gates by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/890
- Prune repeated subplans to the union of their readers' needs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/891
- Find repeated subplans by hash and shallow comparison, as Polars does by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/892
- Keep node schemas across the optimizer passes and renumbering by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/893
- Reuse Metal device service across resident DAG queries by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/894
- Update mojo/max to newest nightly by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/906
- Update benchmark suite to Polars 2.0 by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/907
- Update to DuckDB 2.0 by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/910
- Use stable radix passes and tiled merges for Metal sorting by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/896
- Audit Metal answers with explicit numerical and selection policies by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/903
- Fix Metal detection crash under --target-accelerator=unknown by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/912
- Fix DuckDB benchmark reference workers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/911
- Remove redundant borrowed-value transfers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/909
- Preserve native typed columns through gathers and Float32 join inputs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/897
- Gather native join payloads through shared device row maps by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/898
- Select bounded top-k runs before gathering sorted payloads by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/900
- Add native single-key Mojo GPU hash joins by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/901
- Parallelize grouped integer reductions with bounded partial states by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/902
- Build large Metal concat dictionaries from observed GPU pairs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/904
- Delete one-off probe programs from tests/tooling by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/917
- Check native hash join memory at exact sizes instead of falling back by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/915
- Run benchmark-relevant kernel and suite checks from the Mac script by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/916
- Keep benchmark evidence out of the tree by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/918
- Remove ineffective ownership transfers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/919
- Split docs into user docs and design notes by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/921
- Keep only runnable programs under tests/ by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/920
- Remove unused assignment initializers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/922
- Restore the probe programs the Mac script runs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/927
- Run contract areas as parallel CI jobs by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/923
- Specify the accelerator contract and check the core/backend boundary by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/925
- Add an on-demand CPU benchmark checkpoint report by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/928
- Shrink the accelerator provider to what the core calls and move planner types into core by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/930
- Add an on-demand Apple CPU/Metal checkpoint report by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/929
- Add temporal constructors, reporting fields, and calendar helpers by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/932
- Move the Metal backend into its own dataframe_metal package by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/933
- Remove temporal row boxing and index business-calendar holidays by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/934
- Update to Mojo 1.2 by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/936
- Fix Metal contracts: radix sort ignored categorical ranks, selectors hit the coded sum, coded sums merged labels, dates wrapped by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/942
- Admit float reassociation in the exact CPU/Metal receipt and record the match kind by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/938
- Square floats by multiplication instead of calling the platform pow by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/940
- min, max, cum_min, cum_max and rolling extrema skip NaN, as in Polars by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/937
- Pin the CPU Date overflow boundary behind the Metal calendar contracts by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/941
- Group categorical keys by label: equal labels are equal keys on every route by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/944
- Add Unicode regex properties, capture structs, and regex selectors by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/945
- Release v0.3.0 by @randyzwitch in https://github.com/randyzwitch/dataframe_mojo/pull/946
Full Changelog: v0.2.0...v0.3.0