Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ buildscript {
}
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:0.1-SNAPSHOT"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
}
}

Expand All @@ -35,7 +35,7 @@ allprojects {

dependencies {
compile 'joda-time:joda-time:2.3'
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: '0.1-SNAPSHOT', changing: true
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: kotlinVersion, changing: true
testCompile group: 'org.jetbrains.spek', name: 'spek', version: '0.1-SNAPSHOT', changing: true
}

Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
kotlinVersion=1.0.0-beta-3595
Original file line number Diff line number Diff line change
@@ -1,34 +1,20 @@
package kotlinx.nosql.mongodb

import kotlinx.nosql.Database
import kotlinx.nosql.Session
import com.mongodb.MongoClient
import kotlinx.nosql.AbstractColumn
import kotlinx.nosql.util.*
import java.util.concurrent.ConcurrentHashMap
import com.mongodb.ServerAddress
import com.mongodb.MongoClientOptions
import com.mongodb.MongoClientURI
import kotlinx.nosql.SchemaGenerationAction
import kotlinx.nosql.Create
import kotlinx.nosql.CreateDrop
import kotlinx.nosql.Validate
import kotlinx.nosql.Update
import kotlinx.nosql.AbstractSchema
import com.mongodb.MongoCredential
import com.mongodb.*
import kotlinx.nosql.*

fun MongoDB(uri: MongoClientURI, schemas: Array<out AbstractSchema>, initialization: SchemaGenerationAction<MongoDBSession> = Validate()): MongoDB {
val seeds: Array<ServerAddress> = uri.getHosts()!!.map { host ->
val seeds: Array<ServerAddress> = uri.hosts!!.map { host ->
if (host.indexOf(':') > 0) {
val tokens = host.split(':')
ServerAddress(tokens[0], tokens[1].toInt())
} else
ServerAddress(host)
}.toTypedArray()
val database: String = if (uri.getDatabase() != null) uri.getDatabase()!! else "test"
val options: MongoClientOptions = uri.getOptions()!!
val credentials = if (uri.getUsername() != null)
arrayOf(MongoCredential.createMongoCRCredential(uri.getUsername(), database, uri.getPassword())!!)
val database: String = if (uri.database != null) uri.database!! else "test"
val options: MongoClientOptions = uri.options!!
val credentials = if (uri.username != null)
arrayOf(MongoCredential.createMongoCRCredential(uri.username, database, uri.password)!!)
else arrayOf()
return MongoDB(seeds, database, credentials, options, schemas, initialization)
}
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package kotlinx.nosql.mongodb.test

import kotlin.test.assertEquals
import kotlinx.nosql.*
import kotlinx.nosql.mongodb.*
import kotlinx.nosql.mongodb.DocumentSchema
import org.joda.time.LocalDate
import org.jetbrains.spek.api.Spek
import java.util.regex.Pattern
import kotlin.reflect.KClass
import kotlin.test.assertTrue

class MongoDBSpek : Spek() {
open class ProductSchema<D: Any, S : DocumentSchema<D>>(klass: KClass<D>, discriminator: String) : DocumentSchema<D>("products",
Expand Down
33 changes: 16 additions & 17 deletions src/main/kotlin/kotlinx/nosql/AbstractColumn.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package kotlinx.nosql

import java.util.ArrayList
import java.util.regex.Pattern
import kotlinx.nosql.query.*
import java.util.regex.Pattern
import kotlin.reflect.KClass

open class AbstractColumn<C, T : AbstractSchema, S: Any>(val name: String, val valueClass: KClass<S>, val columnType: ColumnType) : ColumnQueryWrapper<C>(), Expression<C> {
Expand All @@ -22,7 +21,7 @@ open class AbstractColumn<C, T : AbstractSchema, S: Any>(val name: String, val v
}

operator fun <C2> plus(c: AbstractColumn<C2, T, *>): ColumnPair<T, C, C2> {
return ColumnPair(this, c) as ColumnPair<T, C, C2>
return ColumnPair(this, c)
}
}

Expand All @@ -32,53 +31,53 @@ fun<C, T: AbstractSchema> AbstractColumn<C, T, *>.get(): C {
}
*/

fun <C, T: AbstractSchema> AbstractColumn<C, T, *>.update(value: C): Int {
fun <C, T: AbstractSchema> update(value: C): Int {
val wrapper = TableSchemaProjectionQueryWrapper.get()
return Session.current<Session>().update(wrapper.params.table, arrayOf(wrapper.params.projection.get(0) to value),
return Session.current<Session>().update(wrapper.params.table, arrayOf(wrapper.params.projection[0] to value),
wrapper.params.query!!)
}

fun <C, S: Collection<C>> AbstractColumn<S, *, *>.addAll(values: S): Int {
fun <C, S: Collection<C>> addAll(values: S): Int {
val wrapper = TableSchemaProjectionQueryWrapper.get()
return Session.current<Session>().addAll(wrapper.params.table,
wrapper.params.projection.get(0)
wrapper.params.projection[0]
as AbstractColumn<Collection<C>, out AbstractSchema, out Any>, values,
wrapper.params.query!!)
}

fun <C, S: Collection<C>> AbstractColumn<S, *, *>.add(value: C): Int {
fun <C, S: Collection<C>> add(value: C): Int {
val wrapper = TableSchemaProjectionQueryWrapper.get()
val values: Collection<C> = if (wrapper.params.projection.get(0).columnType.list) listOf(value) else setOf(value)
val values: Collection<C> = if (wrapper.params.projection[0].columnType.list) listOf(value) else setOf(value)
return Session.current<Session>().addAll(wrapper.params.table,
wrapper.params.projection.get(0)
wrapper.params.projection[0]
as AbstractColumn<Collection<C>, out AbstractSchema, out Any>, values,
wrapper.params.query!!)
}

fun <C, S: Collection<C>> AbstractColumn<S, *, *>.removeAll(values: S): Int {
fun <C, S: Collection<C>> removeAll(values: S): Int {
val wrapper = TableSchemaProjectionQueryWrapper.get()
return Session.current<Session>().removeAll(wrapper.params.table,
wrapper.params.projection.get(0)
wrapper.params.projection[0]
as AbstractColumn<Collection<C>, out AbstractSchema, out Any>, values,
wrapper.params.query!!)
}

fun <C> AbstractColumn<out Collection<C>, *, *>.remove(value: C): Int {
fun <C> remove(value: C): Int {
val wrapper = TableSchemaProjectionQueryWrapper.get()
val values: Collection<C> = if (wrapper.params.projection.get(0).columnType.list) listOf(value) else setOf(value)
val values: Collection<C> = if (wrapper.params.projection[0].columnType.list) listOf(value) else setOf(value)
return Session.current<Session>().removeAll(wrapper.params.table,
wrapper.params.projection.get(0)
wrapper.params.projection[0]
as AbstractColumn<Collection<C>, out AbstractSchema, out Any>, values,
wrapper.params.query!!)
}

fun <C: AbstractColumn<out Collection<*>, *, *>> C.remove(removeOp: C.() -> Query): Int {
val wrapper = TableSchemaProjectionQueryWrapper.get()
val removeOpValue = with (wrapper.params.projection.get(0)) {
val removeOpValue = with (wrapper.params.projection[0]) {
removeOp()
}
return Session.current<Session>().removeAll(wrapper.params.table,
wrapper.params.projection.get(0)
wrapper.params.projection[0]
as AbstractColumn<Collection<C>, out AbstractSchema, out Any>, removeOpValue,
wrapper.params.query!!)
}
Expand Down
42 changes: 7 additions & 35 deletions src/main/kotlin/kotlinx/nosql/AbstractSchema.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package kotlinx.nosql

import java.util.ArrayList
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.CopyOnWriteArrayList
import kotlinx.nosql.query.TextQuery
import org.joda.time.DateTime
import org.joda.time.LocalDate
import org.joda.time.LocalTime
import org.joda.time.DateTime
import kotlinx.nosql.query.TextQuery
import java.util.*

abstract class AbstractSchema(val schemaName: String) {
// TODO TODO TODO
Expand Down Expand Up @@ -37,79 +35,53 @@ fun text(search: String): Query {
// Extension functions

fun <S : AbstractSchema> string(name: String): AbstractColumn<String, S, String> = AbstractColumn(name, String::class, ColumnType.STRING)
fun <S : AbstractSchema> S.string(name: String): AbstractColumn<String, S, String> = AbstractColumn(name, String::class, ColumnType.STRING)

fun <S : AbstractSchema> boolean(name: String): AbstractColumn<Boolean, S, Boolean> = AbstractColumn(name, Boolean::class, ColumnType.BOOLEAN)
fun <S : AbstractSchema> S.boolean(name: String): AbstractColumn<Boolean, S, Boolean> = AbstractColumn(name, Boolean::class, ColumnType.BOOLEAN)

fun <S : AbstractSchema> date(name: String): AbstractColumn<LocalDate, S, LocalDate> = AbstractColumn(name, LocalDate::class, ColumnType.DATE)
fun <S : AbstractSchema> S.date(name: String): AbstractColumn<LocalDate, S, LocalDate> = AbstractColumn(name, LocalDate::class, ColumnType.DATE)

fun <S : AbstractSchema> time(name: String): AbstractColumn<LocalTime, S, LocalTime> = AbstractColumn(name, LocalTime::class, ColumnType.TIME)
fun <S : AbstractSchema> S.time(name: String): AbstractColumn<LocalTime, S, LocalTime> = AbstractColumn(name, LocalTime::class, ColumnType.TIME)

fun <S : AbstractSchema> dateTime(name: String): AbstractColumn<DateTime, S, DateTime> = AbstractColumn(name, DateTime::class, ColumnType.DATE_TIME)
fun <S : AbstractSchema> S.dateTime(name: String): AbstractColumn<DateTime, S, DateTime> = AbstractColumn(name, DateTime::class, ColumnType.DATE_TIME)

fun <S : AbstractSchema> double(name: String): AbstractColumn<Double, S, Double> = AbstractColumn(name, Double::class, ColumnType.DOUBLE)
fun <S : AbstractSchema> S.double(name: String): AbstractColumn<Double, S, Double> = AbstractColumn(name, Double::class, ColumnType.DOUBLE)

fun <S : AbstractSchema> integer(name: String): AbstractColumn<Int, S, Int> = AbstractColumn(name, Int::class, ColumnType.INTEGER)
fun <S : AbstractSchema> S.integer(name: String): AbstractColumn<Int, S, Int> = AbstractColumn(name, Int::class, ColumnType.INTEGER)

fun <S : AbstractSchema> float(name: String): AbstractColumn<Float, S, Float> = AbstractColumn(name, Float::class, ColumnType.FLOAT)
fun <S : AbstractSchema> S.float(name: String): AbstractColumn<Float, S, Float> = AbstractColumn(name, Float::class, ColumnType.FLOAT)

fun <S : AbstractSchema> long(name: String): AbstractColumn<Long, S, Long> = AbstractColumn(name, Long::class, ColumnType.LONG)
fun <S : AbstractSchema> S.long(name: String): AbstractColumn<Long, S, Long> = AbstractColumn(name, Long::class, ColumnType.LONG)

fun <S : AbstractSchema> short(name: String): AbstractColumn<Short, S, Short> = AbstractColumn(name, Short::class, ColumnType.SHORT)
fun <S : AbstractSchema> S.short(name: String): AbstractColumn<Short, S, Short> = AbstractColumn(name, Short::class, ColumnType.SHORT)

fun <S : AbstractSchema> byte(name: String): AbstractColumn<Byte, S, Byte> = AbstractColumn(name, Byte::class, ColumnType.BYTE)
fun <S : AbstractSchema> S.byte(name: String): AbstractColumn<Byte, S, Byte> = AbstractColumn(name, Byte::class, ColumnType.BYTE)

fun <S : AbstractSchema> nullableString(name: String): NullableColumn<String, S> = NullableColumn(name, String::class, ColumnType.STRING)
fun <S : AbstractSchema> S.nullableString(name: String): NullableColumn<String, S> = NullableColumn(name, String::class, ColumnType.STRING)

fun <S : AbstractSchema> nullableInteger(name: String): NullableColumn<Int, S> = NullableColumn(name, Int::class, ColumnType.INTEGER)
fun <S : AbstractSchema> S.nullableInteger(name: String): NullableColumn<Int, S> = NullableColumn(name, Int::class, ColumnType.INTEGER)

fun <S : AbstractSchema> nullableBoolean(name: String): NullableColumn<Boolean, S> = NullableColumn(name, Boolean::class, ColumnType.BOOLEAN)
fun <S : AbstractSchema> S.nullableBoolean(name: String): NullableColumn<Boolean, S> = NullableColumn(name, Boolean::class, ColumnType.BOOLEAN)

fun <S : AbstractSchema> nullableDate(name: String): NullableColumn<LocalDate, S> = NullableColumn(name, LocalDate::class, ColumnType.DATE)
fun <S : AbstractSchema> S.nullableDate(name: String): NullableColumn<LocalDate, S> = NullableColumn(name, LocalDate::class, ColumnType.DATE)

fun <S : AbstractSchema> nullableTime(name: String): NullableColumn<LocalTime, S> = NullableColumn(name, LocalTime::class, ColumnType.TIME)
fun <S : AbstractSchema> S.nullableTime(name: String): NullableColumn<LocalTime, S> = NullableColumn(name, LocalTime::class, ColumnType.TIME)

fun <S : AbstractSchema> nullableDateTime(name: String): NullableColumn<DateTime, S> = NullableColumn(name, DateTime::class, ColumnType.DATE_TIME)
fun <S : AbstractSchema> S.nullableDateTime(name: String): NullableColumn<DateTime, S> = NullableColumn(name, DateTime::class, ColumnType.DATE_TIME)

fun <S : AbstractSchema> nullableDouble(name: String): NullableColumn<Double, S> = NullableColumn(name, Double::class, ColumnType.DOUBLE)
fun <S : AbstractSchema> S.nullableDouble(name: String): NullableColumn<Double, S> = NullableColumn(name, Double::class, ColumnType.DOUBLE)

fun <S : AbstractSchema> nullableFloat(name: String): NullableColumn<Float, S> = NullableColumn(name, Float::class, ColumnType.FLOAT)
fun <S : AbstractSchema> S.nullableFloat(name: String): NullableColumn<Float, S> = NullableColumn(name, Float::class, ColumnType.FLOAT)

fun <S : AbstractSchema> nullableLong(name: String): NullableColumn<Long, S> = NullableColumn(name, Long::class, ColumnType.LONG)
fun <S : AbstractSchema> S.nullableLong(name: String): NullableColumn<Long, S> = NullableColumn(name, Long::class, ColumnType.LONG)

fun <S : AbstractSchema> nullableShort(name: String): NullableColumn<Short, S> = NullableColumn(name, Short::class, ColumnType.SHORT)
fun <S : AbstractSchema> S.nullableShort(name: String): NullableColumn<Short, S> = NullableColumn(name, Short::class, ColumnType.SHORT)

fun <S : AbstractSchema> nullableByte(name: String): NullableColumn<Byte, S> = NullableColumn(name, Byte::class, ColumnType.BYTE)
fun <S : AbstractSchema> S.nullableByte(name: String): NullableColumn<Byte, S> = NullableColumn(name, Byte::class, ColumnType.BYTE)

fun <S : AbstractSchema> setOfString(name: String): AbstractColumn<Set<String>, S, String> = AbstractColumn<Set<String>, S, String>(name, String::class, ColumnType.STRING_SET)
fun <S : AbstractSchema> S.setOfString(name: String): AbstractColumn<Set<String>, S, String> = AbstractColumn<Set<String>, S, String>(name, String::class, ColumnType.STRING_SET)
fun <S : AbstractSchema> setOfString(name: String): AbstractColumn<Set<String>, S, String> = AbstractColumn(name, String::class, ColumnType.STRING_SET)

fun <S : AbstractSchema> setOfInteger(name: String): AbstractColumn<Set<Int>, S, Int> = AbstractColumn<Set<Int>, S, Int>(name, Int::class, ColumnType.INTEGER_SET)
fun <S : AbstractSchema> S.setOfInteger(name: String): AbstractColumn<Set<Int>, S, Int> = AbstractColumn<Set<Int>, S, Int>(name, Int::class, ColumnType.INTEGER_SET)
fun <S : AbstractSchema> setOfInteger(name: String): AbstractColumn<Set<Int>, S, Int> = AbstractColumn(name, Int::class, ColumnType.INTEGER_SET)

fun <S : AbstractSchema> listOfString(name: String): AbstractColumn<List<String>, S, String> = AbstractColumn<List<String>, S, String>(name, String::class, ColumnType.STRING_LIST)
fun <S : AbstractSchema> S.listOfString(name: String): AbstractColumn<List<String>, S, String> = AbstractColumn<List<String>, S, String>(name, String::class, ColumnType.STRING_LIST)
fun <S : AbstractSchema> listOfString(name: String): AbstractColumn<List<String>, S, String> = AbstractColumn(name, String::class, ColumnType.STRING_LIST)

fun <S : AbstractSchema> listOfInteger(name: String): AbstractColumn<List<Int>, S, Int> = AbstractColumn<List<Int>, S, Int>(name, Int::class, ColumnType.INTEGER_LIST)
fun <S : AbstractSchema> S.listOfInteger(name: String): AbstractColumn<List<Int>, S, Int> = AbstractColumn<List<Int>, S, Int>(name, Int::class, ColumnType.INTEGER_LIST)
fun <S : AbstractSchema> listOfInteger(name: String): AbstractColumn<List<Int>, S, Int> = AbstractColumn(name, Int::class, ColumnType.INTEGER_LIST)
Loading