[Editor] Add support for executing queries
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.database.model
|
||||||
|
|
||||||
|
class Field(val value: String)
|
||||||
@@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.editor.database.model
|
|||||||
import tornadofx.getValue
|
import tornadofx.getValue
|
||||||
import tornadofx.toProperty
|
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 nameProperty = name.toProperty()
|
||||||
val name by nameProperty
|
val name by nameProperty
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.database.model
|
||||||
|
|
||||||
|
class Row(val fields: Map<String, Field>)
|
||||||
@@ -1,19 +1,17 @@
|
|||||||
package com.bartlomiejpluta.base.editor.database.view.list
|
package com.bartlomiejpluta.base.editor.database.view.list
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.editor.database.component.SQLElementCell
|
import com.bartlomiejpluta.base.editor.database.component.SQLElementCell
|
||||||
import com.bartlomiejpluta.base.editor.database.model.Query
|
import com.bartlomiejpluta.base.editor.database.model.*
|
||||||
import com.bartlomiejpluta.base.editor.database.model.SQLDatabase
|
import com.bartlomiejpluta.base.editor.database.model.Field
|
||||||
import com.bartlomiejpluta.base.editor.database.model.SQLElement
|
|
||||||
import com.bartlomiejpluta.base.editor.database.model.SQLTable
|
|
||||||
import com.bartlomiejpluta.base.editor.database.service.DatabaseService
|
import com.bartlomiejpluta.base.editor.database.service.DatabaseService
|
||||||
import com.bartlomiejpluta.base.editor.file.model.InMemoryStringFileNode
|
import com.bartlomiejpluta.base.editor.file.model.InMemoryStringFileNode
|
||||||
import com.bartlomiejpluta.base.editor.main.controller.MainController
|
import com.bartlomiejpluta.base.editor.main.controller.MainController
|
||||||
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||||
import javafx.scene.control.TreeItem
|
import javafx.scene.control.TreeItem
|
||||||
import org.kordamp.ikonli.javafx.FontIcon
|
import org.kordamp.ikonli.javafx.FontIcon
|
||||||
import tornadofx.*
|
|
||||||
import java.sql.Connection
|
import java.sql.Connection
|
||||||
import java.sql.SQLException
|
import java.sql.SQLException
|
||||||
|
import tornadofx.*
|
||||||
|
|
||||||
class TablesListView : View() {
|
class TablesListView : View() {
|
||||||
private val mainController: MainController by di()
|
private val mainController: MainController by di()
|
||||||
@@ -90,19 +88,19 @@ class TablesListView : View() {
|
|||||||
if (results != null && metadata != null) {
|
if (results != null && metadata != null) {
|
||||||
val columns = mutableListOf<String>()
|
val columns = mutableListOf<String>()
|
||||||
|
|
||||||
for (i in 1..metadata.columnCount) {
|
for(i in 1..metadata.columnCount) {
|
||||||
columns += metadata.getColumnLabel(i)
|
columns += metadata.getColumnLabel(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
val data = mutableListOf<Map<String, String>>()
|
val data = mutableListOf<Row>()
|
||||||
while (results.next()) {
|
while (results.next()) {
|
||||||
val record = mutableMapOf<String, String>()
|
val record = mutableMapOf<String, Field>()
|
||||||
|
|
||||||
for (i in 1..metadata.columnCount) {
|
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))
|
mainController.openQuery(Query(name, columns, data))
|
||||||
|
|||||||
@@ -1,13 +1,46 @@
|
|||||||
package com.bartlomiejpluta.base.editor.database.view.query
|
package com.bartlomiejpluta.base.editor.database.view.query
|
||||||
|
|
||||||
import tornadofx.View
|
import com.bartlomiejpluta.base.editor.database.component.QueryFieldCell
|
||||||
import tornadofx.borderpane
|
import com.bartlomiejpluta.base.editor.database.model.Field
|
||||||
import tornadofx.toolbar
|
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() {
|
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 {
|
override val root = borderpane {
|
||||||
top = toolbar {
|
top = toolbar {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
center = table
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,8 +122,13 @@ class MainController : Controller() {
|
|||||||
|
|
||||||
fun openQuery(query: Query) {
|
fun openQuery(query: Query) {
|
||||||
val findQuery = { q: Query -> q.name == query.name }
|
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 vm = QueryVM(query)
|
||||||
val scope = Scope()
|
val scope = Scope()
|
||||||
setInScope(vm, scope)
|
setInScope(vm, scope)
|
||||||
|
|||||||
Reference in New Issue
Block a user