11package pruner
22
33import (
4+ "bufio"
45 "fmt"
56 "log"
6- quamina "quamina/lib "
7+ "os "
78 "testing"
89 "time"
10+
11+ quamina "quamina/lib"
912)
1013
1114var verbose = false
@@ -50,15 +53,11 @@ func TestBasic(t *testing.T) {
5053
5154 m .printStats ()
5255
53- if have , err := m .DeletePattern (id ); err != nil {
56+ if err := m .DeletePattern (id ); err != nil {
5457 t .Fatal (err )
55- } else if ! have {
56- t .Fatal (have )
5758 }
58- if have , err := m .DeletePattern (id ); err != nil {
59+ if err := m .DeletePattern (id ); err != nil {
5960 t .Fatal (err )
60- } else if have {
61- t .Fatal (have )
6261 }
6362
6463 m .printStats ()
@@ -92,8 +91,8 @@ func TestBasic(t *testing.T) {
9291
9392func TestRebuildSome (t * testing.T ) {
9493 var (
94+ n = int (2 * defaultRebuildTrigger .MinAction )
9595 m = NewMatcher (nil )
96- n = int (defaultRebuildTrigger .MinAction + 100 )
9796 )
9897
9998 populate := func () {
@@ -107,10 +106,8 @@ func TestRebuildSome(t *testing.T) {
107106
108107 depopulate := func () {
109108 for i := 0 ; i < n ; i += 2 {
110- if had , err := m .DeletePattern (i ); err != nil {
109+ if err := m .DeletePattern (i ); err != nil {
111110 t .Fatal (err )
112- } else if ! had {
113- t .Fatal (i )
114111 }
115112 }
116113 // Maybe check a lot more often.
@@ -153,6 +150,7 @@ func TestRebuildSome(t *testing.T) {
153150 m .printStats ()
154151 depopulate ()
155152 query (false )
153+ m .printStats ()
156154 if s := m .Stats (); 0 == s .RebuildDuration {
157155 t .Fatal (s )
158156 }
@@ -195,7 +193,7 @@ func TestTriggerTooManyFilteredDenom(t *testing.T) {
195193 if err := m .AddPattern (1 , `{"likes":["tacos"]}` ); err != nil {
196194 t .Fatal (err )
197195 }
198- if _ , err := m .DeletePattern (1 ); err != nil {
196+ if err := m .DeletePattern (1 ); err != nil {
199197 t .Fatal (err )
200198 }
201199 _ , err := m .MatchesForJSONEvent ([]byte (`{"likes":"tacos"}` ))
@@ -217,12 +215,12 @@ func TestTriggerRebuild(t *testing.T) {
217215 doomed = func (id int ) bool {
218216 return id % 2 == 0
219217 }
220- printState = func () {
221- logf ("state:" )
222- for id , p := range m .live .(* MemState ).m {
223- logf (" %v -> %s" , id , p )
224- }
225- }
218+ // printState = func() {
219+ // logf("state:")
220+ // for id, p := range m.live.(*MemState).m {
221+ // logf(" %v -> %s", id, p)
222+ // }
223+ // }
226224 )
227225
228226 trigger .MinAction = 5
@@ -235,13 +233,13 @@ func TestTriggerRebuild(t *testing.T) {
235233 }
236234
237235 if doomed (i ) {
238- if _ , err := m .DeletePattern (i ); err != nil {
236+ if err := m .DeletePattern (i ); err != nil {
239237 t .Fatal (err )
240238 }
241239 }
242240 }
243241
244- printState ()
242+ // printState()
245243 m .printStats ()
246244
247245 for i := 0 ; i < n ; i ++ {
@@ -261,7 +259,7 @@ func TestTriggerRebuild(t *testing.T) {
261259 }
262260 }
263261
264- printState ()
262+ // printState()
265263 m .printStats ()
266264
267265 s := m .Stats ()
@@ -314,7 +312,7 @@ func TestBadState(t *testing.T) {
314312 if err := m .AddPattern (1 , `{"likes":["queso"]}` ); err == nil {
315313 t .Fatal ("expected error" )
316314 }
317- if _ , err := m .DeletePattern (1 ); err == nil {
315+ if err := m .DeletePattern (1 ); err == nil {
318316 t .Fatal ("expected error" )
319317 }
320318 if err := m .Rebuild (false ); err == nil {
@@ -433,9 +431,7 @@ func TestMultiplePatternsWithSameId(t *testing.T) {
433431 t .Fatal (s .Live )
434432 }
435433
436- if had , err := m .DeletePattern (id ); err != nil {
437- t .Fatal (err )
438- } else if ! had {
434+ if err := m .DeletePattern (id ); err != nil {
439435 t .Fatal (err )
440436 }
441437
@@ -450,3 +446,91 @@ func TestMultiplePatternsWithSameId(t *testing.T) {
450446 }
451447
452448}
449+
450+ func BenchmarkCityLotsCore (b * testing.B ) {
451+ benchmarkCityLots (b , quamina .NewCoreMatcher ())
452+ }
453+
454+ func BenchmarkCityLotsPruner (b * testing.B ) {
455+ benchmarkCityLots (b , NewMatcher (nil ))
456+ }
457+
458+ // benchmarkCityLots is distilled from TestCityLots.
459+ func benchmarkCityLots (b * testing.B , m quamina.Matcher ) {
460+
461+ oneMeg := 1024 * 1024
462+ file , err := os .Open ("../test_data/citylots.jlines" )
463+ if err != nil {
464+ b .Errorf ("Can't open file %s" , err )
465+ }
466+ defer file .Close ()
467+
468+ patterns := []string {
469+ `{ "properties": { "STREET": [ "CRANLEIGH" ] } }` ,
470+ `{ "properties": { "STREET": [ "17TH" ], "ODD_EVEN": [ "E"] } }` ,
471+ `{ "geometry": { "coordinates": [ 37.807807921694092 ] } }` ,
472+ `{ "properties": { "MAPBLKLOT": ["0011008"], "BLKLOT": ["0011008"]}, "geometry": { "coordinates": [ 37.807807921694092 ] } } ` ,
473+ }
474+ names := []string {
475+ "CRANLEIGH" ,
476+ "17TH Even" ,
477+ "Geometry" ,
478+ "0011008" ,
479+ }
480+
481+ scanner := bufio .NewScanner (file )
482+ buf := make ([]byte , oneMeg )
483+ scanner .Buffer (buf , oneMeg )
484+
485+ var fj quamina.Flattener
486+ switch vv := m .(type ) {
487+ case * Matcher :
488+ fj = quamina .NewFJ (vv .Matcher )
489+ vv .DisableRebuild ()
490+ case * quamina.CoreMatcher :
491+ fj = quamina .NewFJ (vv )
492+ default :
493+ b .Fatalf ("%T" , vv )
494+ }
495+
496+ for i := range names {
497+ err = m .AddPattern (names [i ], patterns [i ])
498+ if err != nil {
499+ b .Errorf ("AddPattern error %s" , err )
500+ }
501+ }
502+ results := make (map [quamina.X ]int )
503+
504+ lineCount := 0
505+ var lines [][]byte
506+ for scanner .Scan () {
507+ lineCount ++
508+ lines = append (lines , []byte (scanner .Text ()))
509+ }
510+ lineCount = 0
511+
512+ b .ResetTimer ()
513+
514+ for _ , line := range lines {
515+ matches , err := fj .FlattenAndMatch (line )
516+ if err != nil {
517+ b .Errorf ("Matches4JSON error %s on %s" , err , line )
518+ }
519+ lineCount ++
520+ if lineCount == b .N {
521+ break
522+ }
523+ for _ , match := range matches {
524+ count , ok := results [match ]
525+ if ! ok {
526+ count = 0
527+ }
528+ results [match ] = count + 1
529+ }
530+ }
531+
532+ err = scanner .Err ()
533+ if err != nil {
534+ b .Errorf ("Scanner error %s" , err )
535+ }
536+ }
0 commit comments