Added RS first (#2)
All checks were successful
ci / build (push) Successful in 3m43s

Added the `First` field on the result set proxy
Upgraded UCL to 0.1.0

Co-authored-by: Leon Mika <lmika@lmika.com>
Reviewed-on: #2
Co-authored-by: Leon Mika <lmika@lmika.org>
Co-committed-by: Leon Mika <lmika@lmika.org>
This commit is contained in:
Leon Mika 2025-10-24 06:48:27 +00:00 committed by lmika
parent 213a4fc9cc
commit 022cec7393
5 changed files with 66 additions and 12 deletions

View file

@ -1,8 +1,9 @@
package cmdpacks_test
import (
"github.com/stretchr/testify/assert"
"testing"
"github.com/stretchr/testify/assert"
)
func TestModPB_Copy(t *testing.T) {
@ -10,8 +11,8 @@ func TestModPB_Copy(t *testing.T) {
svc := newService(t)
_, err := svc.CommandController.ExecuteAndWait(t.Context(), `
$items = @resultset.Items
$skItems = $items | map { |i| $i.sk } | lists:uniq
items = @resultset.Items
skItems = $items | map { |i| $i.sk } | lists:uniq
pb:copy ($skItems | strs:join "\n")
`)
assert.NoError(t, err)
@ -23,8 +24,8 @@ func TestModPB_Copy(t *testing.T) {
svc := newService(t)
_, err := svc.CommandController.ExecuteAndWait(t.Context(), `
$items = @resultset.Items
$skItems = $items | map { |i| $i.alpha } | filter !nil | lists:uniq
items = @resultset.Items
skItems = $items | map { |i| $i.alpha } | filter !nil | lists:uniq
pb:copy ($skItems | strs:join "\n")
`)
assert.NoError(t, err)

View file

@ -2,10 +2,11 @@ package cmdpacks_test
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"lmika.dev/cmd/dynamo-browse/internal/common/ui/commandctrl/cmdpacks"
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models"
"github.com/stretchr/testify/assert"
"testing"
)
func TestModRS_New(t *testing.T) {
@ -70,7 +71,7 @@ func TestModRS_Union(t *testing.T) {
svc := newService(t, withDefaultLimit(2))
rsProxy, err := svc.CommandController.ExecuteAndWait(t.Context(), `
$mr = rs:union @resultset (rs:next-page @resultset)
mr = rs:union @resultset (rs:next-page @resultset)
assert (eq (len $mr.Items) 3) "expected len == 3"
assert (eq $mr.Items.(0).pk "abc") "expected 0.pk"
@ -152,3 +153,41 @@ func TestModRS_Query(t *testing.T) {
})
}
}
func TestModRS_First(t *testing.T) {
tests := []struct {
descr string
cmd string
}{
{
descr: "returns the first item in sorted order",
cmd: `
rs = rs:query 'pk="abc"' -table service-test-data
assert (eq $rs.First.pk "abc") "expected First.pk == abc"
assert (eq $rs.First.sk "111") "expected First.sk == 111"
`,
}, {
descr: "returns the first item in single item",
cmd: `
rs = rs:query 'pk="abc" and sk="222"' -table service-test-data
assert (eq $rs.First.pk "abc") "expected First.pk == abc"
assert (eq $rs.First.sk "222") "expected First.sk == 222"
assert (eq $rs.First.beta 1231) "expected First.beta == 1231"
`,
}, {
descr: "returns the first item in empty result",
cmd: `
rs = rs:query 'pk="zzz"' -table service-test-data
assert (eq $rs.First ()) "expected First to be nil"
`,
},
}
for _, tt := range tests {
t.Run(tt.descr, func(t *testing.T) {
svc := newService(t)
_, err := svc.CommandController.ExecuteAndWait(t.Context(), tt.cmd)
assert.NoError(t, err)
})
}
}

View file

@ -2,11 +2,12 @@ package cmdpacks
import (
"fmt"
"maps"
"strconv"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
"github.com/pkg/errors"
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models"
"maps"
"strconv"
"ucl.lmika.dev/ucl"
)
@ -99,6 +100,13 @@ var resultSetProxyFields = &proxyInfo[*models.ResultSet]{
"Table": func(t *models.ResultSet) ucl.Object { return newTableProxy(t.TableInfo) },
"Items": func(t *models.ResultSet) ucl.Object { return resultSetItemsProxy{t} },
"HasNextPage": func(t *models.ResultSet) ucl.Object { return ucl.BoolObject(t.HasNextPage()) },
"First": func(t *models.ResultSet) ucl.Object {
items := t.Items()
if len(items) == 0 {
return nil
}
return itemProxy{resultSet: t, idx: 0, item: items[0]}
},
},
}