Ejemplo n.º 1
0
        // We peek at the table expression to compute the set of columns of the join
        static SQuery _Join(ReaderBase f)
        {
            f.GetInt();
            var st       = f.buf.pos;
            var d        = SDict <int, (long, string)> .Empty;
            var c        = SDict <int, Serialisable> .Empty;
            var nms      = SDict <string, long> .Empty;
            var left     = f._Get() as SQuery ?? throw new StrongException("Query expected");
            var outer    = f.GetInt() == 1;
            var joinType = (JoinType)f.GetInt();
            var right    = f._Get() as SQuery ?? throw new StrongException("Query expected");
            var ab       = left.Display.First();
            var uses     = SDict <long, long> .Empty;

            if (joinType.HasFlag(JoinType.Named))
            {
                var n = f.GetInt();
                for (var i = 0; i < n; i++)
                {
                    uses += (f.GetLong(), f.GetLong());
                }
            }
            var k = 0;

            for (var lb = left.cpos.First(); ab != null && lb != null; ab = ab.Next(), lb = lb.Next())
            {
                var col = lb.Value;
                var u   = ab.Value.Item2;
                d   += (k, u);
                c   += (k, col.Item2);
                nms += (u.Item2, u.Item1);
                k++;
            }
            ab = right.Display.First();
            for (var rb = right.cpos.First(); ab != null && rb != null; ab = ab.Next(), rb = rb.Next())
            {
                var u = ab.Value.Item2;
                var n = u.Item2;
                if (joinType == JoinType.Natural && nms.Contains(n))
                {
                    continue;
                }
                if (uses.Contains(u.Item1))
                {
                    continue;
                }
                var col = rb.Value;
                d += (k, u);
                c += (k, col.Item2);
                k++;
            }
            f.buf.pos = st;
            return(new SQuery(Types.STableExp, d, c));
        }
Ejemplo n.º 2
0
        public readonly SDict <long, long> uses; // Item1 is for RIGHT, Item2 for LEFT
        public SJoin(ReaderBase f) : base(Types.STableExp, _Join(f))
        {
            left     = f._Get() as SQuery ?? throw new StrongException("Query expected");
            outer    = f.GetInt() == 1;
            joinType = (JoinType)f.GetInt();
            right    = f._Get() as SQuery ?? throw new StrongException("Query expected");
            var n   = f.GetInt();
            var on  = SList <SExpression> .Empty;
            var us  = SDict <long, long> .Empty;
            var tr  = (STransaction)f.db;
            var lns = SDict <string, long> .Empty;

            for (var b = left.Display.First(); b != null; b = b.Next())
            {
                lns += (b.Value.Item2.Item2, b.Value.Item2.Item1);
            }
            var rns = SDict <string, long> .Empty;

            for (var b = right.Display.First(); b != null; b = b.Next())
            {
                var nm = b.Value.Item2.Item2;
                if (joinType == JoinType.Natural && lns.Contains(nm))
                {
                    us += (b.Value.Item2.Item1, lns[nm]);
                }
                rns += (nm, b.Value.Item2.Item1);
            }
            if (joinType.HasFlag(JoinType.Named))
            {
                for (var i = 0; i < n; i++)
                {
                    var nm = tr.uids[f.GetLong()];
                    if (!(lns.Contains(nm) && rns.Contains(nm)))
                    {
                        throw new StrongException("name " + nm + " not present in Join");
                    }
                    us += (rns[nm], lns[nm]);
                }
            }
            else if (!joinType.HasFlag(JoinType.Cross))
            {
                for (var i = 0; i < n; i++)
                {
                    var e = f._Get() as SExpression
                            ?? throw new StrongException("ON exp expected");
                    on += e;
                }
            }
            ons       = on;
            uses      = us;
            f.context = this;
        }
Ejemplo n.º 3
0
        void CreateColumn(ReaderBase rdr)
        {
            var sc = (SColumn)rdr._Get();
            var db = (STransaction)rdr.db;

            sc = (SColumn)sc.Prepare(db, ((STable)db.objects[sc.table]).Names(db, SDict <long, long> .Empty));
            var cn = db.role[sc.uid];

            rdr.db = db.Install(new SColumn(db, sc.table, sc.dataType, sc.constraints), cn, db.curpos);
        }