Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions scheduler/resolvers/resolvers.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
"github.com/thoas/go-funk"
)

func resolveColumn(ctx context.Context, logger zerolog.Logger, m *metrics.Metrics, selector metrics.Selector, client schema.ClientMeta, resource *schema.Resource, column schema.Column, c *caser.Caser, classifier schema.ErrorClassifier) {
func resolveColumn(ctx context.Context, logger zerolog.Logger, m *metrics.Metrics, selector metrics.Selector, client schema.ClientMeta, resource *schema.Resource, column schema.Column, colIndex int, c *caser.Caser, classifier schema.ErrorClassifier) {
columnStartTime := time.Now()
defer func() {
if err := recover(); err != nil {
Expand Down Expand Up @@ -47,7 +47,7 @@ func resolveColumn(ctx context.Context, logger zerolog.Logger, m *metrics.Metric
// base use case: try to get column with CamelCase name
v := funk.Get(resource.GetItem(), c.ToPascal(column.Name), funk.WithAllowZero())
if v != nil {
if err := resource.Set(column.Name, v); err != nil {
if err := resource.SetWithIndex(column.Name, colIndex, v); err != nil {
handleErr(err)
}
}
Expand Down Expand Up @@ -124,8 +124,8 @@ func ResolveResourcesChunkWithClassifier(ctx context.Context, logger zerolog.Log
resources = filtered
}
for _, resource := range resources {
for _, column := range table.Columns {
resolveColumn(ctx, tableLogger, m, selector, client, resource, column, c, classifier)
for colIndex, column := range table.Columns {
resolveColumn(ctx, tableLogger, m, selector, client, resource, column, colIndex, c, classifier)
}
}

Expand Down
20 changes: 16 additions & 4 deletions schema/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,16 @@ func (r *Resource) Set(columnName string, value any) error {
return nil
}

func (r *Resource) SetWithIndex(columnName string, index int, value any) error {
if index < 0 || index >= len(r.Table.Columns) || r.Table.Columns[index].Name != columnName {
return r.Set(columnName, value)
}
if err := r.data[index].Set(value); err != nil {
panic(fmt.Errorf("failed to set column %s: %w", columnName, err))
}
return nil
}

// Override original item (this is useful for apis that follow list/details pattern)
func (r *Resource) SetItem(item any) {
r.Item = item
Expand Down Expand Up @@ -113,22 +123,24 @@ func calculateCqIDValue(r *Resource, cols []string) hash.Hash {
func (r *Resource) storeCQID(value uuid.UUID) error {
// We skip if _cq_id is not present.
// Mostly the problem here is because the transformation step is baked into the resolving step
if r.Table.Columns.Get(CqIDColumn.Name) == nil {
index := r.Table.Columns.Index(CqIDColumn.Name)
if index == -1 {
return nil
}
b, err := value.MarshalBinary()
if err != nil {
return err
}
return r.Set(CqIDColumn.Name, b)
return r.SetWithIndex(CqIDColumn.Name, index, b)
}

func (r *Resource) StoreCQClientID(clientID string) error {
// We skip if _cq_client_id is not present.
if r.Table.Columns.Get(CqClientIDColumn.Name) == nil {
index := r.Table.Columns.Index(CqClientIDColumn.Name)
if index == -1 {
return nil
}
return r.Set(CqClientIDColumn.Name, clientID)
return r.SetWithIndex(CqClientIDColumn.Name, index, clientID)
}

type PKError struct {
Expand Down