perf: support json format viewing for stream values #65

fix: the 'reset' parameter in 'GetKeyDetail' isn't taking effect
This commit is contained in:
Lykin 2023-11-16 00:21:54 +08:00
parent fea87662de
commit cc436ad86f
3 changed files with 49 additions and 37 deletions

View File

@ -2,6 +2,7 @@ package services
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/redis/go-redis/v9"
@ -647,7 +648,11 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
cursor = 0
loadVal, subErr = client.LRange(ctx, key, 0, -1).Result()
} else {
cursor, _ = getEntryCursor()
if param.Reset {
cursor = 0
} else {
cursor, _ = getEntryCursor()
}
scanSize := int64(Preferences().GetScanSize())
loadVal, subErr = client.LRange(ctx, key, int64(cursor), int64(cursor)+scanSize-1).Result()
cursor = cursor + uint64(scanSize)
@ -710,7 +715,11 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
}
}
} else {
cursor, _ = getEntryCursor()
if param.Reset {
cursor = 0
} else {
cursor, _ = getEntryCursor()
}
loadedVal, cursor, subErr = client.HScan(ctx, key, cursor, matchPattern, scanSize).Result()
if subErr != nil {
return nil, false, subErr
@ -768,7 +777,11 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
}
}
} else {
cursor, _ = getEntryCursor()
if param.Reset {
cursor = 0
} else {
cursor, _ = getEntryCursor()
}
loadedKey, cursor, subErr = client.SScan(ctx, key, cursor, param.MatchPattern, scanSize).Result()
items = make([]types.SetEntryItem, len(loadedKey))
for i, val := range loadedKey {
@ -824,7 +837,11 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
}
}
} else {
cursor, _ = getEntryCursor()
if param.Reset {
cursor = 0
} else {
cursor, _ = getEntryCursor()
}
loadedVal, cursor, err = client.ZScan(ctx, key, cursor, param.MatchPattern, scanSize).Result()
loadedLen := len(loadedVal)
items = make([]types.ZSetEntryItem, loadedLen/2)
@ -855,7 +872,6 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
case "stream":
loadStreamHandle := func() ([]types.StreamEntryItem, bool, error) {
var msgs []redis.XMessage
var items []types.StreamEntryItem
var last string
if param.Full {
// load all
@ -863,7 +879,11 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
msgs, err = client.XRevRange(ctx, key, "+", "-").Result()
} else {
scanSize := int64(Preferences().GetScanSize())
_, last = getEntryCursor()
if param.Reset {
last = ""
} else {
_, last = getEntryCursor()
}
if len(last) <= 0 {
last = "+"
}
@ -882,11 +902,15 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS
}
}
setEntryXLast(last)
for _, msg := range msgs {
items = append(items, types.StreamEntryItem{
ID: msg.ID,
Value: msg.Values,
})
items := make([]types.StreamEntryItem, len(msgs))
for i, msg := range msgs {
items[i].ID = msg.ID
items[i].Value = msg.Values
if vb, merr := json.Marshal(msg.Values); merr != nil {
items[i].DisplayValue = "{}"
} else {
items[i].DisplayValue, _, _ = strutil.ConvertTo(string(vb), types.DECODE_NONE, types.FORMAT_JSON)
}
}
if err != nil {
return items, false, err

View File

@ -23,6 +23,7 @@ type ZSetEntryItem struct {
}
type StreamEntryItem struct {
ID string `json:"id"`
Value map[string]any `json:"value"`
ID string `json:"id"`
Value map[string]any `json:"v"`
DisplayValue string `json:"dv,omitempty"`
}

View File

@ -83,26 +83,26 @@ const idColumn = reactive({
const valueColumn = reactive({
key: 'value',
title: i18n.t('common.value'),
align: 'center',
align: 'left',
titleAlign: 'center',
resizable: true,
// ellipsis: {
// tooltip: true,
// },
filterOptionValue: null,
filter(value, row) {
filter: (value, row) => {
const v = value.toString()
if (filterType.value === 1) {
// filter key
return some(keys(row.value), (key) => includes(key, v))
return some(keys(row.v), (key) => includes(key, v))
} else {
// filter value
return some(values(row.value), (val) => includes(val, v))
return some(values(row.v), (val) => includes(val, v))
}
},
// sorter: (row1, row2) => row1.value - row2.value,
// ellipsis: {
// tooltip: true
// },
render: (row) => {
return h(NCode, { language: 'json', wordWrap: true }, { default: () => JSON.stringify(row.value) })
return h(NCode, { language: 'json', wordWrap: true, code: row.dv })
},
})
const actionColumn = {
@ -136,23 +136,10 @@ const actionColumn = {
})
},
}
const columns = reactive([idColumn, valueColumn, actionColumn])
const tableData = computed(() => {
const data = []
if (!isEmpty(props.value)) {
for (const elem of props.value) {
data.push({
id: elem.id,
value: elem.value,
})
}
}
return data
})
const columns = computed(() => [idColumn, valueColumn, actionColumn])
const entries = computed(() => {
const len = size(tableData.value)
const len = size(props.value)
return `${len} / ${Math.max(len, props.length)}`
})
@ -253,7 +240,7 @@ defineExpose({
:bordered="false"
:bottom-bordered="false"
:columns="columns"
:data="tableData"
:data="props.value"
:loading="props.loading"
:single-column="true"
:single-line="false"