[Editor] Add support for executing queries

This commit is contained in:
2021-03-25 16:38:35 +01:00
parent c3c77edadd
commit f6aac2c650
7 changed files with 81 additions and 15 deletions

View File

@@ -0,0 +1,24 @@
package com.bartlomiejpluta.base.editor.database.component
import com.bartlomiejpluta.base.editor.database.model.Field
import com.bartlomiejpluta.base.editor.database.model.Row
import javafx.scene.control.TableCell
class QueryFieldCell : TableCell<Row, Field>() {
override fun updateItem(item: Field?, empty: Boolean) {
super.updateItem(item, empty)
when {
empty || item == null -> {
text = null
graphic = null
}
else -> {
text = item.value
graphic = null
}
}
}
}

View File

@@ -0,0 +1,3 @@
package com.bartlomiejpluta.base.editor.database.model
class Field(val value: String)

View File

@@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.editor.database.model
import tornadofx.getValue
import tornadofx.toProperty
class Query(name: String, val columns: List<String>, val data: List<Map<String, String>>) {
class Query(name: String, val columns: List<String>, val data: List<Row>) {
val nameProperty = name.toProperty()
val name by nameProperty
}

View File

@@ -0,0 +1,3 @@
package com.bartlomiejpluta.base.editor.database.model
class Row(val fields: Map<String, Field>)

View File

@@ -1,19 +1,17 @@
package com.bartlomiejpluta.base.editor.database.view.list
import com.bartlomiejpluta.base.editor.database.component.SQLElementCell
import com.bartlomiejpluta.base.editor.database.model.Query
import com.bartlomiejpluta.base.editor.database.model.SQLDatabase
import com.bartlomiejpluta.base.editor.database.model.SQLElement
import com.bartlomiejpluta.base.editor.database.model.SQLTable
import com.bartlomiejpluta.base.editor.database.model.*
import com.bartlomiejpluta.base.editor.database.model.Field
import com.bartlomiejpluta.base.editor.database.service.DatabaseService
import com.bartlomiejpluta.base.editor.file.model.InMemoryStringFileNode
import com.bartlomiejpluta.base.editor.main.controller.MainController
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.scene.control.TreeItem
import org.kordamp.ikonli.javafx.FontIcon
import tornadofx.*
import java.sql.Connection
import java.sql.SQLException
import tornadofx.*
class TablesListView : View() {
private val mainController: MainController by di()
@@ -90,19 +88,19 @@ class TablesListView : View() {
if (results != null && metadata != null) {
val columns = mutableListOf<String>()
for (i in 1..metadata.columnCount) {
for(i in 1..metadata.columnCount) {
columns += metadata.getColumnLabel(i)
}
val data = mutableListOf<Map<String, String>>()
val data = mutableListOf<Row>()
while (results.next()) {
val record = mutableMapOf<String, String>()
val record = mutableMapOf<String, Field>()
for (i in 1..metadata.columnCount) {
record[metadata.getColumnLabel(i)] = results.getObject(i).toString()
record[metadata.getColumnLabel(i)] = Field(results.getObject(i).toString())
}
data += record
data += Row(record)
}
mainController.openQuery(Query(name, columns, data))

View File

@@ -1,13 +1,46 @@
package com.bartlomiejpluta.base.editor.database.view.query
import tornadofx.View
import tornadofx.borderpane
import tornadofx.toolbar
import com.bartlomiejpluta.base.editor.database.component.QueryFieldCell
import com.bartlomiejpluta.base.editor.database.model.Field
import com.bartlomiejpluta.base.editor.database.model.Row
import com.bartlomiejpluta.base.editor.database.viewmodel.QueryVM
import javafx.scene.control.TableColumn
import tornadofx.*
class QueryResultView : View() {
private val queryVM = find<QueryVM>()
private val table = tableview<Row> {
}
init {
queryVM.itemProperty.addListener { _, _, _ -> refreshData() }
refreshData()
}
private fun refreshData() {
table.columns.clear()
table.items.clear()
queryVM.item?.let { query ->
table.items.addAll(query.data)
query.columns.map { column ->
TableColumn<Row, Field>(column).apply {
setCellValueFactory {
it.value.fields[column].toProperty()
}
setCellFactory { QueryFieldCell() }
}
}.forEach { table.addColumnInternal(it) }
}
}
override val root = borderpane {
top = toolbar {
}
center = table
}
}

View File

@@ -122,8 +122,13 @@ class MainController : Controller() {
fun openQuery(query: Query) {
val findQuery = { q: Query -> q.name == query.name }
val updateQuery = { scope: Scope ->
openItems -= scope
// openItems[scope] = query
// find<QueryVM>(scope).item = query
}
openItem<Query, Scope>(findQuery, {}) {
openItem(findQuery, updateQuery) {
val vm = QueryVM(query)
val scope = Scope()
setInScope(vm, scope)