internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; if ((this.role.IsMany && this.role.RelationType.AssociationType.IsMany) || !this.role.RelationType.ExistExclusiveClasses) { statement.Append("\n"); statement.Append("EXISTS(\n"); statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject + "\n"); statement.Append("FROM " + schema.TableNameForRelationByRelationType[this.role.RelationType] + "\n"); statement.Append("WHERE " + Mapping.ColumnNameForAssociation + "=" + alias + "." + Mapping.ColumnNameForObject + "\n"); statement.Append("AND " + Mapping.ColumnNameForRole + "=" + this.allorsObject.Strategy.ObjectId + "\n"); statement.Append(")\n"); } else { // This join is not possible because of the 3VL (Three Valued Logic). // It should work for normal queries, but it fails when wrapped in a NOT( ... ) predicate. // The rows with NULL values should then return TRUE and not UNKNOWN. // // statement.sql.Append(" " + role.SingularFullName + "_R." + schema.O + " = " + allorsObject.ObjectId); statement.Append("\n"); statement.Append("EXISTS(\n"); statement.Append("SELECT " + Mapping.ColumnNameForObject + "\n"); statement.Append("FROM " + schema.TableNameForObjectByClass[((IComposite)this.role.ObjectType).ExclusiveClass] + "\n"); statement.Append("WHERE " + Mapping.ColumnNameForObject + "=" + this.allorsObject.Strategy.ObjectId + "\n"); statement.Append("AND " + schema.ColumnNameByRelationType[this.role.RelationType] + "=" + alias + ".O\n"); statement.Append(")\n"); } return(this.Include); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; var inStatement = statement.CreateChild(this.inExtent, this.association); inStatement.UseRole(this.association.RoleType); if ((this.association.IsMany && this.association.RoleType.IsMany) || !this.association.RelationType.ExistExclusiveClasses) { statement.Append(" (" + this.association.SingularFullName + "_A." + Mapping.ColumnNameForRole + " IS NULL OR"); statement.Append(" NOT " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForRole + " IN (\n"); statement.Append(" SELECT " + Mapping.ColumnNameForRole + " FROM " + schema.TableNameForRelationByRelationType[this.association.RelationType] + " WHERE " + Mapping.ColumnNameForAssociation + " IN ("); this.inExtent.BuildSql(inStatement); statement.Append(" )))\n"); } else { if (this.association.RoleType.IsMany) { statement.Append(" (" + alias + "." + schema.ColumnNameByRelationType[this.association.RelationType] + " IS NULL OR "); statement.Append(" NOT " + alias + "." + schema.ColumnNameByRelationType[this.association.RelationType] + " IN (\n"); this.inExtent.BuildSql(inStatement); statement.Append(" ))\n"); } else { statement.Append(" (" + this.association.SingularFullName + "_A." + Mapping.ColumnNameForObject + " IS NULL OR "); statement.Append(" NOT " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForObject + " IN (\n"); this.inExtent.BuildSql(inStatement); statement.Append(" ))\n"); } } return(this.Include); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; statement.Append(" " + alias + "." + schema.ColumnNameByRelationType[this.role.RelationType] + " < " + alias + "." + schema.ColumnNameByRelationType[this.lessThanRole.RelationType]); return(this.Include); }
private void AddDescendingAppendix(ExtentStatement statement) { var sortAppendix = this.session.Database.DescendingSortAppendix; if (sortAppendix != null) { statement.Append(sortAppendix + " "); } }
internal override string BuildSql(ExtentStatement statement) { this.LazyLoadFilter(); this.filter.Setup(statement); if (this.objectType.ExistClass) { if (this.objectType.ExistExclusiveClass) { return(this.BuildSqlWithExclusiveClass(statement)); } return(this.BuildSqlWithClasses(statement)); } return(null); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; if (this.role.ObjectType.IsUnit && this.equalsRole.ObjectType.IsUnit) { statement.Append(" " + alias + "." + schema.ColumnNameByRelationType[this.role.RelationType] + "=" + alias + "." + schema.ColumnNameByRelationType[this.equalsRole.RelationType]); } else if (((IComposite)this.role.ObjectType).ExistExclusiveClass && ((IComposite)this.equalsRole.ObjectType).ExistExclusiveClass) { statement.Append(" " + alias + "." + schema.ColumnNameByRelationType[this.role.RelationType] + "=" + alias + "." + schema.ColumnNameByRelationType[this.equalsRole.RelationType]); } else { throw new NotImplementedException(); } return(this.Include); }
internal void BuildOrder(ExtentStatement statement, string alias) { statement.Append( statement.Sorter.Equals(this) ? $" ORDER BY {alias}.{statement.Mapping.ColumnNameByRelationType[this.roleType.RelationType]}" : $" , {alias}.{statement.Mapping.ColumnNameByRelationType[this.roleType.RelationType]}"); if (this.direction == SortDirection.Ascending) { statement.Append(" ASC NULLS FIRST "); this.AddAscendingAppendix(statement); } else { statement.Append(" DESC NULLS LAST "); this.AddDescendingAppendix(statement); } this.subSorter?.BuildOrder(statement, alias); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; if ((this.association.IsMany && this.association.RoleType.IsMany) || !this.association.RelationType.ExistExclusiveClasses) { statement.Append("\n"); statement.Append("EXISTS(\n"); statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject + "\n"); statement.Append("FROM " + schema.TableNameForRelationByRelationType[this.association.RelationType] + "\n"); statement.Append("WHERE " + Mapping.ColumnNameForAssociation + "=" + this.allorsObject.Strategy.ObjectId + "\n"); statement.Append("AND " + Mapping.ColumnNameForRole + "=" + alias + "." + Mapping.ColumnNameForObject + "\n"); statement.Append(")"); } else { statement.Append(" " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForObject + " = " + this.allorsObject.Strategy.ObjectId); } return(this.Include); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; var inStatement = new StringBuilder("0"); foreach (var inObject in this.enumerable) { inStatement.Append(","); inStatement.Append(inObject.Id); } if ((this.role.IsMany && this.role.RelationType.AssociationType.IsMany) || !this.role.RelationType.ExistExclusiveClasses) { // TODO: in combination with NOT gives error statement.Append(" (" + this.role.SingularFullName + "_R." + Mapping.ColumnNameForRole + " IS NOT NULL AND "); statement.Append(" " + this.role.SingularFullName + "_R." + Mapping.ColumnNameForRole + " IN ("); statement.Append(inStatement.ToString()); statement.Append(" ))"); } else { if (this.role.IsMany) { statement.Append(" (" + this.role.SingularFullName + "_R." + Mapping.ColumnNameForObject + " IS NOT NULL AND "); statement.Append(" " + this.role.SingularFullName + "_R." + Mapping.ColumnNameForObject + " IN ("); statement.Append(inStatement.ToString()); statement.Append(" ))"); } else { statement.Append(" (" + schema.ColumnNameByRelationType[this.role.RelationType] + " IS NOT NULL AND "); statement.Append(" " + schema.ColumnNameByRelationType[this.role.RelationType] + " IN ("); statement.Append(inStatement.ToString()); statement.Append(" ))"); } } return(this.Include); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; var inStatement = new StringBuilder("0"); foreach (var inObject in this.enumerable) { inStatement.Append(","); inStatement.Append(inObject.Id.ToString()); } if ((this.association.IsMany && this.association.RelationType.RoleType.IsMany) || !this.association.RelationType.ExistExclusiveClasses) { statement.Append(" (" + this.association.SingularFullName + "_A." + Mapping.ColumnNameForRole + " IS NULL OR "); statement.Append(" NOT " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForRole + " IN (\n"); statement.Append(" SELECT " + Mapping.ColumnNameForRole + " FROM " + schema.TableNameForRelationByRelationType[this.association.RelationType] + " WHERE " + Mapping.ColumnNameForAssociation + " IN ("); statement.Append(inStatement.ToString()); statement.Append(" ))\n"); } else { if (this.association.RelationType.RoleType.IsMany) { statement.Append(" (" + alias + "." + schema.ColumnNameByRelationType[this.association.RelationType] + " IS NULL OR "); statement.Append(" NOT " + alias + "." + schema.ColumnNameByRelationType[this.association.RelationType] + " IN (\n"); statement.Append(inStatement.ToString()); statement.Append(" ))\n"); } else { statement.Append(" (" + this.association.SingularFullName + "_A." + Mapping.ColumnNameForObject + " IS NULL OR "); statement.Append(" NOT " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForObject + " IN (\n"); statement.Append(inStatement.ToString()); statement.Append(" ))\n"); } } return(this.Include); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; if ((this.association.IsMany && this.association.RelationType.RoleType.IsMany) || !this.association.RelationType.ExistExclusiveClasses) { statement.Append(" " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL"); } else { if (this.association.RelationType.RoleType.IsMany) { statement.Append(" " + alias + "." + schema.ColumnNameByRelationType[this.association.RelationType] + " IS NOT NULL"); } else { statement.Append(" " + this.association.SingularFullName + "_A." + Mapping.ColumnNameForObject + " IS NOT NULL"); } } return(this.Include); }
internal override bool BuildWhere(ExtentStatement statement, string alias) { var schema = statement.Mapping; if (this.instanceClasses.Length == 1) { statement.Append(alias + "." + Mapping.ColumnNameForClass + "=" + statement.AddParameter(this.instanceClasses[0].Id) + " "); } else if (this.instanceClasses.Length > 1) { statement.Append(" ( "); for (var i = 0; i < this.instanceClasses.Length; i++) { statement.Append(alias + "." + Mapping.ColumnNameForClass + "=" + statement.AddParameter(this.instanceClasses[i].Id)); if (i < this.instanceClasses.Length - 1) { statement.Append(" OR "); } } statement.Append(" ) "); } return this.Include; }
internal override void Setup(ExtentStatement statement) { statement.UseRole(this.role); statement.UseRole(this.first); statement.UseRole(this.second); }
internal override void Setup(ExtentStatement statement) => statement.UseRole(this.role);
internal override void Setup(ExtentStatement statement) { statement.UseAssociation(this.association); statement.UseAssociationInstance(this.association); }
internal override void Setup(ExtentStatement statement) => statement.UseAssociation(this.association);
internal override void Setup(ExtentStatement statement) { statement.UseRole(this.role); statement.UseRole(this.greaterThanRole); }
internal override void Setup(ExtentStatement statement) { statement.UseRole(this.role); statement.UseRole(this.equalsRole); }
private string BuildSqlWithExclusiveClass(ExtentStatement statement) { var alias = statement.CreateAlias(); var rootClass = this.objectType.ExclusiveClass; if (statement.IsRoot) { statement.Append("SELECT DISTINCT " + alias + "." + Mapping.ColumnNameForObject); statement.Sorter?.BuildSelect(statement, alias); statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); this.filter?.BuildWhere(statement, alias); } else { // ContainedIn var inStatement = (ExtentStatementChild)statement; if (inStatement.RoleType != null) { var inRole = inStatement.RoleType; var inIRelationType = inRole.RelationType; if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation); } else { if (inRole.IsMany) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } else { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType]); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL "); } else { if (inRole.IsMany) { statement.Append(alias + "." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } else { statement.Append(inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } } } else { if (statement.IsRoot) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } } else { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } } } return(alias); }
internal override void Setup(ExtentStatement statement) { }
internal abstract string BuildSql(ExtentStatement statement);
private string BuildSqlWithClasses(ExtentStatement statement) { if (statement.IsRoot) { for (var i = 0; i < this.objectType.Classes.Count(); i++) { var alias = statement.CreateAlias(); var rootClass = this.objectType.Classes.ToArray()[i]; statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } if (i < this.objectType.Classes.Count() - 1) { statement.Append("\nUNION\n"); } } } else { var inStatement = (ExtentStatementChild)statement; if (inStatement.RoleType != null) { var useUnion = false; foreach (var rootClass in this.objectType.Classes) { var inRole = inStatement.RoleType; var inIRelationType = inRole.RelationType; if (!((IComposite)inRole.ObjectType).Classes.Contains(rootClass)) { continue; } if (useUnion) { statement.Append("\nUNION\n"); } else { useUnion = true; } var alias = statement.CreateAlias(); if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation); } else { if (inRole.IsMany) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } else { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType]); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL "); } else { if (inRole.IsMany) { statement.Append(alias + "." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } else { statement.Append(inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } } } } else { for (var i = 0; i < this.objectType.Classes.Count(); i++) { var alias = statement.CreateAlias(); var rootClass = this.objectType.Classes.ToArray()[i]; if (statement.IsRoot) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } } else { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } if (i < this.objectType.Classes.Count() - 1) { statement.Append("\nUNION\n"); } } } } return(null); }
internal void BuildSelect(ExtentStatement statement, string alias) { statement.Append($" , {alias}.{statement.Mapping.ColumnNameByRelationType[this.roleType.RelationType]} "); this.subSorter?.BuildSelect(statement, alias); }
internal override void Setup(ExtentStatement statement) { // extent.UseRole(role); }