Skip to content

Commit

Permalink
avoid using pointers for SumEntry
Browse files Browse the repository at this point in the history
  • Loading branch information
seiflotfy committed Aug 13, 2018
1 parent aee91d9 commit bb6c57c
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 19 deletions.
2 changes: 1 addition & 1 deletion stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func (stream *Stream) pushBuffer(buf *buffer) error {
}

// PushSummary pushes full summary while maintaining approximation error invariants.
func (stream *Stream) PushSummary(summary []*SumEntry) error {
func (stream *Stream) PushSummary(summary []SumEntry) error {
// Validate state.
if stream.finalized {
return fmt.Errorf("Finalize() already called")
Expand Down
2 changes: 1 addition & 1 deletion stream_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ func testDistributedStreams(t *testing.T, numWorkers int32, eps float64, maxElem

// Simulate streams on each worker running independently
totalWeight := 0.0
workerSummaries := [][]*SumEntry{}
workerSummaries := [][]SumEntry{}
for i := int32(0); i < numWorkers; i++ {
stream, err := New(eps/2, maxElements)
if err != nil {
Expand Down
38 changes: 24 additions & 14 deletions summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,34 @@ func (se SumEntry) nextMinRank() float64 {

// Summary ...
type Summary struct {
entries []*SumEntry
entries []SumEntry
}

// newSummary ...
func newSummary() *Summary {
return &Summary{
entries: make([]*SumEntry, 0),
entries: make([]SumEntry, 0),
}
}

func (sum *Summary) clone() *Summary {
newSum := &Summary{
entries: make([]SumEntry, len(sum.entries)),
}
for i, entry := range sum.entries {
newSum.entries[i] = entry
}
return newSum
}

// buildFromBufferEntries ...
func (sum *Summary) buildFromBufferEntries(bes []bufEntry) {
sum.entries = []*SumEntry{}
sum.entries = []SumEntry{}
// TODO: entries_.reserve(buffer_entries.size());
cumWeight := 0.0
for _, entry := range bes {
curWeight := entry.weight
se := &SumEntry{
se := SumEntry{
Value: entry.value,
Weight: entry.weight,
MinRank: cumWeight,
Expand All @@ -47,8 +57,8 @@ func (sum *Summary) buildFromBufferEntries(bes []bufEntry) {
}

// BuildFromSummaryEntries ...
func (sum *Summary) BuildFromSummaryEntries(ses []*SumEntry) {
sum.entries = make([]*SumEntry, len(ses))
func (sum *Summary) BuildFromSummaryEntries(ses []SumEntry) {
sum.entries = make([]SumEntry, len(ses))
for i, entry := range ses {
sum.entries[i] = entry
}
Expand All @@ -65,11 +75,11 @@ func (sum *Summary) Merge(other *Summary) {
return
}

baseEntries := make([]*SumEntry, len(sum.entries))
baseEntries := make([]SumEntry, len(sum.entries))
for i, e := range sum.entries {
baseEntries[i] = e
}
sum.entries = []*SumEntry{}
sum.entries = []SumEntry{}

// Merge entries maintaining ranks. The idea is to stack values
// in order which we can do in linear time as the two summaries are
Expand All @@ -89,23 +99,23 @@ func (sum *Summary) Merge(other *Summary) {
it1 := baseEntries[i]
it2 := otherEntries[j]
if it1.Value < it2.Value {
sum.entries = append(sum.entries, &SumEntry{
sum.entries = append(sum.entries, SumEntry{
Value: it1.Value, Weight: it1.Weight,
MinRank: it1.MinRank + nextMinRank2,
MaxRank: it1.MaxRank + it2.prevMaxRank(),
})
nextMinRank1 = it1.nextMinRank()
i++
} else if it1.Value > it2.Value {
sum.entries = append(sum.entries, &SumEntry{
sum.entries = append(sum.entries, SumEntry{
Value: it2.Value, Weight: it2.Weight,
MinRank: it2.MinRank + nextMinRank1,
MaxRank: it2.MaxRank + it1.prevMaxRank(),
})
nextMinRank2 = it2.nextMinRank()
j++
} else {
sum.entries = append(sum.entries, &SumEntry{
sum.entries = append(sum.entries, SumEntry{
Value: it1.Value, Weight: it1.Weight + it2.Weight,
MinRank: it1.MinRank + it2.MinRank,
MaxRank: it1.MaxRank + it2.MaxRank,
Expand All @@ -120,7 +130,7 @@ func (sum *Summary) Merge(other *Summary) {
// Fill in any residual.
for i != len(baseEntries) {
it1 := baseEntries[i]
sum.entries = append(sum.entries, &SumEntry{
sum.entries = append(sum.entries, SumEntry{
Value: it1.Value, Weight: it1.Weight,
MinRank: it1.MinRank + nextMinRank2,
MaxRank: it1.MaxRank + otherEntries[len(otherEntries)-1].MaxRank,
Expand All @@ -129,7 +139,7 @@ func (sum *Summary) Merge(other *Summary) {
}
for j != len(otherEntries) {
it2 := otherEntries[j]
sum.entries = append(sum.entries, &SumEntry{
sum.entries = append(sum.entries, SumEntry{
Value: it2.Value, Weight: it2.Weight,
MinRank: it2.MinRank + nextMinRank1,
MaxRank: it2.MaxRank + baseEntries[len(baseEntries)-1].MaxRank,
Expand Down Expand Up @@ -293,5 +303,5 @@ func (sum *Summary) Size() int64 {

// Clear ...
func (sum *Summary) Clear() {
sum.entries = []*SumEntry{}
sum.entries = []SumEntry{}
}
6 changes: 3 additions & 3 deletions summary_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type SummaryDummy struct {

func NewWeightedQuantilesSummaryDummy() (*SummaryDummy, error) {
sum := &Summary{
entries: make([]*SumEntry, 0),
entries: make([]SumEntry, 0),
}
wqsd := &SummaryDummy{
Summary: sum,
Expand Down Expand Up @@ -108,7 +108,7 @@ func TestSummaryBuildFromBuffer(t *testing.T) {
exp := SumEntry{
Value: -13, Weight: 4, MinRank: 0, MaxRank: 4,
}
if val := entries[0]; *val != exp {
if val := entries[0]; val != exp {
t.Errorf("expected %v, got %v", exp, val)
}

Expand All @@ -122,7 +122,7 @@ func TestSummaryBuildFromBuffer(t *testing.T) {
exp = SumEntry{
Value: 21, Weight: 8, MinRank: 37, MaxRank: 45,
}
if val := entries[len(entries)-1]; *val != exp {
if val := entries[len(entries)-1]; val != exp {
t.Errorf("expected %v, got %v", exp, val)
}

Expand Down

0 comments on commit bb6c57c

Please sign in to comment.