blob: 610f4738551f241dbc58ddb021bf91d2a723e210 [file] [log] [blame]
using Lucene.Net.Util;
using System;
namespace Lucene.Net.Index
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// <para>
/// Merge policy for testing, it is like an alcoholic.
/// It drinks (merges) at night, and randomly decides what to drink.
/// During the daytime it sleeps.
/// </para>
/// <para>
/// If tests pass with this, then they are likely to pass with any
/// bizarro merge policy users might write.
/// </para>
/// <para>
/// It is a fine bottle of champagne (Ordered by Martijn).
/// </para>
/// </summary>
public class AlcoholicMergePolicy : LogMergePolicy
{
private readonly Random random;
private readonly DateTime calendar;
public AlcoholicMergePolicy(TimeZoneInfo timeZone, Random random)
{
// LUCENENET NOTE: All we care about here is that we have a random distribution of "Hour", picking any valid
// date at random achives this. We have no actual need to create a Calendar object in .NET.
var randomTime = new DateTime(TestUtil.NextInt64(random, DateTime.MinValue.Ticks, DateTime.MaxValue.Ticks));
this.calendar = TimeZoneInfo.ConvertTime(randomTime, TimeZoneInfo.Local, timeZone);
this.random = random;
m_maxMergeSize = TestUtil.NextInt32(random, 1024 * 1024, int.MaxValue);
}
protected override long Size(SegmentCommitInfo info)
{
int hourOfDay = calendar.Hour;
if (hourOfDay < 6 || hourOfDay > 20 || random.Next(23) == 5)
// its 5 o'clock somewhere
{
Drink[] values = (Drink[])Enum.GetValues(typeof(Drink));
// pick a random drink during the day
Drink drink = values[random.Next(values.Length - 1)];
return (long)drink * info.GetSizeInBytes();
}
return info.GetSizeInBytes();
}
private enum Drink
{
Beer = 15,
Wine = 17,
Champagne = 21,
WhiteRussian = 22,
SingleMalt = 30
}
}
}