From 2c1d8febff920b5ef009a29344e42f069b97e044 Mon Sep 17 00:00:00 2001 From: Kishan B Date: Mon, 23 Apr 2018 17:16:57 +0530 Subject: [PATCH 1/7] Add travis config file --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f19e87e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: go +go: +- 1.10.x +install: +- go get github.com/stretchr/testify/assert +script: +- go test -v ./... \ No newline at end of file From 87d83fc71cb2e6b1352d5d26b133ab443ff10252 Mon Sep 17 00:00:00 2001 From: Kishan B Date: Mon, 23 Apr 2018 17:18:49 +0530 Subject: [PATCH 2/7] Put travis badge in read me --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3235be5..222b7b9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # csvdiff +[![Build Status](https://travis-ci.org/aswinkarthik93/csvdiff.svg?branch=master)](https://travis-ci.org/aswinkarthik93/csvdiff) + A Blazingly fast diff tool for database tables dumped as csv files. ## What is csvdiff? From ae123e51d6e8ae4b0d402759ce2fb83d26b6658c Mon Sep 17 00:00:00 2001 From: aswinkarthik93 Date: Mon, 23 Apr 2018 21:33:24 +0530 Subject: [PATCH 3/7] Add documentation --- cmd/config.go | 7 +++++++ pkg/digest/compare.go | 2 ++ pkg/digest/digest.go | 7 +++++++ pkg/digest/positions.go | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/cmd/config.go b/cmd/config.go index a30dc64..76c5ac3 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -14,6 +14,7 @@ func init() { config = Config{} } +// Config is to store all command line Flags. type Config struct { PrimaryKeyPositions []int ValueColumnPositions []int @@ -23,6 +24,7 @@ type Config struct { Modifications string } +// GetPrimaryKeys is to return the --primary-key flags as digest.Positions array. func (c *Config) GetPrimaryKeys() digest.Positions { if len(c.PrimaryKeyPositions) > 0 { return c.PrimaryKeyPositions @@ -30,6 +32,7 @@ func (c *Config) GetPrimaryKeys() digest.Positions { return []int{0} } +// GetValueColumns is to return the --value-columns flags as digest.Positions array. func (c *Config) GetValueColumns() digest.Positions { if len(c.ValueColumnPositions) > 0 { return c.ValueColumnPositions @@ -37,18 +40,22 @@ func (c *Config) GetValueColumns() digest.Positions { return []int{} } +// GetBaseReader returns an io.Reader for the base file. func (c *Config) GetBaseReader() io.Reader { return getReader(c.Base) } +// GetDeltaReader returns an io.Reader for the delta file. func (c *Config) GetDeltaReader() io.Reader { return getReader(c.Delta) } +// AdditionsWriter gives the output stream for the additions in delta csv. func (c *Config) AdditionsWriter() io.WriteCloser { return getWriter(c.Additions) } +// ModificationsWriter gives the output stream for the modifications in delta csv. func (c *Config) ModificationsWriter() io.WriteCloser { return getWriter(c.Modifications) } diff --git a/pkg/digest/compare.go b/pkg/digest/compare.go index 8c324b9..22f09ff 100644 --- a/pkg/digest/compare.go +++ b/pkg/digest/compare.go @@ -1,5 +1,7 @@ package digest +// Compare compares two Digest maps and returns the additions and modification +// keys as arrays. func Compare(baseDigest, newDigest map[uint64]uint64) (additions []uint64, modifications []uint64) { maxSize := len(newDigest) additions = make([]uint64, maxSize) diff --git a/pkg/digest/digest.go b/pkg/digest/digest.go index e293826..90a20d1 100644 --- a/pkg/digest/digest.go +++ b/pkg/digest/digest.go @@ -8,6 +8,7 @@ import ( "github.com/cespare/xxhash" ) +// Separator for CSV. Not configurable for now. const Separator = "," // Digest represents the binding of the key of each csv line @@ -29,6 +30,8 @@ func CreateDigest(csv []string, pKey Positions, pRow Positions) Digest { } +// Config represents configurations that can be passed +// to create a Digest. type Config struct { KeyPositions []int Key Positions @@ -38,6 +41,7 @@ type Config struct { SourceMap bool } +// NewConfig creates an instance of Config struct. func NewConfig(r io.Reader, createSourceMap bool, primaryKey Positions, valueColumns Positions) *Config { return &Config{ Reader: r, @@ -47,6 +51,9 @@ func NewConfig(r io.Reader, createSourceMap bool, primaryKey Positions, valueCol } } +// Create can create a Digest using the Configurations passed. +// It returns the digest as a map[uint64]uint64. +// It can also keep track of the Source line. func Create(config *Config) (map[uint64]uint64, map[uint64]string, error) { reader := csv.NewReader(config.Reader) diff --git a/pkg/digest/positions.go b/pkg/digest/positions.go index cbbb5ff..e69b2cf 100644 --- a/pkg/digest/positions.go +++ b/pkg/digest/positions.go @@ -2,8 +2,12 @@ package digest import "strings" +// Positions represents positions of columns in a CSV array. type Positions []int +// MapToValue plucks the values from CSV from +// their respective positions and concatenates +// them using Separator as a string. func (p Positions) MapToValue(csv []string) string { if p.Length() == 0 { return strings.Join(csv, Separator) @@ -15,10 +19,13 @@ func (p Positions) MapToValue(csv []string) string { return strings.Join(output, Separator) } +// Length returns the size of the Positions array. func (p Positions) Length() int { return len([]int(p)) } +// Items returns the elements of the Positions array +// as an array of int func (p Positions) Items() []int { return []int(p) } From e0feac4bfa0d8f74ffcaafef45321a345f996927 Mon Sep 17 00:00:00 2001 From: aswinkarthik93 Date: Mon, 23 Apr 2018 21:44:21 +0530 Subject: [PATCH 4/7] Fix documentation for Flag change --- examples/README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/README.md b/examples/README.md index e55fb57..5cf292a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -27,11 +27,14 @@ Dataset is used from this [blog](https://blog.majestic.com/development/majestic- - On run of csvdiff ```bash -% csvdiff run --base ./examples/base-small.csv --delta ./examples/delta-small.csv --key-positions 0 -2018/04/15 19:15:48 Generated Digest for base -2018/04/15 19:15:48 Generated Digest for delta -2018/04/15 19:15:48 Additions Count: 1 +% csvdiff run --base ./examples/base-small.csv --delta ./examples/delta-small.csv --primary-key 0 + +# Additions: 1 + 24564,907,completely-newsite.com,com,19827,32902,completely-newsite.com,com,1621,909,19787,32822 -2018/04/15 19:15:48 Modifications Count: 1 + +# Modifications: 1 + 69,1048,aol.com,com,97543,225532,aol.com,com,70,49,97328,224491 +2018/04/23 21:43:30 csvdiff took 1.361831ms ``` \ No newline at end of file From 7b132f5083478a0cc82841fa46707d10ee5064e1 Mon Sep 17 00:00:00 2001 From: aswinkarthik93 Date: Mon, 23 Apr 2018 21:44:53 +0530 Subject: [PATCH 5/7] Add benchmark test and results --- README.md | 4 ++ benchmark/README.md | 19 +++++++++ pkg/digest/digest_benchmark_test.go | 61 +++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 benchmark/README.md create mode 100644 pkg/digest/digest_benchmark_test.go diff --git a/README.md b/README.md index 222b7b9..30c8029 100644 --- a/README.md +++ b/README.md @@ -88,3 +88,7 @@ $ go test -v ./... ## Credits - Uses 64 bit [xxHash](https://cyan4973.github.io/xxHash/) algorithm, an extremely fast non-cryptographic hash algorithm, for creating the hash. Implementations from [cespare](https://github.com/cespare/xxhash) + +## [Benchmarks](/benchmark) + +- It can compare 10 Million CSV records in under 2 minutes. \ No newline at end of file diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000..0313777 --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,19 @@ +## Benchmark Results + +Benchmark test can be found [here](https://github.com/aswinkarthik93/csvdiff/blob/master/pkg/digest/digest_benchmark_test.go). + +```bash +$ cd ./pkg/digest +$ go test -bench=. -v -benchmem -benchtime=5s -cover +``` + +| | | | | | +| ---------------------------- | ---------- | ----------------------- | -------------------- | ------------------- | +| BenchmarkCreate1-8 | 2000000 | 5967 ns/op | 5474 B/op | 21 allocs/op | +| BenchmarkCreate10-8 | 500000 | 16251 ns/op | 10889 B/op | 94 allocs/op | +| BenchmarkCreate100-8 | 100000 | 114219 ns/op | 67139 B/op | 829 allocs/op | +| BenchmarkCreate1000-8 | 10000 | 1042723 ns/op | 674239 B/op | 8078 allocs/op | +| BenchmarkCreate10000-8 | 1000 | 10386850 ns/op | 6533806 B/op | 80306 allocs/op | +| BenchmarkCreate100000-8 | 100 | 108740944 ns/op | 64206718 B/op | 804208 allocs/op | +| BenchmarkCreate1000000-8 | 5 | 1161730558 ns/op | 672048142 B/op | 8039026 allocs/op | +| BenchmarkCreate10000000-8 | 1 | 12721982424 ns/op | 6549111872 B/op| 80308455 allocs/op | diff --git a/pkg/digest/digest_benchmark_test.go b/pkg/digest/digest_benchmark_test.go new file mode 100644 index 0000000..f70cc43 --- /dev/null +++ b/pkg/digest/digest_benchmark_test.go @@ -0,0 +1,61 @@ +package digest + +import ( + "fmt" + "io" + "testing" +) + +const SomeText = "something-name-%d,346345ty,fdhfdh,5436456,gfgjfgj,45234545,nfhgjfgj,45745745,djhgfjfgj" + +func BenchmarkCreate1(b *testing.B) { benchmarkCreate(1, b) } +func BenchmarkCreate10(b *testing.B) { benchmarkCreate(10, b) } +func BenchmarkCreate100(b *testing.B) { benchmarkCreate(100, b) } +func BenchmarkCreate1000(b *testing.B) { benchmarkCreate(1000, b) } +func BenchmarkCreate10000(b *testing.B) { benchmarkCreate(10000, b) } + +func BenchmarkCreate100000(b *testing.B) { benchmarkCreate(100000, b) } +func BenchmarkCreate1000000(b *testing.B) { benchmarkCreate(1000000, b) } +func BenchmarkCreate10000000(b *testing.B) { benchmarkCreate(10000000, b) } + +func benchmarkCreate(limit int, b *testing.B) { + for i := 0; i < b.N; i++ { + CreateDigestFor(limit, b) + } +} + +func CreateDigestFor(count int, b *testing.B) { + b.StopTimer() + reader := &Reader{limit: count} + + config := &Config{ + Reader: reader, + Key: []int{0}, + Value: []int{1}, + } + + b.StartTimer() + Create(config) +} + +type Csv struct { + counter int + limit int +} + +type Reader struct { + counter int + limit int +} + +func (r *Reader) Read(p []byte) (n int, err error) { + if r.counter == r.limit { + return 0, io.EOF + } + toRead := fmt.Sprintf("%d,%s\n", r.counter, SomeText) + r.counter++ + for i, b := range []byte(toRead) { + p[i] = b + } + return len(toRead), nil +} From 9ff349223e926c3f9a52985d3707022ca7472308 Mon Sep 17 00:00:00 2001 From: aswinkarthik93 Date: Mon, 23 Apr 2018 21:50:11 +0530 Subject: [PATCH 6/7] Add demo --- README.md | 4 ++++ demo/csvdiff.gif | Bin 0 -> 42272 bytes 2 files changed, 4 insertions(+) create mode 100644 demo/csvdiff.gif diff --git a/README.md b/README.md index 30c8029..f26328c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ A Blazingly fast diff tool for database tables dumped as csv files. Csvdiff is a difftool to compute changes between two csv files. It is not a traditional diff tool. It is most suitable for comparing csv files dumped from database tables. +## Demo + +![demo](/demo/csvdiff.gif) + ## Usage ```bash diff --git a/demo/csvdiff.gif b/demo/csvdiff.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ebe4d039baec32f193bcd55f3973e811b181cd7 GIT binary patch literal 42272 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 literal 0 HcmV?d00001 From e5bcdd2832c4d7060fb5b276c408941005221606 Mon Sep 17 00:00:00 2001 From: Kishan B Date: Tue, 24 Apr 2018 14:53:56 +0530 Subject: [PATCH 7/7] Integrate glide for reproducible installations --- .gitignore | 2 ++ .travis.yml | 3 ++- glide.lock | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ glide.yaml | 16 ++++++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 glide.lock create mode 100644 glide.yaml diff --git a/.gitignore b/.gitignore index c3526e2..f0d247e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ out/ # End of https://www.gitignore.io/api/go + +vendor/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index f19e87e..6ac0a3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: go go: - 1.10.x install: -- go get github.com/stretchr/testify/assert +- curl https://glide.sh/get | sh +- glide install script: - go test -v ./... \ No newline at end of file diff --git a/glide.lock b/glide.lock new file mode 100644 index 0000000..50b8ccf --- /dev/null +++ b/glide.lock @@ -0,0 +1,75 @@ +hash: a42b65bfb8f09e42a12971ff7d5c5b0106a86382a5dd90fc3e5b29d58c913f03 +updated: 2018-04-24T14:50:45.370899074+05:30 +imports: +- name: github.com/briandowns/spinner + version: 48dbb65d7bd5c74ab50d53d04c949f20e3d14944 +- name: github.com/cespare/xxhash + version: 5c37fe3735342a2e0d01c87a907579987c8936cc +- name: github.com/fatih/color + version: 507f6050b8568533fb3f5504de8e5205fa62a114 +- name: github.com/fsnotify/fsnotify + version: c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9 +- name: github.com/hashicorp/hcl + version: ef8a98b0bbce4a65b5aa4c368430a80ddc533168 + subpackages: + - hcl/ast + - hcl/parser + - hcl/printer + - hcl/scanner + - hcl/strconv + - hcl/token + - json/parser + - json/scanner + - json/token +- name: github.com/inconshreveable/mousetrap + version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 +- name: github.com/magiconair/properties + version: 2c9e9502788518c97fe44e8955cd069417ee89df +- name: github.com/mattn/go-colorable + version: 7dc3415be66d7cc68bf0182f35c8d31f8d2ad8a7 +- name: github.com/mattn/go-isatty + version: 6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c +- name: github.com/mitchellh/go-homedir + version: b8bc1bf767474819792c23f32d8286a45736f1c6 +- name: github.com/mitchellh/mapstructure + version: 00c29f56e2386353d58c599509e8dc3801b0d716 +- name: github.com/pelletier/go-toml + version: 66540cf1fcd2c3aee6f6787dfa32a6ae9a870f12 +- name: github.com/spf13/afero + version: 63644898a8da0bc22138abf860edaf5277b6102e + subpackages: + - mem +- name: github.com/spf13/cast + version: 8965335b8c7107321228e3e3702cab9832751bac +- name: github.com/spf13/cobra + version: a1f051bc3eba734da4772d60e2d677f47cf93ef4 +- name: github.com/spf13/jwalterweatherman + version: 7c0cea34c8ece3fbeb2b27ab9b59511d360fb394 +- name: github.com/spf13/pflag + version: 583c0c0531f06d5278b7d917446061adc344b5cd +- name: github.com/spf13/viper + version: b5e8006cbee93ec955a89ab31e0e3ce3204f3736 +- name: golang.org/x/sys + version: f6cff0780e542efa0c8e864dc8fa522808f6a598 + subpackages: + - unix +- name: golang.org/x/text + version: 7922cc490dd5a7dbaa7fd5d6196b49db59ac042f + subpackages: + - transform + - unicode/norm +- name: gopkg.in/yaml.v2 + version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 +testImports: +- name: github.com/davecgh/go-spew + version: 8991bc29aa16c548c550c7ff78260e27b9ab7c73 + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: 792786c7400a136282c1664665ae0a8db921c6c2 + subpackages: + - difflib +- name: github.com/stretchr/testify + version: 12b6f73e6084dad08a7c6e575284b177ecafbc71 + subpackages: + - assert diff --git a/glide.yaml b/glide.yaml new file mode 100644 index 0000000..51ed9d1 --- /dev/null +++ b/glide.yaml @@ -0,0 +1,16 @@ +package: github.com/aswinkarthik93/csvdiff +import: +- package: github.com/briandowns/spinner + version: ^1.0.0 +- package: github.com/cespare/xxhash + version: ^1.0.0 +- package: github.com/mitchellh/go-homedir +- package: github.com/spf13/cobra + version: ^0.0.2 +- package: github.com/spf13/viper + version: ^1.0.2 +testImport: +- package: github.com/stretchr/testify + version: ^1.2.1 + subpackages: + - assert