Add ordering to name indices
This commit is contained in:
parent
0e5a31db9f
commit
4197b4bb61
@ -3,6 +3,7 @@
|
||||
## Unreleased
|
||||
|
||||
### Added
|
||||
- Name index comparator
|
||||
|
||||
### Changed
|
||||
|
||||
@ -11,6 +12,7 @@
|
||||
### Removed
|
||||
|
||||
### Fixed
|
||||
- `listOfScheme` and `listOfConvertable` delegates provides correct items order
|
||||
|
||||
### Security
|
||||
|
||||
|
@ -8,7 +8,7 @@ plugins {
|
||||
|
||||
allprojects {
|
||||
group = "space.kscience"
|
||||
version = "0.8.0"
|
||||
version = "0.8.1-dev-1"
|
||||
}
|
||||
|
||||
subprojects {
|
||||
|
@ -11,6 +11,7 @@ import space.kscience.dataforge.io.PartDescriptor.Companion.PARTS_KEY
|
||||
import space.kscience.dataforge.io.PartDescriptor.Companion.SEPARATOR_KEY
|
||||
import space.kscience.dataforge.meta.*
|
||||
import space.kscience.dataforge.names.asName
|
||||
import space.kscience.dataforge.names.getIndexedList
|
||||
import space.kscience.dataforge.names.plus
|
||||
|
||||
private class PartDescriptor : Scheme() {
|
||||
@ -84,7 +85,7 @@ public fun EnvelopeBuilder.envelopes(
|
||||
public fun Envelope.parts(): EnvelopeParts {
|
||||
if (data == null) return emptyList()
|
||||
//TODO add zip folder reader
|
||||
val parts = meta.getIndexed(PARTS_KEY).values.map {
|
||||
val parts = meta.getIndexedList(PARTS_KEY).map {
|
||||
PartDescriptor.read(it)
|
||||
}
|
||||
return if (parts.isEmpty()) {
|
||||
|
@ -4,6 +4,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor
|
||||
import space.kscience.dataforge.misc.DFExperimental
|
||||
import space.kscience.dataforge.names.Name
|
||||
import space.kscience.dataforge.names.asName
|
||||
import space.kscience.dataforge.names.getIndexedList
|
||||
import kotlin.properties.ReadWriteProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
@ -65,7 +66,7 @@ public fun <T> MutableMeta.listOfConvertable(
|
||||
): ReadWriteProperty<Any?, List<T>> = object : ReadWriteProperty<Any?, List<T>> {
|
||||
override fun getValue(thisRef: Any?, property: KProperty<*>): List<T> {
|
||||
val name = key ?: property.name.asName()
|
||||
return getIndexed(name).values.map { converter.read(it) }
|
||||
return getIndexedList(name).map { converter.read(it) }
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: List<T>) {
|
||||
|
@ -18,7 +18,7 @@ import kotlin.reflect.KProperty1
|
||||
*/
|
||||
public open class Scheme(
|
||||
private var prototype: Meta? = null,
|
||||
descriptor: MetaDescriptor? = null
|
||||
descriptor: MetaDescriptor? = null,
|
||||
) : Described, MetaRepr, MutableMetaProvider, Configurable {
|
||||
|
||||
/**
|
||||
@ -187,7 +187,7 @@ public open class SchemeSpec<T : Scheme>(
|
||||
it.initialize(MutableMeta(), it.target, descriptor)
|
||||
}
|
||||
|
||||
override fun convert(obj: T): Meta = obj.meta
|
||||
override fun convert(obj: T): Meta = obj.meta
|
||||
|
||||
/**
|
||||
* A convenience method to use specifications in builders
|
||||
@ -197,7 +197,6 @@ public open class SchemeSpec<T : Scheme>(
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Update a [MutableMeta] using given specification
|
||||
*/
|
||||
@ -275,7 +274,7 @@ public fun <T : Scheme> MutableMeta.listOfScheme(
|
||||
): ReadWriteProperty<Any?, List<T>> = object : ReadWriteProperty<Any?, List<T>> {
|
||||
override fun getValue(thisRef: Any?, property: KProperty<*>): List<T> {
|
||||
val name = key ?: property.name.asName()
|
||||
return getIndexed(name).values.map { spec.write(it as MutableMeta) }
|
||||
return getIndexedList(name).map { spec.write(it as MutableMeta) }
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: List<T>) {
|
||||
|
@ -0,0 +1,30 @@
|
||||
package space.kscience.dataforge.names
|
||||
|
||||
import space.kscience.dataforge.meta.Meta
|
||||
import space.kscience.dataforge.meta.getIndexed
|
||||
|
||||
|
||||
/**
|
||||
* A comparator for indices in a [Name]. If both indices are integers, compare them as integers.
|
||||
* Null always stays "before" non-null index.
|
||||
*/
|
||||
public object NameIndexComparator : Comparator<String?> {
|
||||
override fun compare(a: String?, b: String?): Int {
|
||||
if (a == b) return 0
|
||||
if (a == null) return 1
|
||||
if (b == null) return -1
|
||||
val aInt = a.toIntOrNull()
|
||||
val bInt = b.toIntOrNull()
|
||||
return if (aInt != null && bInt != null) {
|
||||
aInt.compareTo(bInt)
|
||||
} else {
|
||||
a.compareTo(b)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public fun Meta.getIndexedList(name: Name): List<Meta> = getIndexed(name).entries.sortedWith(
|
||||
//sort by index
|
||||
compareBy(space.kscience.dataforge.names.NameIndexComparator) { it.key }
|
||||
).map{it.value}
|
@ -17,8 +17,6 @@ class ObservableMetaTest {
|
||||
}
|
||||
}.asObservable()
|
||||
|
||||
println(meta)
|
||||
|
||||
assertEquals("scatter", meta["data.type"].string)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user