Skip to content

Commit

Permalink
mlr reorder with regex support for field-name selection
Browse files Browse the repository at this point in the history
  • Loading branch information
johnkerl committed Jan 21, 2024
1 parent ac65675 commit dcde4c6
Showing 1 changed file with 101 additions and 16 deletions.
117 changes: 101 additions & 16 deletions pkg/transformers/reorder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"container/list"
"fmt"
"os"
"regexp"
"strings"

"github.com/johnkerl/miller/pkg/cli"
Expand Down Expand Up @@ -61,6 +62,7 @@ func transformerReorderParseCLI(
argi++

var fieldNames []string = nil
doRegexes := false
putAtEnd := false
beforeFieldName := ""
afterFieldName := ""
Expand All @@ -82,6 +84,10 @@ func transformerReorderParseCLI(
} else if opt == "-f" {
fieldNames = cli.VerbGetStringArrayArgOrDie(verb, opt, args, &argi, argc)

} else if opt == "-r" {
fieldNames = cli.VerbGetStringArrayArgOrDie(verb, opt, args, &argi, argc)
doRegexes = true

} else if opt == "-b" {
beforeFieldName = cli.VerbGetStringArgOrDie(verb, opt, args, &argi, argc)
afterFieldName = ""
Expand Down Expand Up @@ -115,6 +121,7 @@ func transformerReorderParseCLI(

transformer, err := NewTransformerReorder(
fieldNames,
doRegexes,
putAtEnd,
beforeFieldName,
afterFieldName,
Expand All @@ -132,6 +139,7 @@ type TransformerReorder struct {
// input
fieldNames []string
fieldNamesSet map[string]bool
regexes []*regexp.Regexp
beforeFieldName string
afterFieldName string

Expand All @@ -141,6 +149,7 @@ type TransformerReorder struct {

func NewTransformerReorder(
fieldNames []string,
doRegexes bool,
putAtEnd bool,
beforeFieldName string,
afterFieldName string,
Expand All @@ -164,6 +173,23 @@ func NewTransformerReorder(
lib.ReverseStringList(tr.fieldNames)
}

if doRegexes {
tr.regexes = make([]*regexp.Regexp, len(fieldNames))
for i, regexString := range fieldNames {
// Handles "a.*b"i Miller case-insensitive-regex specification
regex, err := lib.CompileMillerRegex(regexString)
if err != nil {
fmt.Fprintf(
os.Stderr,
"%s %s: cannot compile regex [%s]\n",
"mlr", verbNameCut, regexString,
)
os.Exit(1)
}
tr.regexes[i] = regex
}
}

return tr, nil
}

Expand All @@ -188,10 +214,39 @@ func (tr *TransformerReorder) reorderToStart(
) {
if !inrecAndContext.EndOfStream {
inrec := inrecAndContext.Record
for _, fieldName := range tr.fieldNames {
inrec.MoveToHead(fieldName)

if tr.regexes == nil {
for _, fieldName := range tr.fieldNames {
inrec.MoveToHead(fieldName)
}
outputRecordsAndContexts.PushBack(inrecAndContext)

} else {
outrec := mlrval.NewMlrmapAsRecord()
atEnds := list.New()

Check failure on line 226 in pkg/transformers/reorder.go

View workflow job for this annotation

GitHub Actions / Codespell

atEnds ==> attends
for pe := inrec.Head; pe != nil; pe = pe.Next {
found := false
for _, regex := range tr.regexes {
if regex.MatchString(pe.Key) {
outrec.PutReference(pe.Key, pe.Value)
found = true
break
}
}
if !found {
atEnds.PushBack(pe)

Check failure on line 237 in pkg/transformers/reorder.go

View workflow job for this annotation

GitHub Actions / Codespell

atEnds ==> attends
}
}

for atEnd := atEnds.Front(); atEnd != nil; atEnd = atEnd.Next() {

Check failure on line 241 in pkg/transformers/reorder.go

View workflow job for this annotation

GitHub Actions / Codespell

atEnds ==> attends
// Ownership transfer; no copy needed
pe := atEnd.Value.(*mlrval.MlrmapEntry)
outrec.PutReference(pe.Key, pe.Value)
}

outrecAndContext := types.NewRecordAndContext(outrec, &inrecAndContext.Context)
outputRecordsAndContexts.PushBack(outrecAndContext)
}
outputRecordsAndContexts.PushBack(inrecAndContext)

} else {
outputRecordsAndContexts.PushBack(inrecAndContext) // end-of-stream marker
Expand All @@ -207,10 +262,38 @@ func (tr *TransformerReorder) reorderToEnd(
) {
if !inrecAndContext.EndOfStream {
inrec := inrecAndContext.Record
for _, fieldName := range tr.fieldNames {
inrec.MoveToTail(fieldName)
if tr.regexes == nil {
for _, fieldName := range tr.fieldNames {
inrec.MoveToTail(fieldName)
}
outputRecordsAndContexts.PushBack(inrecAndContext)

} else {
outrec := mlrval.NewMlrmapAsRecord()
atEnds := list.New()

Check failure on line 273 in pkg/transformers/reorder.go

View workflow job for this annotation

GitHub Actions / Codespell

atEnds ==> attends
for pe := inrec.Head; pe != nil; pe = pe.Next {
found := false
for _, regex := range tr.regexes {
if regex.MatchString(pe.Key) {
atEnds.PushBack(pe)

Check failure on line 278 in pkg/transformers/reorder.go

View workflow job for this annotation

GitHub Actions / Codespell

atEnds ==> attends
found = true
break
}
}
if !found {
outrec.PutReference(pe.Key, pe.Value)
}
}

for atEnd := atEnds.Front(); atEnd != nil; atEnd = atEnd.Next() {

Check failure on line 288 in pkg/transformers/reorder.go

View workflow job for this annotation

GitHub Actions / Codespell

atEnds ==> attends
// Ownership transfer; no copy needed
pe := atEnd.Value.(*mlrval.MlrmapEntry)
outrec.PutReference(pe.Key, pe.Value)
}

outrecAndContext := types.NewRecordAndContext(outrec, &inrecAndContext.Context)
outputRecordsAndContexts.PushBack(outrecAndContext)
}
outputRecordsAndContexts.PushBack(inrecAndContext)
} else {
outputRecordsAndContexts.PushBack(inrecAndContext) // end-of-stream marker
}
Expand Down Expand Up @@ -240,8 +323,12 @@ func (tr *TransformerReorder) reorderBefore(
if pe.Key == tr.beforeFieldName {
break
}
if !tr.fieldNamesSet[pe.Key] {
outrec.PutReference(pe.Key, pe.Value)
if tr.regexes == nil {
if !tr.fieldNamesSet[pe.Key] {
outrec.PutReference(pe.Key, pe.Value)
}
} else {
// XXX TO DO
}
}

Expand All @@ -258,14 +345,15 @@ func (tr *TransformerReorder) reorderBefore(
}

for ; pe != nil; pe = pe.Next {
if pe.Key != tr.beforeFieldName && !tr.fieldNamesSet[pe.Key] {
outrec.PutReference(pe.Key, pe.Value)
if tr.regexes == nil {
if pe.Key != tr.beforeFieldName && !tr.fieldNamesSet[pe.Key] {
outrec.PutReference(pe.Key, pe.Value)
}
} else {
// XXX TO DO
}
}

for _, fieldName := range tr.fieldNames {
inrec.MoveToHead(fieldName)
}
outputRecordsAndContexts.PushBack(types.NewRecordAndContext(outrec, &inrecAndContext.Context))

} else {
Expand Down Expand Up @@ -320,9 +408,6 @@ func (tr *TransformerReorder) reorderAfter(
}
}

for _, fieldName := range tr.fieldNames {
inrec.MoveToHead(fieldName)
}
outputRecordsAndContexts.PushBack(types.NewRecordAndContext(outrec, &inrecAndContext.Context))

} else {
Expand Down

0 comments on commit dcde4c6

Please sign in to comment.