Skip to content

Commit

Permalink
First working prototype
Browse files Browse the repository at this point in the history
  • Loading branch information
moritzluedtke committed Feb 19, 2021
1 parent 172b662 commit e2d44f4
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 29 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
# ESEF (ElasticSearch Explain Formatter)

## Build project locally
```shell script
# Build for Mac
#rm -r ESEF-0.1-alpha.app
#rm ESEF

fyne package -os darwin # optional: -icon icon.png
```
74 changes: 45 additions & 29 deletions esef.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
package main

import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)

var WindowSize = fyne.NewSize(900, 600)
var DialogSize = fyne.NewSize(800, 500)
var Window fyne.Window

func main() {
buildMainWindow().ShowAndRun()
}

func buildMainWindow() fyne.Window {
application := app.New()
window := application.NewWindow("ESEF - by Moritz Lüdtke")
Window = application.NewWindow("ESEF v0.1 alpha - by Moritz Lüdtke")

inputEntry := widget.NewMultiLineEntry()
inputEntry.Text = GetExplainApiOutputExample()

outputEntry := widget.NewMultiLineEntry()

inputLabel := widget.NewLabel("Input")
Expand All @@ -29,43 +29,59 @@ func buildMainWindow() fyne.Window {
outputLabel := widget.NewLabel("Output")
outputLabel.Alignment = fyne.TextAlignCenter

window.SetContent(container.NewBorder(
Window.SetContent(container.NewBorder(
nil,
widget.NewButtonWithIcon("Format", theme.FileIcon(), func() {
formatInput(inputEntry.Text)
widget.NewButton("Format", func() {
handleFormatButtonClick(inputEntry, outputEntry)
}),
nil,
nil,
container.NewAdaptiveGrid(
2,
container.NewBorder(
inputLabel,
nil,
nil,
nil,
inputEntry,
),
container.NewBorder(
outputLabel,
widget.NewButton("Copy", func() {

}),
nil,
nil,
outputEntry,
),
buildInputArea(inputLabel, inputEntry),
buildOutputArea(outputLabel, outputEntry),
),
),
)

application.Settings().SetTheme(theme.LightTheme())
Window.Resize(WindowSize)
Window.CenterOnScreen()

return Window
}

func buildOutputArea(outputLabel *widget.Label, outputEntry *widget.Entry) *fyne.Container {
return container.NewBorder(
outputLabel,
widget.NewButton("Copy", func() {
handleCopyOutputButtonClick(outputEntry.Text)
}),
nil,
nil,
outputEntry,
)
}

func buildInputArea(inputLabel *widget.Label, inputEntry *widget.Entry) *fyne.Container {
return container.NewBorder(
inputLabel,
nil,
nil,
nil,
inputEntry,
)
}

func handleFormatButtonClick(inputEntry *widget.Entry, outputEntry *widget.Entry) {
outputEntry.SetText(formatInputString(inputEntry.Text))
}

window.Resize(WindowSize)
window.CenterOnScreen()
func handleCopyOutputButtonClick(output string) {
Window.Clipboard().SetContent(output)

return window
fyne.CurrentApp().SendNotification(fyne.NewNotification("ESEF", "Copied output to clipboard!"))
}

func formatInput(input string) {
fmt.Println(input)
func formatInputString(input string) string {
return ExtractDataFromExplainAPI(input)
}
37 changes: 37 additions & 0 deletions extractor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package main

import (
"encoding/json"
)

type ExplainAPIDocument struct {
Index string `json:"_index"`
Type string `json:"_type"`
DocumentId string `json:"_id"`
Matched bool `json:"matched"`
Explanation ExplainNode `json:"explanation"`
}

type ExplainNode struct {
Value float64 `json:"value"`
Description string `json:"description"`
Details []ExplainNode `json:"details"`
}

func ExtractDataFromExplainAPI(explainAPIOutput string) string {
doc := extractDocumentFromJson(explainAPIOutput)

return FormatExplainApiDocument(doc)
}

func extractDocumentFromJson(inputJson string) ExplainAPIDocument {
var explainAPIDocument ExplainAPIDocument
byteData := []byte(inputJson)
err := json.Unmarshal(byteData, &explainAPIDocument)

if err != nil {
return ExplainAPIDocument{}
}

return explainAPIDocument
}
31 changes: 31 additions & 0 deletions formatter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package main

import (
"fmt"
"strings"
)

const TAB = " "

func FormatExplainApiDocument(doc ExplainAPIDocument) string {
explanation := formatExplainNodes(0, doc.Explanation)

return fmt.Sprintf("index: %s\ndocumentId: %s\nmatched: %t\nexplanation:\n%s",
doc.Index, doc.DocumentId, doc.Matched, explanation)
}

func formatExplainNodes(treeLevel int, nodes ...ExplainNode) string {
indentation := strings.Repeat(TAB, treeLevel)
treeLevel++
var result string

for _, node := range nodes {
result += fmt.Sprintf(indentation+"%f (%s)\n", node.Value, node.Description)

if len(node.Details) > 0 {
result += formatExplainNodes(treeLevel, node.Details...)
}
}

return result
}

0 comments on commit e2d44f4

Please sign in to comment.