github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/test_framework/index/random.go (about) 1 package index 2 3 import ( 4 . "github.com/balzaczyy/golucene/core/codec/spi" 5 . "github.com/balzaczyy/golucene/core/index" 6 tu "github.com/balzaczyy/golucene/test_framework/util" 7 "math" 8 "math/rand" 9 "time" 10 ) 11 12 // index/MockRandomMergePolicy.java 13 14 // MergePolicy that makes random decisions for testing. 15 type MockRandomMergePolicy struct { 16 *MergePolicyImpl 17 random *rand.Rand 18 doNonBulkMerges bool 19 } 20 21 func NewMockRandomMergePolicy(r *rand.Rand) *MockRandomMergePolicy { 22 // fork a private random, since we are called unpredicatably from threads: 23 res := &MockRandomMergePolicy{ 24 random: rand.New(rand.NewSource(r.Int63())), 25 doNonBulkMerges: true, 26 } 27 res.MergePolicyImpl = NewDefaultMergePolicyImpl(res) 28 return res 29 } 30 31 func (p *MockRandomMergePolicy) FindMerges(mergeTrigger MergeTrigger, 32 segmentInfos *SegmentInfos, writer *IndexWriter) (MergeSpecification, error) { 33 34 var segments []*SegmentCommitInfo 35 merging := writer.MergingSegments() 36 37 for _, sipc := range segmentInfos.Segments { 38 if _, ok := merging[sipc]; !ok { 39 segments = append(segments, sipc) 40 } 41 } 42 43 var merges []*OneMerge 44 if n := len(segments); n > 1 && (n > 30 || p.random.Intn(5) == 3) { 45 segments2 := make([]*SegmentCommitInfo, len(segments)) 46 for i, v := range p.random.Perm(len(segments)) { 47 segments2[i] = segments[v] 48 } 49 segments = segments2 50 51 // TODO: sometimes make more than 1 merge? 52 segsToMerge := tu.NextInt(p.random, 1, n) 53 if p.doNonBulkMerges { 54 panic("not implemented yet") 55 } else { 56 merges = append(merges, NewOneMerge(segments[:segsToMerge])) 57 } 58 } 59 return MergeSpecification(merges), nil 60 } 61 62 func (p *MockRandomMergePolicy) FindForcedMerges(segmentsInfos *SegmentInfos, 63 maxSegmentCount int, segmentsToMerge map[*SegmentCommitInfo]bool, 64 writer *IndexWriter) (MergeSpecification, error) { 65 panic("not implemented yet") 66 } 67 68 func (p *MockRandomMergePolicy) Close() error { return nil } 69 70 func (p *MockRandomMergePolicy) UseCompoundFile(infos *SegmentInfos, 71 mergedInfo *SegmentCommitInfo, writer *IndexWriter) (bool, error) { 72 // 80% of the time we create CFS: 73 return p.random.Intn(5) != 1, nil 74 } 75 76 // index/AlcoholicMergePolicy.java 77 78 /* 79 Merge policy for testing, it is like an alcoholic. It drinks (merges) 80 at night, and randomly decides what to drink. During the daytime it 81 sleeps. 82 83 If tests pass with this, then they are likely to pass with any 84 bizarro merge policy users might write. 85 86 It is a fine bottle of champagne (Ordered by Martijn) 87 */ 88 type AlcoholicMergePolicy struct { 89 *LogMergePolicy 90 random *rand.Rand 91 } 92 93 func NewAlcoholicMergePolicy( /*tz TimeZone, */ r *rand.Rand) *AlcoholicMergePolicy { 94 mp := &AlcoholicMergePolicy{ 95 NewLogMergePolicy(0, int64(tu.NextInt(r, 1024*1024, int(math.MaxInt32)))), r} 96 mp.SizeSPI = mp 97 return mp 98 } 99 100 func (p *AlcoholicMergePolicy) Size(info *SegmentCommitInfo, 101 writer *IndexWriter) (int64, error) { 102 103 n, err := info.SizeInBytes() 104 now := time.Now() 105 if hour := now.Hour(); err == nil && (hour < 6 || hour > 20 || 106 p.random.Intn(23) == 5) { // it's 5 o'clock somewhere 107 // pick a random drink during the day 108 return drinks[p.random.Intn(5)] * n, nil 109 } 110 return n, err 111 } 112 113 var drinks = []int64{15, 17, 21, 22, 30}