[READ-ONLY] Mirror of https://github.com/probablykasper/csv-pipeline.
0

Configure Feed

Select the types of activity you want to include in your feed.

Remember row order in transform_into

Kasper (Jan 17, 2023, 9:13 PM +0100) 14b57fc3 19802018

+15 -10
+1
CHANGELOG.md
··· 3 3 ## Next 4 4 - Add Pipeline select method 5 5 - Add Pipeline `from_pipelines` constructor for merging pipelines together 6 + - Remember row order in transform_into 6 7 7 8 ## 0.2.0 - 2023 Jan 11 8 9 - Add `Target` struct helper for creating targets, and hide the targets in the `target` module.
+7
Cargo.lock
··· 41 41 version = "0.2.0" 42 42 dependencies = [ 43 43 "csv", 44 + "linked-hash-map", 44 45 ] 45 46 46 47 [[package]] ··· 54 55 version = "1.4.0" 55 56 source = "registry+https://github.com/rust-lang/crates.io-index" 56 57 checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 58 + 59 + [[package]] 60 + name = "linked-hash-map" 61 + version = "0.5.6" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 57 64 58 65 [[package]] 59 66 name = "memchr"
+1 -3
Cargo.toml
··· 14 14 15 15 [dependencies] 16 16 csv = "1.1" 17 - 18 - [profile.dev] 19 - opt-level = 1 17 + linked-hash-map = "0.5"
+2 -2
src/pipeline.rs
··· 6 6 use crate::transform::Transform; 7 7 use crate::{Error, Row, RowResult}; 8 8 use csv::{Reader, ReaderBuilder, StringRecordsIntoIter}; 9 + use linked_hash_map::LinkedHashMap; 9 10 use std::borrow::BorrowMut; 10 - use std::collections::BTreeMap; 11 11 use std::io; 12 12 use std::path::Path; 13 13 ··· 284 284 headers: Headers::from_row(Row::from(names)).unwrap(), 285 285 iterator: Box::new(TransformInto { 286 286 iterator: self.iterator, 287 - groups: BTreeMap::new(), 287 + groups: LinkedHashMap::new(), 288 288 hashers: get_transformers(), 289 289 get_transformers, 290 290 headers: self.headers.clone(),
+4 -5
src/pipeline_iterators.rs
··· 2 2 use crate::target::Target; 3 3 use crate::transform::{compute_hash, Transform}; 4 4 use crate::{Error, Pipeline, PipelineIter, Row, RowResult}; 5 - use std::collections::btree_map::Entry; 6 - use std::collections::BTreeMap; 5 + use linked_hash_map::{Entry, LinkedHashMap}; 7 6 8 7 pub struct PipelinesChain<'a, P> { 9 8 pub pipelines: P, ··· 167 166 F: FnMut() -> Vec<Box<dyn Transform>>, 168 167 { 169 168 pub iterator: I, 170 - pub groups: BTreeMap<u64, Vec<Box<dyn Transform>>>, 169 + pub groups: LinkedHashMap<u64, Vec<Box<dyn Transform>>>, 171 170 pub hashers: Vec<Box<dyn Transform>>, 172 171 pub get_transformers: F, 173 172 pub headers: Headers, ··· 182 181 fn next(&mut self) -> Option<Self::Item> { 183 182 // If any error rows are found, they are returned first 184 183 while let Some(row_result) = self.iterator.next() { 185 - // First run iterator into BTreeMap 184 + // First run iterator into LinkedHashMap 186 185 let row = match row_result { 187 186 Ok(row) => row, 188 187 Err(e) => return Some(Err(e)), ··· 208 207 } 209 208 } 210 209 } 211 - // Finally, return rows from the BTreeMap 210 + // Finally, return rows from the LinkedHashMap 212 211 if let Some(key) = self.groups.keys().next().copied() { 213 212 let reducers = self.groups.remove(&key).unwrap(); 214 213 let fields: Vec<_> = reducers.iter().map(|reducer| reducer.value()).collect();