/// <summary> /// 使用临时表形式,生成更新若干数据对象语句, /// 要求数据库拥有<see cref="EDbCapable.TemporaryTable"/> /// 和<see cref="EDbCapable.ModifyJoin"/>两个特性 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="content">更新表达式。</param> /// <returns>语句片段。</returns> protected virtual SqlFragment GenerateForUpdateTempTable(GenerateContext context, DbExpression content) { var data = (GenerateDataForUpdate)context.Data; var name = data.TargetName; var block = new BlockFragment(context); UpdateFragment mainUpdate = null; TemporaryTableFragment temptable = null; var members = data.GetTables().SelectMany(a => a.Members); foreach (var unit in data.GetUnits()) { TemporaryTableFragment current = null; if (temptable == null) { current = new TemporaryTableFragment(context, members); } else { current = new TemporaryTableFragment(context, temptable.Name, members); } GenerateForUpdateRegister(context, content, current); var metadata = unit.Table; var update = new UpdateFragment(context, metadata, name); update.AddSource(update.Target, current); GenerateForUpdateMembers(context, unit, update, current); update.Target.Join(current, metadata.Keys.Concat(metadata.Concurrencys)); block.Add(update); if (unit == data.MainUnit) { mainUpdate = update; } if (temptable == null) { temptable = current; } else { current.Members.ForEach(m => temptable.GetMember(m.Property)); } } block.Insert(0, GenerateCreateTemplateTable(context, temptable, data.CommitObject, data.Items)); if (data.ReturnMembers.Any()) { var target = data.SubUnits == null ? mainUpdate.Target : new InheritFragment(context, data.Table); var select = new SelectFragment(context, target); select.Members.AddRange(data.ReturnMembers.Select(a => target.GetMember(a.Metadata))); var datatable = temptable.Clone(); select.AddSource(datatable); target.Join(datatable, data.Table.Keys); block.Add(select); data.GenerateOutput(); } data.SetConcurrencyExpectCount(data.TableCount + 1); return(block); }
/// <summary> /// 根据指定类型<see cref="DbCollectionMemberExpression"/>表达式创建虚拟数据源列表语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="source">虚拟数据源</param> /// <returns>查询语句片段。</returns> public virtual SelectFragment CreateVirtualListForCollectionMember(GenerateContext context, VirtualSourceFragment source) { var content = (DbCollectionMemberExpression)source.Expression; var target = GetSource(context, content.TargetSet.Item); var container = source.Container; if (container.IsRecommandLock) { container = container.Parent as SelectFragment; } var list = new SelectFragment(context, target); if (content.Metadata.IsComposite) { GenerateVirtualCompositeJoinForCollectionMember(context, content, list, true); } container.AddSource(list); GenerateVirtualJoinForCollectionMember(context, source, list, false); list.RetrievalMembers(content.TargetSet.Item, false); if (IsSelectFragment(content)) { context.RegisterTempSource(content.Item, target, delegate() { list = InitialSelectFragment(list, content); }); } return(list); }
/// <summary> /// 根据指定类型<see cref="DbGroupByExpression"/>表达式创建虚拟数据源列表语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="source">虚拟数据源</param> /// <returns>查询语句片段。</returns> public virtual SelectFragment CreateVirtualListForGroupBy(GenerateContext context, VirtualSourceFragment source) { var content = (DbGroupByExpression)source.Expression; var target = source.Source; var body = source.GetBody(); var list = new SelectFragment(context, target); var container = source.Container; if (container.IsRecommandLock) { container = container.Parent as SelectFragment; } container.AddSource(list); list.RetrievalMembers(content.Source.Item, false); list.Join = EJoinType.InnerJoin; list.Condition = body.Members.OfType <ReferenceMemberFragment>().Select(member => { var left = list.Members.OfType <ReferenceMemberFragment>().Where(a => a.Reference == member.Reference).Single(); return(new BinaryFragment(context, EBinaryKind.Equal) { Left = left, Right = ValidateMember(context, member, container, null, true) }); }).Merge(); return(list); }
private void WriteFragmentForSelectSimple(SqlWriter writer, SelectFragment select, string rownumber = "") { writer.Write("SELECT"); if (select.Distinct) { writer.Write(" DISTINCT"); } if (select.Take > 0 && select.Skip <= 0) { writer.Write(" TOP "); writer.Write(select.Take); } writer.WriteLine(); WriteFragmentForSelectMembers(writer, select.Members); if (!string.IsNullOrEmpty(rownumber)) { writer.Write(", ROW_NUMBER() OVER ( "); WriteFragmentForOrderBy(writer, select.Sorts); writer.Write(" ) AS "); writer.Write(rownumber); } WriteFragmentForFrom(writer, select.Sources); WriteFragmentForWhere(writer, select.Where); WriteFragmentForGroupBy(writer, select.GroupBys); if (string.IsNullOrEmpty(rownumber)) { WriteFragmentForOrderBy(writer, select.Sorts); } }
public void ThenRedirectingToMerchantSteps(string user, string password, string paymentSource, string amount) { DriverManager.GetWebDriver().Navigate().GoToUrl(TestConfiguration.Current.MerchantUrl); //Заполнение формы мерчанта new DataGridComponent(SearchElementByCss(MerchantPayForm)) .ClearText(PartnerId) .SendText(PartnerId, "58") .SendText(partner_secret, "WQ7kQvMGp5+9KT6BaGBL") .SendText(OrderIdLocator, OrderId) .ClearText(Amount) .SendText(Amount, amount) .SendText(Currency, "Usd") .SendText(Details, "this is details") .ClickOnElement(Submit); //Ожидание формы ввода логина пароля WaitElementIsVisibleByCss(LoginForm); new DataGridComponent(SearchElementByCss(LoginForm)) .SendText(Login, user) .SendText(Password, password) .ClickByText("Войти", "", ""); //Выбор способа оплаты - (кошелек/карта) SelectFragment.SetOptionByFieldName("Способ оплаты", "USD", $" [label *= '{paymentSource}']"); _context.Grid = new DataGridComponent(SearchElementByCss(ConfirmationCodeLocator)); }
/// <summary> /// 根据指定类型<see cref="DbInnerJoinExpression"/>表达式创建数据源语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="expression">指定表达式。</param> /// <returns>创建结果。</returns> protected virtual ISourceFragment CreateSourceForInnerJoin(GenerateContext context, DbExpression expression) { var content = (DbInnerJoinExpression)expression; var source = CreateSource(context, content.Source); var target = CreateSource(context, content.Target); if (source is SelectFragment select) { if (select.IsRecommandLock) { select = new SelectFragment(context, source); } } else { select = new SelectFragment(context, source); } select.AddSource(target); if (IsSelectFragment(content)) { InitialSelectFragment(select, content); } target.Join = EJoinType.InnerJoin; target.Condition = content.KeyPairs.Select(a => select.CreateExpression(a)).Merge(); return(select); }
private void WriteFragmentForSelectSkip(SqlWriter writer, SelectFragment select, string rownumber, Action action, bool islistmember = false) { var alias = select.Context.GetDataSourceAlias(); if (islistmember) { writer.Write("SELECT "); select.Members.ForEach(() => writer.Write(", "), member => { writer.Write(alias); writer.Write('.'); WriteDbName(writer, member.OutputName); }); writer.Write(" FROM ( "); } else { writer.Write("SELECT * FROM ( "); } action(); writer.Write(" ) "); writer.Write(alias); writer.Write(" WHERE "); writer.Write(alias); writer.Write('.'); writer.Write(rownumber); writer.Write(" > "); writer.Write(select.Skip); }
protected override void AddDiscriminatorToSelect(SelectFragment select, string name, string suffix) { if (HasSubclasses) { select.SetExtraSelectList(DiscriminatorFragment(name), DiscriminatorAlias); } }
private string ManyToManySelectFragment( IJoinable rhs, string rhsAlias, string lhsAlias, string collectionSuffix, IAssociationType elementType) { SelectFragment frag = GenerateSelectFragment(lhsAlias, collectionSuffix); // We need to select in the associated entity table instead of taking the collection actual element, // because filters can be applied to the entity table outer join. In such case, we need to return null // for filtered-out elements. (It is tempting to switch to an inner join and just use // SelectFragment(lhsAlias, collectionSuffix) for many-to-many too, but this would hinder the proper // handling of the not-found feature.) var elementColumnNames = string.IsNullOrEmpty(elementType.RHSUniqueKeyPropertyName) ? rhs.KeyColumnNames // rhs is the entity persister, it does not handle being referenced through an unique key by a // collection and always yield its identifier columns as KeyColumnNames. We need to resolve the // key columns instead. // 6.0 TODO: consider breaking again that IJoinable.SelectFragment interface for transmitting // the OuterJoinableAssociation instead of its Joinable property. This would allow to get the // adequate columns directly instead of re-computing them. : ((IPropertyMapping)rhs).ToColumns(elementType.RHSUniqueKeyPropertyName); frag.AddColumns(rhsAlias, elementColumnNames, elementColumnAliases); AppendIndexColumns(frag, lhsAlias); AppendIdentifierColumns(frag, lhsAlias); return(frag.ToSqlStringFragment(false)); }
private void GenerateForInsertReturnStatement(GenerateContext context, BlockFragment block, ISourceFragment target, TemporaryTableFragment temptable) { var data = (GenerateDataForInsert)context.Data; if (data.ReturnMembers.Any()) { if (data.SubUnits != null) { target = new InheritFragment(context, data.Table); } var select = new SelectFragment(context, target); select.Members.AddRange(data.ReturnMembers.Select(a => target.GetMember(a.Metadata))); if (temptable == null) { select.Where = target.JoinCondition(data.CommitObject, data.Table.Keys); } else { var datatable = temptable.Clone(); select.AddSource(datatable); target.Join(datatable, data.Table.Keys); } block.Add(select); } }
/// <summary> /// 生成更新单个数据对象语句。 /// </summary> /// <param name="context">生成上下文</param> /// <param name="content">更新表达式。</param> /// <returns>语句片段。</returns> protected virtual SqlFragment GenerateForUpdateSingle(GenerateContext context, DbExpression content) { var data = (GenerateDataForUpdate)context.Data; var block = new BlockFragment(context); UpdateFragment mainUpdate = null; var name = data.TargetName; GenerateForUpdateRegister(context, content, data.CommitObject); foreach (var unit in data.GetUnits()) { var metadata = unit.Table; var update = new UpdateFragment(context, metadata, name); data.CommitObject.Parent = update; GenerateForUpdateMembers(context, unit, update, data.CommitObject); update.Where = update.Target.JoinCondition(data.CommitObject, metadata.Keys.Union(metadata.Concurrencys)); block.Add(update); if (unit == data.MainUnit) { mainUpdate = update; } } if (data.ReturnMembers.Any()) { var target = data.SubUnits == null ? mainUpdate.Target : new InheritFragment(context, data.Table); var select = new SelectFragment(context, target); select.Members.AddRange(data.ReturnMembers.Select(a => target.GetMember(a.Metadata))); select.Where = target.JoinCondition(data.CommitObject, data.Table.Keys); block.Add(select); data.GenerateOutput(); } data.SetConcurrencyExpectCount(data.TableCount); return(block); }
/// <summary> /// 创建通过主键及值关联的返回数据语句片段。 /// </summary> /// <param name="unit">内容对象。</param> /// <param name="target">目标对象。</param> /// <returns>语句片段。</returns> internal static SelectFragment SelectReturns(this IContentUnit unit, ISourceFragment target) { var data = (ContentBase)unit; var context = data.GenerateContext; var select = new SelectFragment(context, target); select.Members.AddRange(unit.ReturnMembers.Select(a => target.GetMember(a.Metadata))); select.Where = target.JoinCondition(data.CommitObject, data.Table.Keys); return(select); }
protected override void AddDiscriminatorToSelect(SelectFragment select, string name, string suffix) { if (IsDiscriminatorFormula) { select.AddFormula(name, DiscriminatorFormulaTemplate, DiscriminatorAlias); } else { select.AddColumn(name, DiscriminatorColumnName, DiscriminatorAlias); } }
private string ManyToManySelectFragment(IJoinable rhs, string rhsAlias, string lhsAlias, string collectionSuffix) { SelectFragment frag = GenerateSelectFragment(lhsAlias, collectionSuffix); string[] _elementColumnNames = rhs.KeyColumnNames; frag.AddColumns(rhsAlias, _elementColumnNames, elementColumnAliases); AppendIndexColumns(frag, lhsAlias); AppendIdentifierColumns(frag, lhsAlias); return frag.ToSqlStringFragment(false); }
/// <summary> /// 创建通过临时表关联的返回数据语句片段。 /// </summary> /// <param name="unit">内容对象。</param> /// <param name="target">目标对象。</param> /// <param name="temptable">临时表。</param> /// <returns>语句片段。</returns> internal static SelectFragment SelectReturns(this IContentUnit unit, ISourceFragment target, TemporaryTableFragment temptable) { var data = (ContentBase)unit; var context = data.GenerateContext; var select = new SelectFragment(context, target); select.Members.AddRange(unit.ReturnMembers.Select(a => target.GetMember(a.Metadata))); select.AddSource(temptable); target.Join(temptable, data.Table.Keys); return(select); }
private void WriteFragmentForSelectSimple(SqlWriter writer, SelectFragment select) { writer.Write("SELECT"); if (select.Distinct) { writer.Write(" DISTINCT"); } writer.WriteLine(); WriteFragmentForSelectMembers(writer, select.Members); WriteFragmentForFrom(writer, select.Sources); WriteFragmentForWhere(writer, select.Where); WriteFragmentForGroupBy(writer, select.GroupBys); WriteFragmentForOrderBy(writer, select.Sorts); }
protected SqlString GenerateIdInsertSelect(IQueryable persister, string tableAlias, IASTNode whereClause) { var select = new SqlSelectBuilder(Factory); SelectFragment selectFragment = new SelectFragment(Factory.Dialect) .AddColumns(tableAlias, persister.IdentifierColumnNames, persister.IdentifierColumnNames); select.SetSelectClause(selectFragment.ToFragmentString().Substring(2)); string rootTableName = persister.TableName; SqlString fromJoinFragment = persister.FromJoinFragment(tableAlias, true, false); select.SetFromClause(rootTableName + " " + tableAlias + fromJoinFragment); var whereJoinFragment = GetWhereJoinFragment(persister, tableAlias); SqlString userWhereClause = SqlString.Empty; if (whereClause.ChildCount != 0) { // If a where clause was specified in the update/delete query, use it to limit the // returned ids here... try { var nodes = new CommonTreeNodeStream(whereClause); var gen = new SqlGenerator(Factory, nodes); gen.whereClause(); userWhereClause = gen.GetSQL().Substring(7); } catch (RecognitionException e) { throw new HibernateException("Unable to generate id select for DML operation", e); } if (whereJoinFragment.Length > 0) { whereJoinFragment = whereJoinFragment.Append(" and "); } } select.SetWhereClause(whereJoinFragment + userWhereClause); var insert = new InsertSelect(); if (Factory.Settings.IsCommentsEnabled) { insert.SetComment("insert-select for " + persister.EntityName + " ids"); } insert.SetTableName(persister.TemporaryIdTableName); insert.SetSelect(select); return(insert.ToSqlString()); }
/// <summary> /// 根据指定类型<see cref="DbCrossJoinExpression"/>表达式创建数据源语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="expression">指定表达式。</param> /// <returns>创建结果。</returns> protected virtual ISourceFragment CreateSourceForCrossJoin(GenerateContext context, DbExpression expression) { var content = (DbCrossJoinExpression)expression; var source = CreateSource(context, content.Source); if (source is SelectFragment select) { if (select.IsRecommandLock) { select = new SelectFragment(context, source); } } else { select = new SelectFragment(context, source); } var target = CreateSource(context, content.Target); if (target is VirtualSourceFragment virtualSource) { switch (virtualSource.Expression.ExpressionType) { case EExpressionType.CollectionMember: CreateVirtualJoinForCollectionMember(context, content, virtualSource); break; case EExpressionType.GroupJoin: CreateVirtualJoinForGroupJoin(context, content, virtualSource); break; case EExpressionType.GroupBy: CreateVirtualJoinForGroupBy(context, content, virtualSource); break; default: throw new NotSupportedException(string.Format(Res.NotSupportedJoinVirtualSource, expression.ExpressionType)); } } else { select.AddSource(target); target.Join = EJoinType.CrossJoin; } if (IsSelectFragment(content)) { InitialSelectFragment(select, content); } return(select); }
public override SqlString PropertySelectFragment(string alias, string suffix) { SelectFragment frag = new SelectFragment(factory.Dialect) .SetSuffix(suffix) .SetUsedAliases(IdentifierAliases); if (HasSubclasses) { frag.AddColumn(alias, DiscriminatorColumnName, DiscriminatorAlias); } return(frag.AddColumns(alias, subclassColumnClosure, subclassColumnAliasClosure) .AddFormulas(alias, subclassFormulaTemplateClosure, subclassFormulaAliasClosure) .ToSqlStringFragment()); }
internal static InsertFragment InsertTemptable(this ContentBase data, TemporaryTableFragment temptable, CommitKeyUnit unit, DbName name = null) { var members = unit.Keys.Concat(unit.Members).Select(a => a.Metadata); var context = data.GenerateContext; var table = new TableFragment(context, unit.Table, name); var select = new SelectFragment(context, temptable); var current = new InsertFragment(context, table, select); foreach (var member in members) { select.CreateMember(null, temptable.GetMember(member)); current.CreateMember(null, member); } return(current); }
/// <summary> /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建数据源语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="expression">指定表达式。</param> /// <returns>创建结果。</returns> protected virtual ISourceFragment CreateSourceForGroupJoin(GenerateContext context, DbExpression expression) { var content = (DbGroupJoinExpression)expression; var source = CreateSource(context, content.Source); var taget = CreateSource(context, content.Target); var container = new SelectFragment(context, source); var virtualSource = new VirtualSourceFragment(context, expression, container, source); context.RegisterSource(content.Item, virtualSource); if (IsSelectFragment(content)) { return(InitialSelectFragment(container, content)); } return(container); }
public SqlString SelectFragment(string alias) { SelectFragment frag = new SelectFragment(dialect) .SetSuffix(String.Empty) //always ignore suffix for collection columns .AddColumns(alias, keyColumnNames, keyColumnAliases) .AddColumns(alias, elementColumnNames, elementColumnAliases); if (hasIndex) { frag.AddColumns(alias, indexColumnNames, indexColumnAliases); } if (hasIdentifier) { frag.AddColumn(alias, identifierColumnName, identifierColumnAlias); } return(frag.ToSqlStringFragment(false)); }
private void WriteFragmentForSelectRowNumber(SqlWriter writer, SelectFragment select, string rownumber) { writer.Write("SELECT"); if (select.Distinct) { writer.Write(" DISTINCT"); } writer.WriteLine(); WriteFragmentForSelectMembers(writer, select.Members); writer.Write(", ROW_NUMBER() OVER ( "); WriteFragmentForOrderBy(writer, select.Sorts); writer.Write(" ) "); writer.Write(rownumber); WriteFragmentForFrom(writer, select.Sources); WriteFragmentForWhere(writer, select.Where); WriteFragmentForGroupBy(writer, select.GroupBys); }
/// <summary> /// 根据指定类型<see cref="DbGroupByExpression"/>表达式创建数据源语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="expression">指定表达式。</param> /// <returns>创建结果。</returns> protected virtual ISourceFragment CreateSourceForGroupBy(GenerateContext context, DbExpression expression) { var content = (DbGroupByExpression)expression; var groupitem = (DbGroupItemExpression)content.Item; var source = CreateSource(context, content.Source); var body = new SelectFragment(context, source); body.RetrievalMembers(content.Key, false); foreach (var member in body.Members.OfType <ReferenceMemberFragment>()) { body.GroupBys.Add(member.Reference); } var container = new SelectFragment(context, body); var virtualSource = new VirtualSourceFragment(context, expression, container, source, body); context.RegisterSource(content, virtualSource); context.RegisterSource(content.Item, virtualSource); return(container); }
public void CheckSelectElement(SelectElement selectElement, Table table, string defaultOption) { var expectedOptions = table.Rows.ToList().Select(it => it.Values.FirstOrDefault()); var actualOptions = SelectFragment .CheckSelectedOption(selectElement, defaultOption) .Options.ToList().Select(it => it.Text).ToList(); actualOptions.Count.Should().Be(expectedOptions.Count()); int i = 0; foreach (string expOption in expectedOptions) { actualOptions[i].Should().Contain(expOption); i++; } }
/// <summary> /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建虚拟数据源主体语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="source">虚拟数据源</param> /// <returns>查询语句片段。</returns> public virtual SelectFragment CreateVirtualBodyForGroupJoin(GenerateContext context, VirtualSourceFragment source) { var content = (DbGroupJoinExpression)source.Expression; var target = GetSource(context, content.Target.Item); var body = new SelectFragment(context, target); var container = source.Container; container.AddSource(body); body.Join = EJoinType.LeftJoin; body.Condition = content.KeyPairs.Select(a => { body.GroupBys.Add(body.RetrievalMember(a.Right)); return(container.CreateExpression(a)); }).Merge(); return(body); }
/// <summary> /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建虚拟数据源列表语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="source">虚拟数据源</param> /// <returns>查询语句片段。</returns> public virtual SelectFragment CreateVirtualListForGroupJoin(GenerateContext context, VirtualSourceFragment source) { var content = (DbGroupJoinExpression)source.Expression; var target = GetSource(context, content.Target.Item); var list = new SelectFragment(context, target); var container = source.Container; if (container.IsRecommandLock) { container = container.Parent as SelectFragment; } container.AddSource(list); list.Join = EJoinType.LeftJoin; list.Condition = content.KeyPairs.Select(a => container.CreateExpression(a)).Merge(); list.RetrievalMembers(content.Target.Item, false); return(list); }
public static InsertFragment Insert(this GenerateContext context, ISourceFragment source, TableMetadata target , IEnumerable <ColumnMetadata> members) { DbName name = null; if (context.Data is ContentBase data) { name = data.TargetName; } var table = new TableFragment(context, target, name); var select = new SelectFragment(context, source); var current = new InsertFragment(context, table, select); foreach (var member in members) { select.CreateMember(null, source.GetMember(member)); current.CreateMember(null, member); } return(current); }
/// <summary> /// 根据指定类型<see cref="DbCollectionMemberExpression"/>表达式创建虚拟数据源主体语句片段。 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="source">虚拟数据源</param> /// <returns>查询语句片段。</returns> public virtual SelectFragment CreateVirtualBodyForCollectionMember(GenerateContext context, VirtualSourceFragment source) { var content = (DbCollectionMemberExpression)source.Expression; var target = GetSource(context, content.TargetSet.Item); var container = source.Container; var body = new SelectFragment(context, target); if (content.Metadata.IsComposite) { GenerateVirtualCompositeJoinForCollectionMember(context, content, body, true); } container.AddSource(body); GenerateVirtualJoinForCollectionMember(context, source, body, false); foreach (var a in content.Pairs) { body.GroupBys.Add(body.RetrievalMember(a.Left)); } return(body); }
public void Open(string docName) { var path = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, @"..\..\Resources\" + docName)); DriverManager.GetWebDriver().Navigate().GoToUrl("file:///" + path); SelectFragment.SetOption("Sandbox"); DataGridComponent partnerRegistrationPage = new DataGridComponent(SearchElementByCss("tbody")); _context.UserExternalCode = partnerRegistrationPage.FindElement("#clientID").GetAttribute("value"); partnerRegistrationPage .ClearText("#partnerSecretKey") .SendText("#partnerSecretKey", "WQ7kQvMGp5+9KT6BaGBL") .ClearText("#partnerId") .SendText("#partnerId", "58") .ClickOnElement("input[type=submit]"); InitPage(); }