feat: add core storage value model and exception types
This commit is contained in:
1 parent
61bcc02ea2
commit
2ca0f2b866
5 files changed
+108
No files matched your search
@@ -0,0 +1,16 @@
|
||||
package kestrel
|
||||
|
||||
open class KestrelException(message: String) : RuntimeException(message)
|
||||
|
||||
class LexException(
|
||||
message: String,
|
||||
val line: Int,
|
||||
val column: Int,
|
||||
val incomplete: Boolean = false
|
||||
) : KestrelException("$message at line $line, column $column")
|
||||
|
||||
class ParseException(
|
||||
message: String,
|
||||
val line: Int,
|
||||
val column: Int
|
||||
) : KestrelException("$message at line $line, column $column")
|
||||
@@ -0,0 +1,3 @@
|
||||
package kestrel.storage
|
||||
|
||||
data class Row(val values: List<Value>)
|
||||
@@ -0,0 +1,7 @@
|
||||
package kestrel.storage
|
||||
|
||||
import kestrel.catalog.TableSchema
|
||||
|
||||
class Table(val schema: TableSchema) {
|
||||
val rows: MutableList<Row> = mutableListOf()
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package kestrel.storage
|
||||
|
||||
enum class ColumnType {
|
||||
Integer, Text, Boolean, Real;
|
||||
|
||||
val displayName: String
|
||||
get() = when (this) {
|
||||
Integer -> "INTEGER"
|
||||
Text -> "TEXT"
|
||||
Boolean -> "BOOLEAN"
|
||||
Real -> "REAL"
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun fromKeyword(keyword: String): ColumnType? = when (keyword.uppercase()) {
|
||||
"INTEGER" -> Integer
|
||||
"TEXT" -> Text
|
||||
"BOOLEAN" -> Boolean
|
||||
"REAL" -> Real
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sealed class Value {
|
||||
abstract val type: ColumnType?
|
||||
|
||||
data class IntegerValue(val value: Long) : Value() {
|
||||
override val type get() = ColumnType.Integer
|
||||
}
|
||||
|
||||
data class RealValue(val value: Double) : Value() {
|
||||
override val type get() = ColumnType.Real
|
||||
}
|
||||
|
||||
data class TextValue(val value: String) : Value() {
|
||||
override val type get() = ColumnType.Text
|
||||
}
|
||||
|
||||
data class BooleanValue(val value: Boolean) : Value() {
|
||||
override val type get() = ColumnType.Boolean
|
||||
}
|
||||
|
||||
object NullValue : Value() {
|
||||
override val type: ColumnType? get() = null
|
||||
}
|
||||
|
||||
val isNull: Boolean get() = this is NullValue
|
||||
}
|
||||
|
||||
val Value.typeName: String
|
||||
get() = type?.displayName ?: "NULL"
|
||||
@@ -0,0 +1,30 @@
|
||||
package kestrel.storage
|
||||
|
||||
object ValueOrdering : Comparator<Value> {
|
||||
override fun compare(left: Value, right: Value): Int = when {
|
||||
left is Value.NullValue && right is Value.NullValue -> 0
|
||||
left is Value.NullValue -> -1
|
||||
right is Value.NullValue -> 1
|
||||
left is Value.IntegerValue && right is Value.IntegerValue -> left.value.compareTo(right.value)
|
||||
isNumeric(left) && isNumeric(right) -> asDouble(left).compareTo(asDouble(right))
|
||||
left is Value.TextValue && right is Value.TextValue -> left.value.compareTo(right.value)
|
||||
left is Value.BooleanValue && right is Value.BooleanValue -> left.value.compareTo(right.value)
|
||||
else -> rank(left).compareTo(rank(right))
|
||||
}
|
||||
|
||||
private fun isNumeric(value: Value): Boolean = value is Value.IntegerValue || value is Value.RealValue
|
||||
|
||||
private fun asDouble(value: Value): Double = when (value) {
|
||||
is Value.IntegerValue -> value.value.toDouble()
|
||||
is Value.RealValue -> value.value
|
||||
else -> 0.0
|
||||
}
|
||||
|
||||
private fun rank(value: Value): Int = when (value) {
|
||||
is Value.NullValue -> 0
|
||||
is Value.BooleanValue -> 1
|
||||
is Value.IntegerValue -> 2
|
||||
is Value.RealValue -> 2
|
||||
is Value.TextValue -> 3
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user