diff --git a/internal/dynamo-browse/controllers/tableread.go b/internal/dynamo-browse/controllers/tableread.go index 8021e9a..b994eb0 100644 --- a/internal/dynamo-browse/controllers/tableread.go +++ b/internal/dynamo-browse/controllers/tableread.go @@ -74,8 +74,9 @@ func (c *TableReadController) ScanTable(name string) tea.Cmd { if err != nil { return events.Error(err) } + resultSet = c.tableService.Filter(resultSet, c.state.Filter()) - return c.setResultSetAndFilter(resultSet, c.state.Filter()) + return c.setResultSetAndFilter(resultSet, c.state.Filter(), true) } } @@ -88,32 +89,33 @@ func (c *TableReadController) PromptForQuery() tea.Cmd { return c.runQuery(c.state.ResultSet().TableInfo, value, "", true) } - /* - if value == "" { - return func() tea.Msg { - resultSet := c.state.ResultSet() - return c.doScan(context.Background(), resultSet, nil) - } - } - - expr, err := queryexpr.Parse(value) - if err != nil { - return events.SetError(err) - } - - return c.doIfNoneDirty(func() tea.Msg { - resultSet := c.state.ResultSet() - newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr) - if err != nil { - return events.Error(err) - } - - if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil { - log.Printf("cannot push snapshot: %v", err) - } - return c.setResultSetAndFilter(newResultSet, "") - }) - */ + //if value == "" { + // return func() tea.Msg { + // resultSet := c.state.ResultSet() + // if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil { + // log.Printf("cannot push snapshot: %v", err) + // } + // return c.doScan(context.Background(), resultSet, nil) + // } + //} + // + //expr, err := queryexpr.Parse(value) + //if err != nil { + // return events.SetError(err) + //} + // + //return c.doIfNoneDirty(func() tea.Msg { + // resultSet := c.state.ResultSet() + // newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr) + // if err != nil { + // return events.Error(err) + // } + // + // if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil { + // log.Printf("cannot push snapshot: %v", err) + // } + // return c.setResultSetAndFilter(newResultSet, "") + //}) }, } } @@ -129,7 +131,8 @@ func (c *TableReadController) runQuery(tableInfo *models.TableInfo, query, newFi if newFilter != "" { newResultSet = c.tableService.Filter(newResultSet, newFilter) } - return c.setResultSetAndFilter(newResultSet, newFilter) + + return c.setResultSetAndFilter(newResultSet, newFilter, pushSnapshot) } expr, err := queryexpr.Parse(query) @@ -138,21 +141,15 @@ func (c *TableReadController) runQuery(tableInfo *models.TableInfo, query, newFi } return c.doIfNoneDirty(func() tea.Msg { - resultSet := c.state.ResultSet() newResultSet, err := c.tableService.ScanOrQuery(context.Background(), tableInfo, expr) if err != nil { return events.Error(err) } - if pushSnapshot { - if err := c.workspaceService.PushSnapshot(resultSet, c.state.Filter()); err != nil { - log.Printf("cannot push snapshot: %v", err) - } - } if newFilter != "" { newResultSet = c.tableService.Filter(newResultSet, newFilter) } - return c.setResultSetAndFilter(newResultSet, newFilter) + return c.setResultSetAndFilter(newResultSet, newFilter, pushSnapshot) }) } @@ -182,7 +179,7 @@ func (c *TableReadController) Rescan() tea.Cmd { return func() tea.Msg { return c.doIfNoneDirty(func() tea.Msg { resultSet := c.state.ResultSet() - return c.doScan(context.Background(), resultSet, resultSet.Query) + return c.doScan(context.Background(), resultSet, resultSet.Query, true) }) } } @@ -222,19 +219,24 @@ func (c *TableReadController) ExportCSV(filename string) tea.Cmd { } } -func (c *TableReadController) doScan(ctx context.Context, resultSet *models.ResultSet, query models.Queryable) tea.Msg { +func (c *TableReadController) doScan(ctx context.Context, resultSet *models.ResultSet, query models.Queryable, pushBackstack bool) tea.Msg { newResultSet, err := c.tableService.ScanOrQuery(ctx, resultSet.TableInfo, query) if err != nil { return events.Error(err) } - c.workspaceService.PushSnapshot(resultSet, c.state.Filter()) newResultSet = c.tableService.Filter(newResultSet, c.state.Filter()) - return c.setResultSetAndFilter(newResultSet, c.state.Filter()) + return c.setResultSetAndFilter(newResultSet, c.state.Filter(), pushBackstack) } -func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string) tea.Msg { +func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string, pushBackstack bool) tea.Msg { + if pushBackstack { + if err := c.workspaceService.PushSnapshot(resultSet, filter); err != nil { + log.Printf("cannot push snapshot: %v", err) + } + } + c.state.setResultSetAndFilter(resultSet, filter) return c.state.buildNewResultSetMessage("") } @@ -257,11 +259,9 @@ func (c *TableReadController) Filter() tea.Cmd { OnDone: func(value string) tea.Cmd { return func() tea.Msg { resultSet := c.state.ResultSet() - - c.workspaceService.PushSnapshot(resultSet, c.state.Filter()) newResultSet := c.tableService.Filter(resultSet, value) - return c.setResultSetAndFilter(newResultSet, value) + return c.setResultSetAndFilter(newResultSet, value, true) } }, } @@ -288,7 +288,7 @@ func (c *TableReadController) ViewBack() tea.Cmd { log.Printf("backstack: setting filter to '%v'", viewSnapshot.Filter) newResultSet := c.tableService.Filter(currentResultSet, viewSnapshot.Filter) - return c.setResultSetAndFilter(newResultSet, viewSnapshot.Filter) + return c.setResultSetAndFilter(newResultSet, viewSnapshot.Filter, false) } tableInfo := currentResultSet.TableInfo diff --git a/internal/dynamo-browse/controllers/tablewrite.go b/internal/dynamo-browse/controllers/tablewrite.go index 61958a1..5f79d7d 100644 --- a/internal/dynamo-browse/controllers/tablewrite.go +++ b/internal/dynamo-browse/controllers/tablewrite.go @@ -400,7 +400,7 @@ func (twc *TableWriteController) NoisyTouchItem(idx int) tea.Cmd { return events.Error(err) } - return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query) + return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query, false) } }, } @@ -431,7 +431,7 @@ func (twc *TableWriteController) DeleteMarked() tea.Cmd { return events.Error(err) } - return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query) + return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query, false) } }, } diff --git a/internal/dynamo-browse/services/workspaces/service.go b/internal/dynamo-browse/services/workspaces/service.go index 540494a..34854dc 100644 --- a/internal/dynamo-browse/services/workspaces/service.go +++ b/internal/dynamo-browse/services/workspaces/service.go @@ -47,9 +47,8 @@ func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error) vs, err := s.store.Head() if err != nil { return nil, errors.Wrap(err, "cannot get snapshot head") - } - if vs == nil { - return vs, nil + } else if vs == nil || vs.BackLink == 0 { + return nil, nil } if err := s.store.SetAsHead(vs.BackLink); err != nil { @@ -59,5 +58,12 @@ func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error) return nil, errors.Wrap(err, "cannot remove old ID") } + vs, err = s.store.Head() + if err != nil { + return nil, errors.Wrap(err, "cannot get snapshot head") + } else if vs == nil || vs.BackLink == 0 { + return nil, nil + } + return vs, nil }