public DisjunctionFragment AddCondition(ConditionalFragment fragment) { if (buffer.Count > 0) { buffer.Add(" or "); } buffer.Add("(") .Add(fragment.ToSqlStringFragment()) .Add(")"); return(this); }
public DisjunctionFragment AddCondition(ConditionalFragment fragment) { if (buffer.Count > 0) { buffer.Add(" or "); } buffer.Add("(") .Add(fragment.ToSqlStringFragment()) .Add(")"); return this; }
/// <summary> /// Render the where condition for a (batch) load by identifier / collection key /// </summary> protected SqlStringBuilder WhereString(string alias, string[] columnNames, int batchSize) { if (columnNames.Length == 1) { // if not a composite key, use "foo in (?, ?, ?)" for batching // if no batch, and not a composite key, use "foo = ?" string tableAlias = GenerateAliasForColumn(alias, columnNames[0]); InFragment inf = new InFragment().SetColumn(tableAlias, columnNames[0]); for (int i = 0; i < batchSize; i++) inf.AddValue(Parameter.Placeholder); return new SqlStringBuilder(inf.ToFragmentString()); } else { var fragments = new ConditionalFragment[batchSize]; for (int i = 0; i < batchSize; i++) { fragments[i] = new ConditionalFragment() .SetTableAlias(alias) .SetCondition(columnNames, Parameter.GenerateParameters(columnNames.Length)); } var whereString = new SqlStringBuilder(); if (fragments.Length == 1) { // if no batch, use "foo = ? and bar = ?" whereString.Add(fragments[0].ToSqlStringFragment()); } else { // if batching, use "( (foo = ? and bar = ?) or (foo = ? and bar = ?) )" var df = new DisjunctionFragment(fragments); whereString.Add(StringHelper.OpenParen); whereString.Add(df.ToFragmentString()); whereString.Add(StringHelper.ClosedParen); } return whereString; } }
/// <summary> /// Render the where condition for a (batch) load by identifier / collection key /// </summary> protected SqlStringBuilder WhereString(string alias, string[] columnNames, int batchSize) { if (columnNames.Length == 1) { // if not a composite key, use "foo in (?, ?, ?)" for batching // if no batch, and not a composite key, use "foo = ?" InFragment inf = new InFragment().SetColumn(alias, columnNames[0]); for (int i = 0; i < batchSize; i++) inf.AddValue(Parameter.Placeholder); return new SqlStringBuilder(inf.ToFragmentString()); } else { Parameter[] columnParameters = Parameter.GenerateParameters(columnNames.Length); ConditionalFragment byId = new ConditionalFragment() .SetTableAlias(alias) .SetCondition(columnNames, columnParameters); SqlStringBuilder whereString = new SqlStringBuilder(); if (batchSize == 1) { // if no batch, use "foo = ? and bar = ?" whereString.Add(byId.ToSqlStringFragment()); } else { // if a composite key, use "( (foo = ? and bar = ?) or (foo = ? and bar = ?) )" for batching whereString.Add(StringHelper.OpenParen); // TODO: unnecessary for databases with ANSI-style joins DisjunctionFragment df = new DisjunctionFragment(); for (int i = 0; i < batchSize; i++) { df.AddCondition(byId); } whereString.Add(df.ToFragmentString()); whereString.Add(StringHelper.ClosedParen); // TODO: unnecessary for databases with ANSI-style joins } return whereString; } }
/// <summary> /// Render the where condition for a (batch) load by identifier / collection key /// </summary> /// <param name="factory"></param> /// <param name="alias"></param> /// <param name="columnNames"></param> /// <param name="type"></param> /// <param name="batchSize"></param> /// <returns></returns> protected static SqlStringBuilder WhereString( ISessionFactoryImplementor factory, string alias, string[] columnNames, IType type, int batchSize ) { Parameter[ ] columnParameters = Parameter.GenerateParameters( factory, columnNames, type ); ConditionalFragment byId = new ConditionalFragment() .SetTableAlias( alias ) .SetCondition( columnNames, columnParameters ); SqlStringBuilder whereString = new SqlStringBuilder(); if( batchSize == 1 ) { whereString.Add( byId.ToSqlStringFragment() ); } else { whereString.Add( StringHelper.OpenParen ); // TODO: unnecessary for databases with ANSI-style joins DisjunctionFragment df = new DisjunctionFragment(); for( int i = 0; i < batchSize; i++ ) { df.AddCondition( byId ); } whereString.Add( df.ToFragmentString() ); whereString.Add( StringHelper.ClosedParen ); // TODO: unnecessary for databases with ANSI-style joins } return whereString; }