// check dyadic ops and compute result type void CheckDyadicType(Symbol sym, DataType datatype1, DataType datatype2, ref DataType datatype) { var joinop = sym.JoinOp; if (datatype1 is DataTypeRelation && datatype2 is DataTypeRelation) { var cols = DataColumn.Merge(Symbol.ToMergeOp(joinop), datatype1.Heading.Columns, datatype2.Heading.Columns); var dups = cols.GroupBy(c => c.Name).Where(g => g.Count() > 1).Select(g => g.Key).ToArray(); if (dups.Length > 0) { Parser.ParseError($"{sym.Name}: duplicate attribute: {dups.Join(",")}"); } datatype = DataTypeRelation.Get(DataHeading.Create(cols)); } else if (datatype1 is DataTypeTuple && datatype2 is DataTypeTuple) { var cols = DataColumn.Merge(Symbol.ToTupleOp(joinop), datatype1.Heading.Columns, datatype2.Heading.Columns); var dups = cols.GroupBy(c => c.Name).Where(g => g.Count() > 1).Select(g => g.Key).ToArray(); if (dups.Length > 0) { Parser.ParseError($"{sym.Name}: duplicate attribute: {dups.Join(",")}"); } datatype = DataTypeTuple.Get(DataHeading.Create(cols)); } else { Parser.ParseError($"{sym.Name}: expected relational or tuple arguments"); } }
public AstValue Row(AstValue value) { if (!value.DataType.HasHeading) { Parser.ParseError("value has no heading"); } return(new AstTabCall { Func = FindFunc(SymNames.RowC), DataType = DataTypeTuple.Get(value.DataType.Heading), Arguments = Args(value), }); }
public AstType TupType(AstType type) { if (!type.DataType.HasHeading) { Parser.ParseError("value has no heading"); } return(new AstType { DataType = DataTypeTuple.Get(type.DataType.Heading) }); }
internal DataType Tupof(DataHeading heading) { return(DataTypeTuple.Get(heading)); }
internal DataType Tupof(DataType type) { return(DataTypeTuple.Get(type.Heading)); }