MCPcopy Create free account
hub / github.com/brimdata/super / toMap

Method toMap

runtime/sam/expr/function/cast.go:206–241  ·  view source on GitHub ↗
(from super.Value, to *super.TypeMap)

Source from the content-addressed store, hash-verified

204}
205
206func (c *cast) toMap(from super.Value, to *super.TypeMap) (super.Value, bool) {
207 fromType, ok := from.Type().(*super.TypeMap)
208 if !ok {
209 return c.error(from, to)
210 }
211 keyTypes := map[super.Type]struct{}{}
212 valTypes := map[super.Type]struct{}{}
213 var keyVals, valVals []super.Value
214 aok := true
215 for it := from.ContainerIter(); !it.Done(); {
216 keyVal, ok := c.castNext(&it, fromType.KeyType, to.KeyType)
217 aok = aok && ok
218 keyVals = append(keyVals, keyVal)
219 keyTypes[keyVal.Type()] = struct{}{}
220 valVal, ok := c.castNext(&it, fromType.ValType, to.ValType)
221 aok = aok && ok
222 valTypes[valVal.Type()] = struct{}{}
223 valVals = append(valVals, valVal)
224 }
225 if len(keyVals) == 0 {
226 return super.NewValue(to, from.Bytes()), aok
227 }
228 keyType, ok := c.maybeConvertToUnion(keyVals, keyTypes)
229 aok = aok && ok
230 valType, ok := c.maybeConvertToUnion(valVals, valTypes)
231 aok = aok && ok
232 if keyType != to.KeyType || valType != to.ValType {
233 to = c.sctx.LookupTypeMap(keyType, valType)
234 }
235 var bytes scode.Bytes
236 for i := range keyVals {
237 bytes = scode.Append(bytes, keyVals[i].Bytes())
238 bytes = scode.Append(bytes, valVals[i].Bytes())
239 }
240 return super.NewValue(to, super.NormalizeMap(bytes)), aok
241}
242
243func (c *cast) toUnion(from super.Value, to *super.TypeUnion) (super.Value, bool) {
244 tag := bestUnionTag(from.Type(), to)

Callers 1

CastMethod · 0.95

Calls 11

errorMethod · 0.95
castNextMethod · 0.95
maybeConvertToUnionMethod · 0.95
NewValueFunction · 0.92
AppendFunction · 0.92
NormalizeMapFunction · 0.92
ContainerIterMethod · 0.80
LookupTypeMapMethod · 0.80
TypeMethod · 0.65
DoneMethod · 0.45
BytesMethod · 0.45

Tested by

no test coverage detected