Пример #1
0
        // 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");
            }
        }
Пример #2
0
 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),
     });
 }
Пример #3
0
 public AstType TupType(AstType type)
 {
     if (!type.DataType.HasHeading)
     {
         Parser.ParseError("value has no heading");
     }
     return(new AstType {
         DataType = DataTypeTuple.Get(type.DataType.Heading)
     });
 }
Пример #4
0
 internal DataType Tupof(DataHeading heading)
 {
     return(DataTypeTuple.Get(heading));
 }
Пример #5
0
 internal DataType Tupof(DataType type)
 {
     return(DataTypeTuple.Get(type.Heading));
 }