diff --git a/src/gossie/mapping.go b/src/gossie/mapping.go index 0b88a06..36063cd 100644 --- a/src/gossie/mapping.go +++ b/src/gossie/mapping.go @@ -159,7 +159,7 @@ func (m *sparseMapping) MarshalComponent(component interface{}, position int) ([ return b, nil } -func (m *sparseMapping) startMap(source interface{}) (*Row, *reflect.Value, *structInspection, []byte, error) { +func (m *sparseMapping) startMap(source interface{}, compact bool) (*Row, *reflect.Value, *structInspection, []byte, error) { v, si, err := validateAndInspectStruct(source) if err != nil { return nil, nil, nil, nil, err @@ -179,24 +179,37 @@ func (m *sparseMapping) startMap(source interface{}) (*Row, *reflect.Value, *str } // prepare composite, if needed - composite := make([]byte, 0) - for _, c := range m.components { + var composite []byte + if compact && len(m.components) == 1 { + c := m.components[0] if f, found := si.goFields[c]; found { - b, err := f.marshalValue(v) + composite, err = f.marshalValue(v) if err != nil { return nil, nil, nil, nil, err } - composite = append(composite, packComposite(b, eocEquals)...) } else { return nil, nil, nil, nil, errors.New(fmt.Sprint("Mapping component field ", c, " not found in passed struct of type ", v.Type().Name())) } + } else { + composite = make([]byte, 0) + for _, c := range m.components { + if f, found := si.goFields[c]; found { + b, err := f.marshalValue(v) + if err != nil { + return nil, nil, nil, nil, err + } + composite = append(composite, packComposite(b, eocEquals)...) + } else { + return nil, nil, nil, nil, errors.New(fmt.Sprint("Mapping component field ", c, " not found in passed struct of type ", v.Type().Name())) + } + } } return row, v, si, composite, nil } func (m *sparseMapping) Map(source interface{}) (*Row, error) { - row, v, si, composite, err := m.startMap(source) + row, v, si, composite, err := m.startMap(source, false) if err != nil { return nil, err } @@ -375,7 +388,7 @@ func (m *compactMapping) Cf() string { } func (m *compactMapping) Map(source interface{}) (*Row, error) { - row, v, si, composite, err := m.startMap(source) + row, v, si, composite, err := m.startMap(source, true) if err != nil { return nil, err } @@ -408,12 +421,24 @@ func (m *compactMapping) Unmap(destination interface{}, provider RowProvider) er return err } - components, err := m.extractComponents(column, v, 0) - if err != nil { - return err - } - if err := m.unmapComponents(v, si, components); err != nil { - return err + if len(m.components) == 1 { + c := m.components[0] + if f, found := si.goFields[c]; found { + err := f.unmarshalValue(column.Name, v) + if err != nil { + return err + } + } else { + return errors.New(fmt.Sprint("Mapping component field ", c, " not found in passed struct of type ", v.Type().Name())) + } + } else { + components, err := m.extractComponents(column, v, 0) + if err != nil { + return err + } + if err := m.unmapComponents(v, si, components); err != nil { + return err + } } if f, found := si.goFields[m.value]; found { err := f.unmarshalValue(column.Value, v) diff --git a/src/gossie/query.go b/src/gossie/query.go index d5d50b5..647d6d5 100644 --- a/src/gossie/query.go +++ b/src/gossie/query.go @@ -164,7 +164,23 @@ func (q *query) buildSlice(reader Reader) error { components = append(components, q.betweenStart) } - if len(components) > 0 { + if _, ok := q.mapping.(*compactMapping); ok && len(q.components) == 1 { + if len(components) == 1 { + c := components[0] + b, err := q.mapping.MarshalComponent(c, 0) + if err != nil { + return err + } + start = b + end = b + } else if q.betweenEnd != nil { + b, err := q.mapping.MarshalComponent(q.betweenEnd, 0) + if err != nil { + return err + } + end = b + } + } else if len(components) > 0 { last := len(components) - 1 for i, c := range components { b, err := q.mapping.MarshalComponent(c, i)