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}