Skip to content

Commit d124238

Browse files
committed
Added memory database
1 parent 943e3ca commit d124238

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

riemann/database.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package riemann
2+
3+
type RiemannDivisorSum struct {
4+
N int
5+
DivisorSum int
6+
WitnessValue float64
7+
}
8+
9+
type SummaryStats struct {
10+
LargestComputedN RiemannDivisorSum
11+
LargestWitnessValue RiemannDivisorSum
12+
}
13+
14+
type DivisorDb interface {
15+
Load() []RiemannDivisorSum
16+
Upsert([]RiemannDivisorSum)
17+
Summarize() SummaryStats
18+
}

riemann/in_memory_database.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package riemann
2+
3+
type InMemoryDivisorDb struct {
4+
Data map[int]RiemannDivisorSum
5+
}
6+
7+
func (imdb InMemoryDivisorDb) Load() []RiemannDivisorSum {
8+
output := []RiemannDivisorSum{}
9+
for _, value := range imdb.Data {
10+
output = append(output, value)
11+
}
12+
return output
13+
}
14+
15+
func (imdb InMemoryDivisorDb) Upsert(rds []RiemannDivisorSum) {
16+
for _, value := range rds {
17+
imdb.Data[value.N] = value
18+
}
19+
}
20+
21+
func (imdb InMemoryDivisorDb) Summarize() SummaryStats {
22+
if len(imdb.Data) == 0 {
23+
return SummaryStats{
24+
LargestWitnessValue: RiemannDivisorSum{},
25+
LargestComputedN: RiemannDivisorSum{},
26+
}
27+
}
28+
largest_computed_n := RiemannDivisorSum{N: -1}
29+
largest_witness_value := RiemannDivisorSum{WitnessValue: -1}
30+
31+
for _, rds := range imdb.Data {
32+
if rds.N > largest_computed_n.N {
33+
largest_computed_n = rds
34+
}
35+
if int(rds.WitnessValue) > int(largest_witness_value.WitnessValue) {
36+
largest_witness_value = rds
37+
}
38+
}
39+
return SummaryStats{
40+
LargestWitnessValue: largest_witness_value,
41+
LargestComputedN: largest_computed_n,
42+
}
43+
44+
}

riemann/in_memory_database_test.go

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package riemann_test
2+
3+
import (
4+
"sort"
5+
6+
"github.com/alexsanjoseph/riemann-divisor-sum-go/riemann"
7+
. "github.com/onsi/ginkgo"
8+
. "github.com/onsi/gomega"
9+
)
10+
11+
var _ = Describe("In Memory Database Tests", func() {
12+
13+
It("is initially empty", func() {
14+
var db = riemann.DivisorDb(riemann.InMemoryDivisorDb{Data: make(map[int]riemann.RiemannDivisorSum)})
15+
loadedData := db.Load()
16+
Expect(len(loadedData)).To(Equal(0))
17+
})
18+
19+
It("Upserts correctly", func() {
20+
var db = riemann.DivisorDb(riemann.InMemoryDivisorDb{Data: make(map[int]riemann.RiemannDivisorSum)})
21+
records := []riemann.RiemannDivisorSum{
22+
{N: 1, DivisorSum: 1, WitnessValue: 1},
23+
{N: 2, DivisorSum: 2, WitnessValue: 2},
24+
}
25+
By("upserting fine from empty", func() {
26+
db.Upsert(records)
27+
loadedData := db.Load()
28+
sort.Slice(loadedData, func(p, q int) bool {
29+
return loadedData[p].N < loadedData[q].N
30+
})
31+
Expect(loadedData).To(Equal(records))
32+
})
33+
34+
By("upserting fine from non-empty", func() {
35+
newRecords := []riemann.RiemannDivisorSum{
36+
{N: 3, DivisorSum: 3, WitnessValue: 3},
37+
{N: 4, DivisorSum: 4, WitnessValue: 4},
38+
}
39+
db.Upsert(newRecords)
40+
loadedData := db.Load()
41+
sort.Slice(loadedData, func(p, q int) bool {
42+
return loadedData[p].N < loadedData[q].N
43+
})
44+
Expect(loadedData).To(Equal(append(records, newRecords...)))
45+
})
46+
47+
By("overriding existing docs when upserted", func() {
48+
newRecords := []riemann.RiemannDivisorSum{
49+
{N: 3, DivisorSum: 3, WitnessValue: 10},
50+
{N: 5, DivisorSum: 5, WitnessValue: 5},
51+
}
52+
expectedNewRecords := []riemann.RiemannDivisorSum{
53+
{N: 3, DivisorSum: 3, WitnessValue: 10},
54+
{N: 4, DivisorSum: 4, WitnessValue: 4},
55+
{N: 5, DivisorSum: 5, WitnessValue: 5},
56+
}
57+
db.Upsert(newRecords)
58+
loadedData := db.Load()
59+
sort.Slice(loadedData, func(p, q int) bool {
60+
return loadedData[p].N < loadedData[q].N
61+
})
62+
Expect(loadedData).To(Equal(append(records, expectedNewRecords...)))
63+
})
64+
65+
})
66+
67+
It("Summarizes", func() {
68+
var db = riemann.DivisorDb(riemann.InMemoryDivisorDb{Data: make(map[int]riemann.RiemannDivisorSum)})
69+
By("correctly summarizing empty data", func() {
70+
summaryData := db.Summarize()
71+
expectedSummaryData := riemann.SummaryStats{
72+
LargestWitnessValue: riemann.RiemannDivisorSum{},
73+
LargestComputedN: riemann.RiemannDivisorSum{},
74+
}
75+
Expect(summaryData).To(Equal(expectedSummaryData))
76+
})
77+
78+
By("correctly summarizing non-empty data", func() {
79+
records := []riemann.RiemannDivisorSum{
80+
{N: 1, DivisorSum: 1, WitnessValue: 10},
81+
{N: 2, DivisorSum: 2, WitnessValue: 20},
82+
{N: 3, DivisorSum: 2, WitnessValue: 3},
83+
}
84+
db.Upsert(records)
85+
summaryData := db.Summarize()
86+
expectedSummaryData := riemann.SummaryStats{
87+
LargestWitnessValue: riemann.RiemannDivisorSum{N: 2, DivisorSum: 2, WitnessValue: 20},
88+
LargestComputedN: riemann.RiemannDivisorSum{N: 3, DivisorSum: 2, WitnessValue: 3},
89+
}
90+
Expect(summaryData).To(Equal(expectedSummaryData))
91+
})
92+
})
93+
94+
})

0 commit comments

Comments
 (0)