diff --git a/data/src/main/scala/swaydb/data/accelerate/Accelerator.scala b/data/src/main/scala/swaydb/data/accelerate/Accelerator.scala index e68bb2ca7..39e20afca 100644 --- a/data/src/main/scala/swaydb/data/accelerate/Accelerator.scala +++ b/data/src/main/scala/swaydb/data/accelerate/Accelerator.scala @@ -24,7 +24,10 @@ package swaydb.data.accelerate +import java.util.Optional + import swaydb.data.util.StorageUnits._ +import swaydb.data.util.Java._ import scala.concurrent.duration._ @@ -33,6 +36,12 @@ import scala.concurrent.duration._ */ object Accelerator { + def apply(nextMapSize: Long, brake: Optional[Brake]): Accelerator = + new Accelerator( + nextMapSize = nextMapSize, + brake = brake.asScala + ) + /** * http://swaydb.io/configuring-levels/acceleration */ @@ -69,6 +78,9 @@ object Accelerator { ) ) + def brakeBuilder(): BrakeBuilder.Step0 = + BrakeBuilder.builder() + /** * http://swaydb.io/configuring-levels/acceleration/noBrakes */ @@ -78,17 +90,20 @@ object Accelerator { maxMapSize: Long = 24.mb)(level0Meter: LevelZeroMeter): Accelerator = Accelerator( nextMapSize = - nextMapSize(onMapCount, increaseMapSizeBy, maxMapSize, level0Meter), + nextMapSize( + mapCount = onMapCount, + increaseMapSizeBy = increaseMapSizeBy, + maxMapSize = maxMapSize, + level0Meter = level0Meter + ), brake = None ) def cruise(level0Meter: LevelZeroMeter): Accelerator = Accelerator( - nextMapSize = - level0Meter.defaultMapSize, - brake = - None + nextMapSize = level0Meter.defaultMapSize, + brake = None ) } diff --git a/data/src/main/scala/swaydb/data/accelerate/BrakeBuilder.scala b/data/src/main/scala/swaydb/data/accelerate/BrakeBuilder.scala new file mode 100644 index 000000000..1971ebb83 --- /dev/null +++ b/data/src/main/scala/swaydb/data/accelerate/BrakeBuilder.scala @@ -0,0 +1,79 @@ +package swaydb.data.accelerate + +import scala.concurrent.duration.FiniteDuration + +class BrakeBuilder { + private var increaseMapSizeOnMapCount: Int = _ + private var increaseMapSizeBy: Int = _ + private var maxMapSize: Long = _ + private var brakeOnMapCount: Int = _ + private var brakeFor: FiniteDuration = _ + private var releaseRate: FiniteDuration = _ + private var levelZeroMeter: LevelZeroMeter = _ +} + +object BrakeBuilder { + + class Step0(builder: BrakeBuilder) { + def withIncreaseMapSizeOnMapCount(increaseMapSizeOnMapCount: Int) = { + builder.increaseMapSizeOnMapCount = increaseMapSizeOnMapCount + new Step1(builder) + } + } + + class Step1(builder: BrakeBuilder) { + def withIncreaseMapSizeBy(increaseMapSizeBy: Int) = { + builder.increaseMapSizeBy = increaseMapSizeBy + new Step2(builder) + } + } + + class Step2(builder: BrakeBuilder) { + def withMaxMapSize(maxMapSize: Long) = { + builder.maxMapSize = maxMapSize + new Step3(builder) + } + } + + class Step3(builder: BrakeBuilder) { + def withBrakeOnMapCount(brakeOnMapCount: Int) = { + builder.brakeOnMapCount = brakeOnMapCount + new Step4(builder) + } + } + + class Step4(builder: BrakeBuilder) { + def withBrakeFor(brakeFor: FiniteDuration) = { + builder.brakeFor = brakeFor + new Step5(builder) + } + } + + class Step5(builder: BrakeBuilder) { + def withReleaseRate(releaseRate: FiniteDuration) = { + builder.releaseRate = releaseRate + new Step6(builder) + } + } + + class Step6(builder: BrakeBuilder) { + def withLevelZeroMeter(levelZeroMeter: LevelZeroMeter) = { + builder.levelZeroMeter = levelZeroMeter + new Step7(builder) + } + } + + class Step7(builder: BrakeBuilder) { + def build(): Accelerator = + Accelerator.brake( + increaseMapSizeOnMapCount = builder.increaseMapSizeOnMapCount, + increaseMapSizeBy = builder.increaseMapSizeBy, + maxMapSize = builder.maxMapSize, + brakeOnMapCount = builder.brakeOnMapCount, + brakeFor = builder.brakeFor, + releaseRate = builder.releaseRate + )(builder.levelZeroMeter) + } + + def builder() = new Step0(new BrakeBuilder()) +} diff --git a/data/src/main/scala/swaydb/data/accelerate/NoBrakesBuilder.scala b/data/src/main/scala/swaydb/data/accelerate/NoBrakesBuilder.scala new file mode 100644 index 000000000..62dffd58b --- /dev/null +++ b/data/src/main/scala/swaydb/data/accelerate/NoBrakesBuilder.scala @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 Simer JS Plaha (simer.j@gmail.com - @simerplaha) + * + * This file is a part of SwayDB. + * + * SwayDB is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * SwayDB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SwayDB. If not, see . + * + * Additional permission under the GNU Affero GPL version 3 section 7: + * If you modify this Program, or any covered work, by linking or combining + * it with other code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + */ + +package swaydb.data.accelerate + +class NoBrakesBuilder { + private var onMapCount: Int = _ + private var increaseMapSizeBy: Int = _ + private var maxMapSize: Long = _ + private var level0Meter: LevelZeroMeter = _ +} + +object NoBrakesBuilder { + + class Step0(builder: NoBrakesBuilder) { + def withOnMapCount(onMapCount: Int) = { + builder.onMapCount = onMapCount + new Step1(builder) + } + } + + class Step1(builder: NoBrakesBuilder) { + def withIncreaseMapSizeBy(increaseMapSizeBy: Int) = { + builder.increaseMapSizeBy = increaseMapSizeBy + new Step2(builder) + } + } + + class Step2(builder: NoBrakesBuilder) { + def withMaxMapSize(maxMapSize: Long) = { + builder.maxMapSize = maxMapSize + new Step3(builder) + } + } + + class Step3(builder: NoBrakesBuilder) { + def withLevel0Meter(level0Meter: LevelZeroMeter) = { + builder.level0Meter = level0Meter + new Step4(builder) + } + } + + class Step4(builder: NoBrakesBuilder) { + def build(): Accelerator = + Accelerator.noBrakes( + onMapCount = builder.onMapCount, + increaseMapSizeBy = builder.increaseMapSizeBy, + maxMapSize = builder.maxMapSize + )(builder.level0Meter) + } + + def builder() = new Step0(new NoBrakesBuilder()) +}