示例#1
0
        internal string CreateSqlCondition(ColumnDisplay disp, ISqlDialect dialect, IDmlfHandler handler, bool includeUserInput)
        {
            if (disp != null)
            {
                m_lastColumnDisplay = disp;
            }
            if (TableData == null)
            {
                return("");
            }
            List <string> conds = new List <string>();

            if (includeUserInput && !Filter.IsEmpty())
            {
                conds.Add("(" + Filter + ")");
            }
            if (AdditionalCondition != null)
            {
                conds.Add("(" + AdditionalCondition.ToSql(dialect, handler) + ")");
            }
            if (TableData.TabDataCaps.Filtering && !SearchText.IsEmpty())
            {
                conds.Add(CreateSearchCondition(disp, dialect, handler));
            }
            if (conds.Count == 0)
            {
                return("");
            }
            return(String.Join(" AND ", conds.ToArray()));
        }
示例#2
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     foreach (var rel in this)
     {
         rel.GenSql(dmp, handler);
     }
 }
示例#3
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     Expr.GenSql(dmp, handler);
     if (m_alias != null)
     {
         dmp.Put(" ^as %i", m_alias);
     }
 }
示例#4
0
        //public static List<string> GetBaseColumns(this IEnumerable<DmlfColumnRef> cols)
        //{
        //    var res = new List<string>();
        //    foreach (var col in cols)
        //    {
        //        if (col.Source != null && col.Source.Alias != "basetbl") continue;
        //        res.Add(col.ColumnName);
        //    }
        //    return res;
        //}

        //public static int GetBaseOrdinal(this IEnumerable<DmlfColumnRef> cols, string colname)
        //{
        //    int index = 0;
        //    foreach (var col in cols)
        //    {
        //        if (col.Source == null || col.Source.Alias == "basetbl")
        //        {
        //            if (col.ColumnName == colname) return index;
        //        }
        //        index++;
        //    }
        //    return -1;
        //}

        public static string ToSql(this IDmlfNode node, ISqlDialect dialect, IDmlfHandler handler)
        {
            var sw  = new StringWriter();
            var dmp = dialect.CreateDumper(sw);

            node.GenSql(dmp, handler);
            return(sw.ToString());
        }
示例#5
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     if (Condition != null)
     {
         dmp.Put("&n^where &>");
         Condition.GenSql(dmp, handler);
         dmp.Put("&<");
     }
 }
示例#6
0
 public void GenSqlDef(ISqlDumper dmp, IDmlfHandler handler)
 {
     if (TableOrView != null)
     {
         dmp.Put("%f", TableOrView);
     }
     if (Alias != null)
     {
         dmp.Put(" %i", Alias);
     }
 }
示例#7
0
        public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
        {
            var src = Source;

            if (src == null)
            {
                src = handler.BaseTable;
            }
            dmp.Put("&n^from &>");
            src.GenSqlDef(dmp, handler);
            dmp.Put(" ");
            Relations.GenSql(dmp, handler);
            dmp.Put("&<");
        }
示例#8
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     dmp.Put("^select ");
     Columns.GenSql(dmp, handler);
     From.GenSql(dmp, handler);
     if (Where != null)
     {
         Where.GenSql(dmp, handler);
     }
     if (OrderBy != null)
     {
         OrderBy.GenSql(dmp, handler);
     }
 }
示例#9
0
        public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
        {
            JoinType.GenSql(dmp);
            dmp.Put("&n");
            Reference.GenSqlDef(dmp, handler);
            dmp.Put(" ^on ");
            bool was = false;

            foreach (var cond in Conditions)
            {
                if (was)
                {
                    dmp.Put(" ^and ");
                }
                cond.GenSql(dmp, handler);
                was = true;
            }
        }
示例#10
0
 public bool GenSqlRef(ISqlDumper dmp, IDmlfHandler handler)
 {
     if (Alias != null)
     {
         dmp.Put("%i", Alias);
         return(true);
     }
     else if (TableOrView != null)
     {
         dmp.Put("%f", TableOrView);
         return(true);
     }
     else if (handler != null && handler.BaseTable != null && handler.BaseTable != this)
     {
         return(handler.BaseTable.GenSqlRef(dmp, handler));
     }
     return(false);
 }
示例#11
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     if (Source != null)
     {
         if (Source.GenSqlRef(dmp, handler))
         {
             dmp.Put(".");
         }
     }
     else if (handler != null)
     {
         var b = handler.BaseTable;
         if (b != null)
         {
             b.GenSqlRef(dmp, handler);
             dmp.Put(".");
         }
     }
     dmp.Put("%i", ColumnName);
 }
示例#12
0
        public virtual void GenSql(ISqlDumper dmp, IDmlfHandler handler)
        {
            dmp.Put("&>");
            bool was = false;

            foreach (var item in this)
            {
                if (was)
                {
                    dmp.Put(",&n");
                }
                else
                {
                    dmp.Put("&n");
                }
                item.GenSql(dmp, handler);
                was = true;
            }
            dmp.Put("&<");
        }
示例#13
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     if (Conditions.Count == 0)
     {
         GenSqlEmpty(dmp);
     }
     else
     {
         GenSqlBegin(dmp);
         bool was = false;
         foreach (var item in Conditions)
         {
             if (was)
             {
                 GenSqlConjuction(dmp);
             }
             GenSqlItem(item, dmp, handler);
             was = true;
         }
         GenSqlEnd(dmp);
     }
 }
示例#14
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     LeftExpr.GenSql(dmp, handler);
     dmp.Put(" ^like ");
     RightExpr.GenSql(dmp, handler);
 }
示例#15
0
        /// <summary>
        /// adds primary key information to query definition, or marks columns as read only, of no PK is available
        /// </summary>
        /// <param name="handler">used for obtain table structures with PKs</param>
        public void CompleteUpdatingInfo(IDmlfHandler handler)
        {
            var pks          = new Dictionary <DmlfSource, IPrimaryKey>();
            var required_pks = new Dictionary <DmlfSource, IPrimaryKey>();
            // list of columns
            var usedcols = new HashSetEx <DmlfColumnRef>();

            foreach (var col in Columns)
            {
                var di = col.DisplayInfo;
                if (di == null)
                {
                    continue;
                }
                var tbl = col.Source;
                if (tbl == null)
                {
                    tbl = handler.BaseTable;
                }
                if (tbl == null)
                {
                    continue;
                }
                var cr = col.Expr as DmlfColumnRefExpression;
                if (cr == null)
                {
                    di.IsReadOnly = true;
                    continue;
                }
                if (!pks.ContainsKey(tbl))
                {
                    pks[tbl] = null;
                    if (handler != null)
                    {
                        var ts = handler.GetStructure(tbl.TableOrView);
                        if (ts != null)
                        {
                            pks[tbl] = ts.FindConstraint <IPrimaryKey>();
                        }
                    }
                }
                var pk = pks[tbl];
                if (pk == null)
                {
                    // no primary key, is readonly
                    di.IsReadOnly = true;
                    continue;
                }
                var pkcols = new List <string>(pk.Columns.GetNames());
                if (pkcols.Contains(cr.Column.ColumnName))
                {
                    di.IsPrimaryKey = true;
                }
                usedcols.Add(new DmlfColumnRef {
                    Source = tbl, ColumnName = cr.Column.ColumnName
                });
                if (di.Style == ColumnDisplayInfo.UsageStyle.Value)
                {
                    required_pks[tbl] = pk;
                }
                if (di.Style == ColumnDisplayInfo.UsageStyle.Lookup)
                {
                    di.IsReadOnly = true;
                }
            }

            // add missing primary key columns as hidden columns
            foreach (var pkt in required_pks)
            {
                foreach (string col in pkt.Value.Columns.GetNames())
                {
                    var key = new DmlfColumnRef {
                        Source = pkt.Key, ColumnName = col
                    };
                    if (usedcols.Contains(key))
                    {
                        continue;
                    }
                    usedcols.Add(key);
                    var nc = new DmlfResultField
                    {
                        DisplayInfo = new ColumnDisplayInfo
                        {
                            IsPrimaryKey = true,
                            Style        = ColumnDisplayInfo.UsageStyle.Hidden,
                        },
                        Expr = new DmlfColumnRefExpression
                        {
                            Column = new DmlfColumnRef
                            {
                                Source     = pkt.Key,
                                ColumnName = col,
                            }
                        }
                    };
                    Columns.Add(nc);
                }
            }
        }
示例#16
0
        private string CreateSearchCondition(ColumnDisplay disp, ISqlDialect dialect, IDmlfHandler handler)
        {
            if (disp == null)
            {
                disp = m_lastColumnDisplay;
            }
            if (disp == null)
            {
                return("1=1");
            }
            bool          was = false;
            StringBuilder res = new StringBuilder();
            //ITableStructure table = TableData.GetStructure(Perspective);
            var dda   = dialect.CreateDataAdapter();
            var spars = new FulltextSearchParams {
                ExactMatch = SearchExactMatch
            };

            foreach (var col in disp)
            {
                var cs = (IColumnStructure)col.ValueTag;
                if (cs == null)
                {
                    continue;
                }
                if (cs.DataType is DbTypeXml || cs.DataType is DbTypeBlob)
                {
                    continue;
                }
                if (SearchColumns != null && Array.IndexOf(SearchColumns, col.ValueRef.ToString()) < 0)
                {
                    continue;
                }
                if (was)
                {
                    res.Append(" OR ");
                }
                res.Append(dda.GetFulltextSearchExpr(col.ValueRef.Expr.ToSql(dialect, handler), SearchText, spars));
                //res.AppendFormat("{0} LIKE {1}", dialect.QuoteIdentifier(col.ColumnName), dialect.GetSqlLiteral("%" + SearchText + "%"));
                was = true;
            }
            if (!was)
            {
                res.Append("1=1");
            }
            return("(" + res.ToString() + ")");
        }
示例#17
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     Expr.GenSql(dmp, handler);
     dmp.Put(" ");
     OrderType.GenSql(dmp);
 }
示例#18
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     Column.GenSql(dmp, handler);
 }
示例#19
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     dmp.Put("%v", Value);
 }
示例#20
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     dmp.WriteRaw(Value);
 }
示例#21
0
 public void GenSqlCount(ISqlDumper dmp, IDmlfHandler handler)
 {
     dmp.Put("^select ^count(*) ");
     From.GenSql(dmp, handler);
 }
示例#22
0
 public override void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     dmp.Put("1=0");
 }
示例#23
0
 public virtual void GenSql(ISqlDumper dmp, IDmlfHandler handler)
 {
     throw new NotImplementedError("DAE-00105");
 }
示例#24
0
 public static DmlfColumnRef FindColumn(this IEnumerable <DmlfSource> tables, string name, IDmlfHandler handler)
 {
     name = (name ?? "").Trim();
     foreach (var tbl in tables)
     {
         var ts = handler.GetStructure(tbl == null ? null : tbl.TableOrView);
         foreach (var col in ts.Columns)
         {
             if (tbl != null)
             {
                 string fullname = tbl.AliasOrName + "." + col.ColumnName;
                 if (String.Compare(fullname, name, true) == 0)
                 {
                     return new DmlfColumnRef
                            {
                                Source     = tbl,
                                ColumnName = col.ColumnName
                            }
                 }
                 ;
             }
             if (String.Compare(col.ColumnName, name, true) == 0)
             {
                 return new DmlfColumnRef
                        {
                            Source     = tbl,
                            ColumnName = col.ColumnName
                        }
             }
             ;
         }
     }
     return(null);
 }
示例#25
0
 public virtual void GenSqlItem(DmlfConditionBase item, ISqlDumper dmp, IDmlfHandler handler)
 {
     item.GenSql(dmp, handler);
 }