Add Reference/Collections

This commit is contained in:
2024-05-06 19:35:03 +02:00
parent 6bf4811110
commit 7a8d1cac62
12 changed files with 360 additions and 145 deletions

View File

@@ -2,11 +2,12 @@ package nl.astraeus.persistence
import nl.astraeus.nl.astraeus.persistence.Persistable
import nl.astraeus.nl.astraeus.persistence.Persistent
import nl.astraeus.nl.astraeus.persistence.Reference
import nl.astraeus.nl.astraeus.persistence.TransactionLog
import nl.astraeus.nl.astraeus.persistence.currentTransaction
import nl.astraeus.nl.astraeus.persistence.find
import nl.astraeus.nl.astraeus.persistence.findByIndex
import nl.astraeus.nl.astraeus.persistence.index
import nl.astraeus.nl.astraeus.persistence.reference.ReferenceCollection
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertNull
import java.io.File
@@ -19,7 +20,11 @@ class TestPersistence {
override var version: Long = 0,
val name: String
) : Persistable, Cloneable {
//var persons: MutableList<Person> by ListReference<Person, Company>(Person::class.java)
val personIds: MutableList<Long> = ArrayList()
val persons: MutableCollection<Person>
get() {
return ReferenceCollection(Person::class.java, personIds)
}
companion object {
private const val serialVersionUID: Long = 1L
@@ -35,15 +40,23 @@ class TestPersistence {
override var version: Long = 0,
val name: String,
val age: Int,
private var companyId: Long? = null
) : Persistable, Cloneable {
var company: Company by Reference<Company, Person>(Company::class.java)
var company: Company?
get() = currentTransaction()?.find(Company::class, companyId ?: 0L)
set(value) {
if (value != null) {
currentTransaction()?.store(value)
}
companyId = value?.id
}
companion object {
private const val serialVersionUID: Long = 1L
}
override fun toString(): String {
return "Person(id=$id, version=$version, name='$name', age=$age)"
return "Person(id=$id, version=$version, name='$name', age=$age, company=$companyId)"
}
}

View File

@@ -0,0 +1,92 @@
package nl.astraeus.persistence
import nl.astraeus.nl.astraeus.persistence.Persistable
import nl.astraeus.nl.astraeus.persistence.Persistent
import nl.astraeus.nl.astraeus.persistence.TransactionLog
import nl.astraeus.nl.astraeus.persistence.currentTransaction
import nl.astraeus.nl.astraeus.persistence.reference.referenceCollection
import java.io.File
import kotlin.test.Test
class TestReferences {
class Company(
override var id: Long = 0,
override var version: Long = 0,
val name: String
) : Persistable, Cloneable {
val persons: MutableCollection<Person> = referenceCollection()
companion object {
private const val serialVersionUID: Long = 1L
}
override fun toString(): String {
return "Company(id=$id, version=$version, name='$name', persons=${persons.size})"
}
}
class Person(
override var id: Long = 0,
override var version: Long = 0,
val name: String,
val age: Int,
private var companyId: Long? = null
) : Persistable, Cloneable {
var company: Company?
get() = currentTransaction()?.find(Company::class, companyId ?: 0L)
set(value) {
if (value != null) {
currentTransaction()?.store(value)
}
companyId = value?.id
}
companion object {
private const val serialVersionUID: Long = 1L
}
override fun toString(): String {
return "Person(id=$id, version=$version, name='$name', age=$age, company=$companyId)"
}
}
@Test
fun showTransactions() {
val log = TransactionLog(File("data", "test-references"))
log.showTransactions()
}
@Test
fun testSerializeDeSerializeReferenceList() {
val pst = Persistent(
directory = File("data", "test-references"),
)
pst.transaction {
val company = find(Company::class, 1L) ?: Company(
id = 1L,
name = "ACME"
)
if (company.persons.isEmpty()) {
val person = Person(
id = 0L,
name = "John Doe",
age = 25
)
person.company = company
store(person)
company.persons.add(person)
}
store(company)
for (person in company.persons) {
println("Person: $person")
}
}
}
}

View File

@@ -2,7 +2,7 @@ package nl.astraeus.persistence
import nl.astraeus.nl.astraeus.persistence.Persistable
import nl.astraeus.nl.astraeus.persistence.Persistent
import nl.astraeus.nl.astraeus.persistence.Reference
import nl.astraeus.nl.astraeus.persistence.reference.Reference
import nl.astraeus.nl.astraeus.persistence.TransactionLog
import nl.astraeus.nl.astraeus.persistence.count
import nl.astraeus.nl.astraeus.persistence.index
@@ -36,8 +36,13 @@ class TestThreaded {
override var version: Long = 0,
val name: String,
val age: Int,
var companyId: Long? = null
) : Persistable, Cloneable {
var company: Company by Reference<Company, Person>(Company::class.java)
var company: Company? by Reference(
Company::class.java,
{ id -> companyId = id },
{ companyId }
)
companion object {
private const val serialVersionUID: Long = 1L