/// <summary> /// Конструктор /// </summary> public SQLStruct() { select = new SelectClass(this); from = new FromClass(this); where = new WhereClass(this); As = new AsClass(this); group = new GroupClass(this); }
/// <summary> /// упрощает группировки /// </summary> /// <param name="select">SELECt-класс</param> /// <returns></returns> public bool Simplify(SelectClass select) { //Проверяем наличие всех таблиц... foreach (GroupClassOnce group in grouplist) { //GroupClassOnce.Validate(ds, select); group.Siplify(this.baseSql.select); } return true; }
/// <summary> /// Упрощает группировку и проверят существование колонок в SELECT и пронумеровывает группировки /// </summary> /// <param name="select">Массив колонок</param> /// <param name="array">Массив ValueGroup</param> /// <returns></returns> public bool Siplify(SelectClass select, ArrayList array) { for (int i=0; i<array.Count; i++) { ValueGroup g = (ValueGroup) array[i]; //g.ColumnName = //Смотрим откуда эта колонка. bool Ok = false; for (int j=0;j<select.Count;j++) { if (select.isString(j)) { //проверям имя на совпадение if (select[j] == g.ColumnName) { Ok = true; //Далее проверяем есть ли в текущем group bool ok2= false; for (int k=0;k<this.Count;k++) { if (g.ColumnName == this[k]) ok2 = true; } if (!ok2 && (g.Func == null || g.Func == "")) { //Значит в текущем гроупе этого не найдено,надо искать в предыдущих. int idGroup = baseGroup.GetIdGroup(g.ColumnName); if (idGroup == -1) { throw new Exception("Ошибка, в синтаксисе, не найдено колонки:" + g.ColumnName); } g.idGroup = idGroup; } } } } if (!Ok) { //Значит не совпало, т.е. это имя не из этого Select //Проверяем из какого select-а она //Пробегаем все родительские :) string fullname = GetFullName(this.baseGroup.baseSql.parentSQL, g.ColumnName); if (fullname == null) { throw new NotExistException("GroupClassOne, GetFullName: Ошибка в синтаксисе - не найдено колонки '" + g.ColumnName+ "'"); } //g.ColumnName = fullname; g.FullName = fullname; } } return true; }
/// <summary> /// упрощает по select /// </summary> /// <param name="select"></param> /// <returns></returns> public bool Siplify(SelectClass select) { //нам надо расставаить ссылки на то если у теги в group не из текущего SQL Siplify(select, this.arrayH); Siplify(select, this.arrayF); //Заменяем олл в Group By /*if (isAll) { group.RemoveRange(0,group.Count); for (int i=0;i<select.Count;i++) { if (select.isString(i)) { group.Add(select[i]); } } }*/ //Заменяем олл в Contain/Header/Footer return true; }
/// <summary> /// Пишет SELECT /// </summary> /// <param name="select">SELECT-класс</param> /// <param name="sql">SQL - схема</param> private void WriteSelect(SelectClass select, SQLStruct sql) { //Пишем условие, если у нас стоит тэг ONCE - одна запись for (int i=0;i< select.Count; i++) { if (select.isString(i)) { string node = select[i]; if (select.isKey(node)) continue; string tablename = select.Table(i);//sql.GetTableName(select[i]); string val = "$var_"+ tablename + "/" + select[i]; if (sql.alias.GetColumnAlias(node) != null) { string Col = "$var_"+ tablename + "/" + sql.alias.GetColumnAlias(node).name; //string var_new = "$var_"+ tablename + "/" + select[i]; tw.WriteLine("<" + node + "><xsl:value-of select=\"" + Col + "\"/></" + node + ">"); }else { tw.WriteLine("<" + node + "><xsl:value-of select=\"" + val + "\"/></" + node + ">"); } if (select.IsUsedInChild(i)) { string Col = val; if (sql.alias.GetColumnAlias(node) != null) Col = "$var_"+ tablename + "/" + sql.alias.GetColumnAlias(node).name; tw.WriteLine("<xsl:variable name=\"" + sql.GetSQLUniqueName() +"_select_" + node +"\" select=\"" + Col + "\"/>"); } } else { WriteXSL(select.GetSQL(i), sql.group.Count); } } /*if (select.selectType == SELECTTYPE.ONCE) tw.WriteLine("</xsl:if>");*/ }