Skip to content

Commit de30bae

Browse files
Some new stuff
1 parent 2d53ebb commit de30bae

File tree

9 files changed

+158
-32
lines changed

9 files changed

+158
-32
lines changed

scassandra/src/main/scala/com/evolutiongaming/scassandra/CassandraConfig.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,15 @@ object CassandraConfig {
7777

7878
implicit val configReaderCompression: ConfigReader[Compression] = ConfigReaderFromEnum(Compression.values())
7979

80-
implicit val configReaderProtocolVersion: ConfigReader[ProtocolVersion] = ConfigReaderFromEnum(ProtocolVersion.values())
80+
implicit val configReaderProtocolVersion: ConfigReader[ProtocolVersion] = ConfigReaderFromEnum.forList(
81+
Vector(
82+
ProtocolVersion.V3,
83+
ProtocolVersion.V4,
84+
ProtocolVersion.V5,
85+
ProtocolVersion.DSE_V1,
86+
ProtocolVersion.DSE_V2,
87+
), _.name()
88+
)
8189

8290
implicit val configReaderCassandraConfig: ConfigReader[CassandraConfig] = {
8391
(cursor: ConfigCursor) => {

scassandra/src/main/scala/com/evolutiongaming/scassandra/QueryConfig.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package com.evolutiongaming.scassandra
22

3-
import com.datastax.driver.core.{ConsistencyLevel, QueryOptions}
3+
import com.datastax.oss.driver.api.core.ConsistencyLevel
4+
import com.datastax.oss.protocol.internal.request.query.QueryOptions
45
import com.typesafe.config.Config
56
import pureconfig.ConfigSource
67

7-
import scala.concurrent.duration._
8+
import scala.concurrent.duration.*
89

910
/**
1011
* See [[https://docs.datastax.com/en/drivers/java/3.5/com/datastax/driver/core/QueryOptions.html]]

scassandra/src/main/scala/com/evolutiongaming/scassandra/QueryConfigImplicits.scala

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
package com.evolutiongaming.scassandra
22

3-
import com.datastax.driver.core.ConsistencyLevel
3+
import com.datastax.oss.driver.api.core.ConsistencyLevel
44
import com.evolutiongaming.scassandra.util.ConfigReaderFromEnum
5-
import com.evolutiongaming.scassandra.util.PureconfigSyntax._
5+
import com.evolutiongaming.scassandra.util.PureconfigSyntax.*
66
import pureconfig.ConfigReader
77

8-
import scala.concurrent.duration._
8+
import scala.concurrent.duration.*
99

1010
trait QueryConfigImplicits {
11-
implicit val configReaderConsistencyLevel: ConfigReader[ConsistencyLevel] = ConfigReaderFromEnum(ConsistencyLevel.values())
11+
implicit val configReaderConsistencyLevel: ConfigReader[ConsistencyLevel] = ConfigReaderFromEnum.forList(Vector(
12+
ConsistencyLevel.ANY,
13+
ConsistencyLevel.ONE,
14+
ConsistencyLevel.TWO,
15+
ConsistencyLevel.THREE,
16+
ConsistencyLevel.QUORUM,
17+
ConsistencyLevel.ALL,
18+
ConsistencyLevel.LOCAL_ONE,
19+
ConsistencyLevel.LOCAL_QUORUM,
20+
ConsistencyLevel.EACH_QUORUM,
21+
ConsistencyLevel.SERIAL,
22+
ConsistencyLevel.LOCAL_SERIAL,
23+
), _.name)
1224

1325
implicit val configReaderQueryConfig: ConfigReader[QueryConfig] = ConfigReader.fromCursor[QueryConfig] { cursor =>
1426
val defaultConfig = QueryConfig()

scassandra/src/main/scala/com/evolutiongaming/scassandra/ReconnectionConfig.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.evolutiongaming.scassandra
22

33
import com.datastax.driver.core.policies.{ExponentialReconnectionPolicy, ReconnectionPolicy}
4+
import com.datastax.oss.driver.api.core.config.DefaultDriverOption
45
import com.datastax.oss.driver.api.core.connection.ReconnectionPolicy
56
import com.datastax.oss.driver.internal.core.connection.ExponentialReconnectionPolicy
7+
import com.evolutiongaming.scassandra.util.FakeConfig
68
import com.typesafe.config.Config
79
import pureconfig.ConfigSource
810

@@ -17,7 +19,11 @@ final case class ReconnectionConfig(
1719
) {
1820

1921
def asJava: ReconnectionPolicy = {
20-
new ExponentialReconnectionPolicy(minDelay.toMillis, maxDelay.toMillis)
22+
val config = FakeConfig.createFakeContext(
23+
DefaultDriverOption.RECONNECTION_BASE_DELAY.getPath -> java.time.Duration.ofMillis(minDelay.toMillis),
24+
DefaultDriverOption.RECONNECTION_MAX_DELAY.getPath -> java.time.Duration.ofMillis(maxDelay.toMillis),
25+
)
26+
new ExponentialReconnectionPolicy(config)
2127
}
2228
}
2329

scassandra/src/main/scala/com/evolutiongaming/scassandra/SpeculativeExecutionConfig.scala

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.evolutiongaming.scassandra
22

3-
import com.datastax.driver.core.policies.{ConstantSpeculativeExecutionPolicy, SpeculativeExecutionPolicy}
3+
import com.datastax.oss.driver.api.core.config.DefaultDriverOption
4+
import com.datastax.oss.driver.api.core.specex.SpeculativeExecutionPolicy
5+
import com.datastax.oss.driver.internal.core.specex.ConstantSpeculativeExecutionPolicy
6+
import com.evolutiongaming.scassandra.util.FakeConfig
47
import com.typesafe.config.Config
58
import pureconfig.ConfigSource
69

7-
import scala.concurrent.duration._
10+
import java.time.Duration as JDuration
11+
import scala.concurrent.duration.*
812

913
/**
1014
* See [[https://docs.datastax.com/en/developer/java-driver/3.5/manual/speculative_execution/]]
@@ -14,7 +18,11 @@ final case class SpeculativeExecutionConfig(
1418
maxExecutions: Int = 2) {
1519

1620
def asJava: SpeculativeExecutionPolicy = {
17-
new ConstantSpeculativeExecutionPolicy(delay.toMillis, maxExecutions)
21+
val config = FakeConfig.createFakeContext(
22+
DefaultDriverOption.SPECULATIVE_EXECUTION_MAX.getPath -> maxExecutions,
23+
DefaultDriverOption.SPECULATIVE_EXECUTION_DELAY.getPath -> JDuration.ofMillis(delay.toMillis),
24+
)
25+
new ConstantSpeculativeExecutionPolicy(config, "")
1826
}
1927
}
2028

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,35 @@
11
package com.evolutiongaming.scassandra
22

3-
import com.datastax.driver.core.{GettableByIndexData, SettableData}
3+
import com.datastax.oss.driver.api.core.cql.Bindable
4+
import com.datastax.oss.driver.api.core.data.GettableByIndex
45

56
trait UpdateByIdx[-A] {
6-
7-
def apply[D <: GettableByIndexData & SettableData[D]](
7+
def apply[D <: GettableByIndex & Bindable[D]](
88
data: D,
99
idx: Int,
1010
value: A
1111
): D
12-
1312
}
1413

1514
object UpdateByIdx {
16-
1715
def apply[A: UpdateByIdx]: UpdateByIdx[A] = implicitly
1816

1917
implicit def fromEncodeByIdx[A: EncodeByIdx]: UpdateByIdx[A] =
2018
new UpdateByIdx[A] {
21-
def apply[D <: GettableByIndexData & SettableData[D]](
19+
def apply[D <: GettableByIndex & Bindable[D]](
2220
data: D,
2321
idx: Int,
2422
value: A
2523
): D = EncodeByIdx[A].apply(data, idx, value)
2624
}
2725

2826
implicit final class Syntax[A](val self: UpdateByIdx[A]) extends AnyVal {
29-
3027
def contramap[B](f: B => A): UpdateByIdx[B] = new UpdateByIdx[B] {
31-
def apply[D <: GettableByIndexData & SettableData[D]](
28+
def apply[D <: GettableByIndex & Bindable[D]](
3229
data: D,
3330
idx: Int,
3431
value: B
3532
): D = self(data, idx, f(value))
3633
}
37-
3834
}
39-
4035
}
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,35 @@
11
package com.evolutiongaming.scassandra
22

3-
import com.datastax.driver.core.{GettableByNameData, SettableData}
3+
import com.datastax.oss.driver.api.core.cql.Bindable
4+
import com.datastax.oss.driver.api.core.data.GettableByName
45

56
trait UpdateByName[-A] {
6-
7-
def apply[D <: GettableByNameData & SettableData[D]](
7+
def apply[D <: GettableByName & Bindable[D]](
88
data: D,
99
name: String,
1010
value: A
1111
): D
12-
1312
}
1413

1514
object UpdateByName {
16-
1715
def apply[A: UpdateByName]: UpdateByName[A] = implicitly
1816

1917
implicit def fromEncodeByName[A: EncodeByName]: UpdateByName[A] =
2018
new UpdateByName[A] {
21-
def apply[D <: GettableByNameData & SettableData[D]](
19+
def apply[D <: GettableByName & Bindable[D]](
2220
data: D,
2321
name: String,
2422
value: A
25-
): D = EncodeByName[A].apply(data, name, value)
23+
): D = EncodeByName[A].bindToData(data, name, value)
2624
}
2725

2826
implicit final class Syntax[A](val self: UpdateByName[A]) extends AnyVal {
29-
3027
def contramap[B](f: B => A): UpdateByName[B] = new UpdateByName[B] {
31-
def apply[D <: GettableByNameData & SettableData[D]](
28+
def apply[D <: GettableByName & Bindable[D]](
3229
data: D,
3330
name: String,
3431
value: B
3532
): D = self(data, name, f(value))
3633
}
37-
3834
}
3935
}

scassandra/src/main/scala/com/evolutiongaming/scassandra/util/ConfigReaderFromEnum.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package com.evolutiongaming.scassandra.util
22

3-
import cats.implicits._
3+
import cats.implicits.*
44
import pureconfig.error.{CannotParse, ConfigReaderFailures}
55
import pureconfig.{ConfigCursor, ConfigReader}
66

7+
import java.util.Locale
78
import scala.reflect.ClassTag
89

910
/** Provides [[ConfigReader]] for Java enums.
@@ -47,4 +48,17 @@ object ConfigReaderFromEnum {
4748
} yield r
4849
}
4950
}
51+
52+
def forList[A](variants: Vector[A], name: A => String)(implicit tag: ClassTag[A]): ConfigReader[A] = {
53+
val map: Map[String, A] = variants.map { i => name(i).toLowerCase(Locale.ROOT) -> i }.toMap
54+
(cursor: ConfigCursor) =>
55+
for {
56+
string <- cursor.asString
57+
result <- map.get(string.toLowerCase(Locale.ROOT)).toRight {
58+
val failure = CannotParse(s"Cannot parse ${tag.runtimeClass} from $string", cursor.origin)
59+
ConfigReaderFailures(failure)
60+
}
61+
} yield result
62+
63+
}
5064
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.evolutiongaming.scassandra.util
2+
3+
import com.datastax.oss.driver.api.core.ProtocolVersion
4+
import com.datastax.oss.driver.api.core.`type`.codec.registry.CodecRegistry
5+
import com.datastax.oss.driver.api.core.addresstranslation.AddressTranslator
6+
import com.datastax.oss.driver.api.core.auth.AuthProvider
7+
import com.datastax.oss.driver.api.core.config.{DriverConfig, DriverConfigLoader, DriverExecutionProfile, DriverOption}
8+
import com.datastax.oss.driver.api.core.connection.ReconnectionPolicy
9+
import com.datastax.oss.driver.api.core.context.DriverContext
10+
import com.datastax.oss.driver.api.core.loadbalancing.LoadBalancingPolicy
11+
import com.datastax.oss.driver.api.core.metadata.NodeStateListener
12+
import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener
13+
import com.datastax.oss.driver.api.core.retry.RetryPolicy
14+
import com.datastax.oss.driver.api.core.session.throttling.RequestThrottler
15+
import com.datastax.oss.driver.api.core.specex.SpeculativeExecutionPolicy
16+
import com.datastax.oss.driver.api.core.ssl.SslEngineFactory
17+
import com.datastax.oss.driver.api.core.time.TimestampGenerator
18+
import com.datastax.oss.driver.api.core.tracker.RequestTracker
19+
20+
import java.time.Duration
21+
import java.{lang, util}
22+
23+
private[scassandra] object FakeConfig {
24+
def createFakeContext(contents: Map[String, Any]): DriverContext = {
25+
val profile = new FakeProfile(contents)
26+
val config = new FakeConfig(profile)
27+
val context = new FakeContext(config)
28+
context
29+
}
30+
31+
def createFakeContext(contents: (String, Any)*): DriverContext = {
32+
createFakeContext(Map(contents*))
33+
}
34+
35+
private class FakeContext(config: FakeConfig) extends DriverContext {
36+
private def unsupported[T]: T = throw new UnsupportedOperationException("Only getConfig is supported by the fake context")
37+
38+
override def getSessionName: String = ""
39+
override def getConfig: DriverConfig = config
40+
override def getConfigLoader: DriverConfigLoader = unsupported
41+
override def getLoadBalancingPolicies: util.Map[String, LoadBalancingPolicy] = unsupported
42+
override def getRetryPolicies: util.Map[String, RetryPolicy] = unsupported
43+
override def getSpeculativeExecutionPolicies: util.Map[String, SpeculativeExecutionPolicy] = unsupported
44+
override def getTimestampGenerator: TimestampGenerator = unsupported
45+
override def getReconnectionPolicy: ReconnectionPolicy = unsupported
46+
override def getAddressTranslator: AddressTranslator = unsupported
47+
override def getAuthProvider: util.Optional[AuthProvider] = unsupported
48+
override def getSslEngineFactory: util.Optional[SslEngineFactory] = unsupported
49+
override def getRequestTracker: RequestTracker = unsupported
50+
override def getRequestThrottler: RequestThrottler = unsupported
51+
override def getNodeStateListener: NodeStateListener = unsupported
52+
override def getSchemaChangeListener: SchemaChangeListener = unsupported
53+
override def getProtocolVersion: ProtocolVersion = unsupported
54+
override def getCodecRegistry: CodecRegistry = unsupported
55+
}
56+
57+
private class FakeConfig(profile: FakeProfile) extends DriverConfig {
58+
private def unsupported[T]: T = throw new UnsupportedOperationException("Only getProfile is supported by the fake config")
59+
60+
override def getProfile(profileName: String): DriverExecutionProfile = profile
61+
override def getProfiles: util.Map[String, _ <: DriverExecutionProfile] = unsupported
62+
}
63+
64+
private class FakeProfile(contents: Map[String, Any]) extends DriverExecutionProfile {
65+
private def unsupported[T]: T = throw new UnsupportedOperationException("List operations not supported by the fake profile")
66+
67+
override def getName: String = "FakeProfile"
68+
override def isDefined(option: DriverOption): Boolean = contents.isDefinedAt(option.getPath)
69+
override def getBoolean(option: DriverOption): Boolean = contents(option.getPath).asInstanceOf[Boolean]
70+
override def getBooleanList(option: DriverOption): util.List[lang.Boolean] = unsupported
71+
override def getInt(option: DriverOption): Int = contents(option.getPath).asInstanceOf[Int]
72+
override def getIntList(option: DriverOption): util.List[Integer] = unsupported
73+
override def getLong(option: DriverOption): Long = contents(option.getPath).asInstanceOf[Long]
74+
override def getLongList(option: DriverOption): util.List[lang.Long] = unsupported
75+
override def getDouble(option: DriverOption): Double = contents(option.getPath).asInstanceOf[Double]
76+
override def getDoubleList(option: DriverOption): util.List[lang.Double] = unsupported
77+
override def getString(option: DriverOption): String = contents(option.getPath).asInstanceOf[String]
78+
override def getStringList(option: DriverOption): util.List[String] = unsupported
79+
override def getStringMap(option: DriverOption): util.Map[String, String] = unsupported
80+
override def getBytes(option: DriverOption): Long = contents(option.getPath).asInstanceOf[Long]
81+
override def getBytesList(option: DriverOption): util.List[lang.Long] = unsupported
82+
override def getDuration(option: DriverOption): Duration = contents(option.getPath).asInstanceOf[Duration]
83+
override def getDurationList(option: DriverOption): util.List[Duration] = unsupported
84+
override def entrySet(): util.SortedSet[util.Map.Entry[String, AnyRef]] = unsupported
85+
}
86+
}

0 commit comments

Comments
 (0)