Skip to content

Commit b9cbdad

Browse files
authored
Fix a bug in edireader a missing optional elem would cause subsequent elem parsing fail (#109)
Imagine a seg `ISA*e2` (elem delim is `'*'`). Imagine the elem decl is: ``` { "name": "e1", "index": 1, "empty_if_missing": true }, { "name": "e2", "index": 2 } ``` Now e1 is optional, thus schema writer specifies "empty_if_missing". However the current single-linear-scan in `ediReader.rawSegToNode` will scan all the way to the end, thus causing the subsequent `e2` scanning to fail.
1 parent 2369d89 commit b9cbdad

File tree

4 files changed

+6
-35
lines changed

4 files changed

+6
-35
lines changed

extensions/omniv21/fileformat/edi/.snapshots/TestValidateSchema-success

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
"name": "ISA",
88
"is_target": true,
99
"elements": [
10-
{
11-
"name": "e1",
12-
"index": 1
13-
},
1410
{
1511
"name": "e2",
1612
"index": 2
13+
},
14+
{
15+
"name": "e1",
16+
"index": 1
1717
}
1818
]
1919
}

extensions/omniv21/fileformat/edi/reader.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,9 @@ func (r *ediReader) rawSegToNode(segDecl *segDecl) (*idr.Node, error) {
250250
panic("unprocessedRawSeg is not valid")
251251
}
252252
n := idr.CreateNode(idr.ElementNode, segDecl.Name)
253-
// Note: we assume segDecl.Elems are sorted by elemIndex/compIndex.
254-
rawElemIndex := 0
255253
rawElems := r.unprocessedRawSeg.elems
256254
for _, elemDecl := range segDecl.Elems {
255+
rawElemIndex := 0
257256
for ; rawElemIndex < len(rawElems); rawElemIndex++ {
258257
if rawElems[rawElemIndex].elemIndex == elemDecl.Index &&
259258
rawElems[rawElemIndex].compIndex == elemDecl.compIndex() {

extensions/omniv21/fileformat/edi/validate.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package edi
33
import (
44
"errors"
55
"fmt"
6-
"sort"
76

87
"github.com/jf-tech/go-corelib/strs"
98
)
@@ -36,7 +35,6 @@ func (ctx *ediValidateCtx) validateSegDecl(segFQDN string, segDecl *segDecl) err
3635
}
3736
ctx.seenTarget = true
3837
}
39-
ctx.sortElems(segFQDN, segDecl.Elems)
4038
if segDecl.isGroup() && len(segDecl.Children) <= 0 {
4139
return fmt.Errorf("segment_group '%s' must have at least one child segment/segment_group", segFQDN)
4240
}
@@ -48,12 +46,3 @@ func (ctx *ediValidateCtx) validateSegDecl(segFQDN string, segDecl *segDecl) err
4846
}
4947
return nil
5048
}
51-
52-
func (ctx *ediValidateCtx) sortElems(segFQDN string, elems []elem) {
53-
// For now there is no validation for []elem. The only validation time processing we need to
54-
// do is to ensure Index/CompIndex are sorted.
55-
sort.SliceStable(elems, func(i, j int) bool {
56-
return elems[i].Index < elems[j].Index ||
57-
(elems[i].Index == elems[j].Index && elems[i].compIndex() < elems[j].compIndex())
58-
})
59-
}

extensions/omniv21/fileformat/edi/validate_test.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,6 @@ import (
88
"github.com/stretchr/testify/assert"
99
)
1010

11-
func collectSegDeclsFQDNs(segDecls []*segDecl) map[string]interface{} {
12-
if len(segDecls) == 0 {
13-
return nil
14-
}
15-
m := map[string]interface{}{}
16-
for _, seg := range segDecls {
17-
m[seg.Name] = struct {
18-
FQDN string
19-
Children map[string]interface{}
20-
}{
21-
FQDN: seg.fqdn,
22-
Children: collectSegDeclsFQDNs(seg.Children),
23-
}
24-
}
25-
return m
26-
}
27-
2811
func TestValidateFileDecl_Empty(t *testing.T) {
2912
err := (&ediValidateCtx{}).validateFileDecl(&fileDecl{})
3013
assert.Error(t, err)
@@ -78,5 +61,5 @@ func TestValidateFileDecl_Success(t *testing.T) {
7861
assert.Equal(t, "A", fd.SegDecls[0].fqdn)
7962
assert.Nil(t, fd.SegDecls[0].Elems)
8063
assert.Equal(t, "A/B", fd.SegDecls[0].Children[0].fqdn)
81-
assert.Equal(t, []elem{elem1, elem2, elem3}, fd.SegDecls[0].Children[0].Elems)
64+
assert.Equal(t, []elem{elem3, elem1, elem2}, fd.SegDecls[0].Children[0].Elems)
8265
}

0 commit comments

Comments
 (0)