diff --git a/pom.xml b/pom.xml
index ab062bae1..c3bfd3b32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -231,13 +231,13 @@
10
false
- **/test/unit/**/*.java
- **/*UnitTests.java
+ **/test/unit/**/*
+ **/*UnitTests
**/test/integration/**/*.java
- **/**IntegrationTests.java
- **/test/performance/**/*.java
+ **/**IntegrationTests
+ **/test/performance/**/*
src/test/resources/logging.properties
@@ -253,13 +253,13 @@
true
false
- **/test/integration/**/*.java
- **/*IntegrationTests.java
+ **/test/integration/**/*
+ **/*IntegrationTests
- **/test/unit/**/*.java
- **/*UnitTests.java
- **/test/performance/**/*.java
+ **/test/unit/**/*
+ **/*UnitTests
+ **/test/performance/**/*
src/test/resources/logging.properties
diff --git a/spring-data-cassandra/pom.xml b/spring-data-cassandra/pom.xml
index 2d602d5ea..4f3879f3e 100644
--- a/spring-data-cassandra/pom.xml
+++ b/spring-data-cassandra/pom.xml
@@ -182,6 +182,45 @@
multithreadedtc
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${kotlin}
+ true
+
+
+ org.jetbrains.kotlin
+ kotlin-reflect
+ ${kotlin}
+ true
+
+
+ org.jetbrains.kotlin
+ kotlin-test-junit
+ ${kotlin}
+ test
+
+
+ com.nhaarman
+ mockito-kotlin
+ 1.5.0
+ test
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+
+
+ org.jetbrains.kotlin
+ kotlin-reflect
+
+
+ org.mockito
+ mockito-core
+
+
+
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/AsyncCassandraOperationsExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/AsyncCassandraOperationsExtensions.kt
new file mode 100644
index 000000000..796e7f55e
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/AsyncCassandraOperationsExtensions.kt
@@ -0,0 +1,287 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import com.datastax.driver.core.Statement
+import org.springframework.data.cassandra.core.query.Query
+import org.springframework.data.cassandra.core.query.Update
+import org.springframework.data.domain.Slice
+import org.springframework.util.concurrent.ListenableFuture
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [AsyncCassandraOperations].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+// -------------------------------------------------------------------------
+// Methods dealing with static CQL
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.select(cql: String, entityClass: KClass): ListenableFuture> =
+ select(cql, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.select(cql: String): ListenableFuture> =
+ select(cql, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a Consumer-like function.
+ */
+fun AsyncCassandraOperations.select(cql: String, entityClass: KClass, consumer: (T) -> Unit): ListenableFuture =
+ select(cql, consumer, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a Consumer-like function leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.select(cql: String, crossinline consumer: (T) -> Unit): ListenableFuture =
+ select(cql, { consumer(it) }, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.selectOne(cql: String, entityClass: KClass): ListenableFuture =
+ selectOne(cql, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.selectOne(cql: String): ListenableFuture =
+ selectOne(cql, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with com.datastax.driver.core.Statement
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.select(statement: Statement, entityClass: KClass): ListenableFuture> =
+ select(statement, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.select(statement: Statement): ListenableFuture> =
+ select(statement, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a Consumer-like function.
+ */
+fun AsyncCassandraOperations.select(statement: Statement, entityClass: KClass, consumer: (T) -> Unit): ListenableFuture =
+ select(statement, consumer, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a Consumer-like function leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.select(statement: Statement, crossinline consumer: (T) -> Unit): ListenableFuture =
+ select(statement, { consumer(it) }, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.slice] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.slice(statement: Statement, entityClass: KClass): ListenableFuture> =
+ slice(statement, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.slice] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.slice(statement: Statement): ListenableFuture> =
+ slice(statement, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.selectOne(statement: Statement, entityClass: KClass): ListenableFuture =
+ selectOne(statement, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.selectOne(statement: Statement): ListenableFuture =
+ selectOne(statement, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with org.springframework.data.cassandra.core.query.Query
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.select(query: Query, entityClass: KClass): ListenableFuture> =
+ select(query, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.select(query: Query): ListenableFuture> =
+ select(query, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a Consumer-like function.
+ */
+fun AsyncCassandraOperations.select(query: Query, entityClass: KClass, consumer: (T) -> Unit): ListenableFuture =
+ select(query, consumer, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.select] providing a Consumer-like function leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.select(query: Query, crossinline consumer: (T) -> Unit): ListenableFuture =
+ select(query, { consumer(it) }, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.slice] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.slice(query: Query, entityClass: KClass): ListenableFuture> =
+ slice(query, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.slice] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.slice(query: Query): ListenableFuture> =
+ slice(query, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.selectOne(query: Query, entityClass: KClass): ListenableFuture =
+ selectOne(query, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.selectOne(query: Query): ListenableFuture =
+ selectOne(query, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.update] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.update(query: Query, update: Update, entityClass: KClass): ListenableFuture =
+ update(query, update, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.update] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.update(query: Query, update: Update): ListenableFuture =
+ update(query, update, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.delete] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.delete(query: Query, entityClass: KClass): ListenableFuture =
+ delete(query, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.delete] leveraging reified type parameters.
+ */
+@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
+inline fun AsyncCassandraOperations.delete(query: Query): ListenableFuture =
+ delete(query, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with entities
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [AsyncCassandraOperations.count] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.count(entityClass: KClass): ListenableFuture =
+ count(entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.count(): ListenableFuture =
+ count(T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.count] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.count(query: Query, entityClass: KClass): ListenableFuture =
+ count(query, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.count(query: Query): ListenableFuture =
+ count(query, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.exists] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.exists(id: Any, entityClass: KClass): ListenableFuture =
+ exists(id, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.exists] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.exists(id: Any): ListenableFuture =
+ exists(id, T::class)
+
+/**
+ * Extension for [AsyncCassandraOperations.count] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.exists(query: Query, entityClass: KClass): ListenableFuture =
+ exists(query, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.exists(query: Query): ListenableFuture =
+ exists(query, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOneById] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.selectOneById(id: Any, entityClass: KClass): ListenableFuture =
+ selectOneById(id, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.selectOneById] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.selectOneById(id: Any): ListenableFuture =
+ selectOneById(id, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.deleteById] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.deleteById(id: Any, entityClass: KClass): ListenableFuture =
+ deleteById(id, entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.deleteById] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.deleteById(id: Any): ListenableFuture =
+ deleteById(id, T::class.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.truncate] providing a [KClass] based variant.
+ */
+fun AsyncCassandraOperations.truncate(entityClass: KClass): ListenableFuture =
+ truncate(entityClass.java)
+
+/**
+ * Extension for [AsyncCassandraOperations.truncate] leveraging reified type parameters.
+ */
+inline fun AsyncCassandraOperations.truncate(): ListenableFuture =
+ truncate(T::class.java)
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/CassandraOperationsExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/CassandraOperationsExtensions.kt
new file mode 100644
index 000000000..ef4956da4
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/CassandraOperationsExtensions.kt
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import com.datastax.driver.core.Statement
+import org.springframework.data.cassandra.core.cql.CqlIdentifier
+import org.springframework.data.cassandra.core.query.Query
+import org.springframework.data.cassandra.core.query.Update
+import org.springframework.data.domain.Slice
+import java.util.stream.Stream
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [CassandraOperations].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+/**
+ * Extension for [CassandraOperations.getTableName] providing a [KClass] based variant.
+ */
+fun CassandraOperations.getTableName(entityClass: KClass): CqlIdentifier =
+ getTableName(entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.getTableName] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.getTableName(): CqlIdentifier =
+ getTableName(T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with static CQL
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [CassandraOperations.select] providing a [KClass] based variant.
+ */
+fun CassandraOperations.select(cql: String, entityClass: KClass): List =
+ select(cql, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.select(cql: String): List =
+ select(cql, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.stream] providing a [KClass] based variant.
+ */
+fun CassandraOperations.stream(cql: String, entityClass: KClass): Stream =
+ stream(cql, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.stream] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.stream(cql: String): Stream =
+ stream(cql, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun CassandraOperations.selectOne(cql: String, entityClass: KClass): T? =
+ selectOne(cql, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.selectOne(cql: String): T? =
+ selectOne(cql, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with com.datastax.driver.core.Statement
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [CassandraOperations.select] providing a [KClass] based variant.
+ */
+fun CassandraOperations.select(statement: Statement, entityClass: KClass): List =
+ select(statement, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.select(statement: Statement): List =
+ select(statement, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.slice] providing a [KClass] based variant.
+ */
+fun CassandraOperations.slice(statement: Statement, entityClass: KClass): Slice =
+ slice(statement, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.slice] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.slice(statement: Statement): Slice =
+ slice(statement, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.stream] providing a [KClass] based variant.
+ */
+fun CassandraOperations.stream(statement: Statement, entityClass: KClass): Stream =
+ stream(statement, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.stream] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.stream(statement: Statement): Stream =
+ stream(statement, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun CassandraOperations.selectOne(statement: Statement, entityClass: KClass): T? =
+ selectOne(statement, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.selectOne(statement: Statement): T? =
+ selectOne(statement, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with org.springframework.data.cassandra.core.query.Query
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [CassandraOperations.select] providing a [KClass] based variant.
+ */
+fun CassandraOperations.select(query: Query, entityClass: KClass): List =
+ select(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.select(query: Query): List =
+ select(query, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.slice] providing a [KClass] based variant.
+ */
+fun CassandraOperations.slice(query: Query, entityClass: KClass): Slice =
+ slice(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.slice] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.slice(query: Query): Slice =
+ slice(query, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.stream] providing a [KClass] based variant.
+ */
+fun CassandraOperations.stream(query: Query, entityClass: KClass): Stream =
+ stream(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.stream] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.stream(query: Query): Stream =
+ stream(query, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun CassandraOperations.selectOne(query: Query, entityClass: KClass): T? =
+ selectOne(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.selectOne(query: Query): T? =
+ selectOne(query, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.update] providing a [KClass] based variant.
+ */
+fun CassandraOperations.update(query: Query, update: Update, entityClass: KClass): Boolean =
+ update(query, update, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.update] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.update(query: Query, update: Update): Boolean =
+ update(query, update, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.delete] providing a [KClass] based variant.
+ */
+fun CassandraOperations.delete(query: Query, entityClass: KClass): Boolean =
+ delete(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.delete] leveraging reified type parameters.
+ */
+@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
+inline fun CassandraOperations.delete(query: Query): Boolean =
+ delete(query, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with entities
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [CassandraOperations.count] providing a [KClass] based variant.
+ */
+fun CassandraOperations.count(entityClass: KClass): Long =
+ count(entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.count(): Long =
+ count(T::class.java)
+
+/**
+ * Extension for [CassandraOperations.count] providing a [KClass] based variant.
+ */
+fun CassandraOperations.count(query: Query, entityClass: KClass): Long =
+ count(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.count(query: Query): Long =
+ count(query, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.exists] providing a [KClass] based variant.
+ */
+fun CassandraOperations.exists(id: Any, entityClass: KClass): Boolean =
+ exists(id, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.exists] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.exists(id: Any): Boolean =
+ exists(id, T::class)
+
+/**
+ * Extension for [CassandraOperations.count] providing a [KClass] based variant.
+ */
+fun CassandraOperations.exists(query: Query, entityClass: KClass): Boolean =
+ exists(query, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.exists(query: Query): Boolean =
+ exists(query, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.selectOneById] providing a [KClass] based variant.
+ */
+fun CassandraOperations.selectOneById(id: Any, entityClass: KClass): T? =
+ selectOneById(id, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.selectOneById] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.selectOneById(id: Any): T? =
+ selectOneById(id, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.deleteById] providing a [KClass] based variant.
+ */
+fun CassandraOperations.deleteById(id: Any, entityClass: KClass): Boolean =
+ deleteById(id, entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.deleteById] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.deleteById(id: Any): Boolean =
+ deleteById(id, T::class.java)
+
+/**
+ * Extension for [CassandraOperations.truncate] providing a [KClass] based variant.
+ */
+fun CassandraOperations.truncate(entityClass: KClass): Unit =
+ truncate(entityClass.java)
+
+/**
+ * Extension for [CassandraOperations.truncate] leveraging reified type parameters.
+ */
+inline fun CassandraOperations.truncate(): Unit =
+ truncate(T::class.java)
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableDeleteOperationExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableDeleteOperationExtensions.kt
new file mode 100644
index 000000000..6717d14c2
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableDeleteOperationExtensions.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [ExecutableDeleteOperation].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+/**
+ * Extension for [ExecutableRemoveOperation.delete] providing a [KClass] based variant.
+ */
+fun ExecutableDeleteOperation.delete(entityClass: KClass): ExecutableDeleteOperation.ExecutableDelete =
+ delete(entityClass.java)
+
+/**
+ * Extension for [ExecutableRemoveOperation.delete] leveraging reified type parameters.
+ */
+inline fun ExecutableDeleteOperation.delete(): ExecutableDeleteOperation.ExecutableDelete =
+ delete(T::class.java)
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableInsertOperationExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableInsertOperationExtensions.kt
new file mode 100644
index 000000000..9e1dd7b34
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableInsertOperationExtensions.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [ExecutableInsertOperation].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+/**
+ * Extension for [ExecutableInsertOperation.insert] providing a [KClass] based variant.
+ */
+fun ExecutableInsertOperation.insert(entityClass: KClass): ExecutableInsertOperation.ExecutableInsert =
+ insert(entityClass.java)
+
+/**
+ * Extension for [ExecutableInsertOperation.insert] leveraging reified type parameters.
+ */
+inline fun ExecutableInsertOperation.insert(): ExecutableInsertOperation.ExecutableInsert =
+ insert(T::class.java)
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableSelectOperationExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableSelectOperationExtensions.kt
new file mode 100644
index 000000000..6a2abec57
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableSelectOperationExtensions.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [ExecutableSelectOperation].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+/**
+ * Extension for [ExecutableSelectOperation.query] providing a [KClass] based variant.
+ */
+fun ExecutableSelectOperation.query(entityClass: KClass): ExecutableSelectOperation.ExecutableSelect =
+ query(entityClass.java)
+
+/**
+ * Extension for [ExecutableSelectOperation.query] leveraging reified type parameters.
+ */
+inline fun ExecutableSelectOperation.query(): ExecutableSelectOperation.ExecutableSelect =
+ query(T::class.java)
+
+/**
+ * Extension for [ExecutableSelectOperation.SelectWithProjection. as] providing a [KClass] based variant.
+ */
+fun ExecutableSelectOperation.SelectWithProjection<*>.asType(resultType: KClass): ExecutableSelectOperation.SelectWithQuery =
+ `as`(resultType.java)
+
+/**
+ * Extension for [ExecutableSelectOperation.FindWithProjection. as] leveraging reified type parameters.
+ */
+inline fun ExecutableSelectOperation.SelectWithProjection<*>.asType(): ExecutableSelectOperation.SelectWithQuery =
+ `as`(T::class.java)
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableUpdateOperationExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableUpdateOperationExtensions.kt
new file mode 100644
index 000000000..3be014be8
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ExecutableUpdateOperationExtensions.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [ExecutableUpdateOperation].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+/**
+ * Extension for [ExecutableUpdateOperation.update] providing a [KClass] based variant.
+ */
+fun ExecutableUpdateOperation.update(entityClass: KClass): ExecutableUpdateOperation.ExecutableUpdate =
+ update(entityClass.java)
+
+/**
+ * Extension for [ExecutableUpdateOperation.update] leveraging reified type parameters.
+ */
+inline fun ExecutableUpdateOperation.update(): ExecutableUpdateOperation.ExecutableUpdate =
+ update(T::class.java)
diff --git a/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveCassandraOperationsExtensions.kt b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveCassandraOperationsExtensions.kt
new file mode 100644
index 000000000..01a1cf3e0
--- /dev/null
+++ b/spring-data-cassandra/src/main/kotlin/org/springframework/data/cassandra/core/ReactiveCassandraOperationsExtensions.kt
@@ -0,0 +1,227 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.springframework.data.cassandra.core
+
+import com.datastax.driver.core.Statement
+import org.springframework.data.cassandra.core.query.Query
+import org.springframework.data.cassandra.core.query.Update
+import reactor.core.publisher.Flux
+import reactor.core.publisher.Mono
+import kotlin.reflect.KClass
+
+/**
+ * Extensions for [ReactiveCassandraOperations].
+ *
+ * @author Mark Paluch
+ * @since 2.1
+ */
+
+// -------------------------------------------------------------------------
+// Methods dealing with static CQL
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [ReactiveCassandraOperations.select] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.select(cql: String, entityClass: KClass): Flux =
+ select(cql, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.select(cql: String): Flux =
+ select(cql, T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.selectOne(cql: String, entityClass: KClass): Mono =
+ selectOne(cql, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.selectOne(cql: String): Mono =
+ selectOne(cql, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with com.datastax.driver.core.Statement
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [ReactiveCassandraOperations.select] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.select(statement: Statement, entityClass: KClass): Flux =
+ select(statement, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.select(statement: Statement): Flux =
+ select(statement, T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.selectOne(statement: Statement, entityClass: KClass): Mono =
+ selectOne(statement, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.selectOne(statement: Statement): Mono =
+ selectOne(statement, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with org.springframework.data.cassandra.core.query.Query
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [ReactiveCassandraOperations.select] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.select(query: Query, entityClass: KClass): Flux =
+ select(query, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.select] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.select(query: Query): Flux =
+ select(query, T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.selectOne] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.selectOne(query: Query, entityClass: KClass): Mono =
+ selectOne(query, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.selectOne] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.selectOne(query: Query): Mono =
+ selectOne(query, T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.update] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.update(query: Query, update: Update, entityClass: KClass): Mono =
+ update(query, update, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.update] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.update(query: Query, update: Update): Mono =
+ update(query, update, T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.delete] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.delete(query: Query, entityClass: KClass): Mono =
+ delete(query, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.delete] leveraging reified type parameters.
+ */
+@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
+inline fun ReactiveCassandraOperations.delete(query: Query): Mono =
+ delete(query, T::class.java)
+
+// -------------------------------------------------------------------------
+// Methods dealing with entities
+// -------------------------------------------------------------------------
+
+/**
+ * Extension for [ReactiveCassandraOperations.count] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.count(entityClass: KClass): Mono =
+ count(entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.count(): Mono =
+ count(T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.count] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.count(query: Query, entityClass: KClass): Mono =
+ count(query, entityClass.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.count] leveraging reified type parameters.
+ */
+inline fun ReactiveCassandraOperations.count(query: Query): Mono =
+ count(query, T::class.java)
+
+/**
+ * Extension for [ReactiveCassandraOperations.exists] providing a [KClass] based variant.
+ */
+fun ReactiveCassandraOperations.exists(id: Any, entityClass: KClass): Mono