From: Richard B. <rb...@us...> - 2004-10-28 00:16:43
|
Update of /cvsroot/jcframework/dotnet In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2951 Modified Files: CClassMap.vb CColumnMap.vb CCriteriaCondition.vb CMsAccessDatabase.vb CMultiRetrieveCriteria.vb CMultiSummaryCriteria.vb CMySqlDatabase.vb CPersistentCriteria.vb CRelationalDatabase.vb CRetrieveCriteria.vb CSelectInCriteria.vb CSummaryCriteria.vb Log Message: Fixes as per bug #1055503 (Summary criteria) Also, changes to better handle offsets for databases that do not natively provide offset support (ie MSSQL, Access, etc) Index: CRelationalDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CRelationalDatabase.vb,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- CRelationalDatabase.vb 18 Oct 2004 03:31:51 -0000 1.20 +++ CRelationalDatabase.vb 28 Oct 2004 00:16:12 -0000 1.21 @@ -555,6 +555,19 @@ ''' </history> ''' ----------------------------------------------------------------------------- Function useBracketsForJoins() As Boolean + ''' ----------------------------------------------------------------------------- + ''' <summary> + ''' Indicates that the database supports offsets in the TOP clause (mysql) + ''' </summary> + ''' <returns></returns> + ''' <remarks>Not all database support offsets for select statements. Those that + ''' don't must use a different method to skip rows. + ''' </remarks> + ''' <history> + ''' [rbanks] 2/09/2004 Created + ''' </history> + ''' ----------------------------------------------------------------------------- + Function supportsSelectOffsets() As Boolean End Interface '''----------------------------------------------------------------------------- @@ -1254,4 +1267,7 @@ Dispose(False) End Sub + Public Overridable Function supportsSelectOffsets() As Boolean Implements _CRelationalDatabase.supportsSelectOffsets + Return False + End Function End Class \ No newline at end of file Index: CCriteriaCondition.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CCriteriaCondition.vb,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- CCriteriaCondition.vb 8 Oct 2004 00:06:25 -0000 1.15 +++ CCriteriaCondition.vb 28 Oct 2004 00:16:12 -0000 1.16 @@ -20,10 +20,10 @@ 'Condition for criteria's WHERE and HAVING parts Private m_Simple As Boolean - Private m_Parts As New Collection - Private m_Associations As New Collection + Private m_Parts As New Collection + Private m_Associations As New Collection Private m_classMap As CClassMap - Private m_Tables As New Collection + Private m_Tables As New Collection Private m_parent As CCriteriaCondition Private m_useOrWithParent As Boolean @@ -232,13 +232,13 @@ ''' </history> ''' ----------------------------------------------------------------------------- Public Sub addSubCriteria(ByVal subCriteria As CCriteriaCondition, ByVal useOr As Boolean) - m_Simple = False - If subCriteria.ClassMap Is Nothing Then - subCriteria.ClassMap = Me.ClassMap - End If - m_Parts.Add(subCriteria) - subCriteria.useOrWithParent = useOr - subCriteria.Parent = Me + m_Simple = False + If subCriteria.ClassMap Is Nothing Then + subCriteria.ClassMap = Me.ClassMap + End If + m_Parts.Add(subCriteria) + subCriteria.useOrWithParent = useOr + subCriteria.Parent = Me End Sub @@ -615,10 +615,10 @@ End Function Public Function addSelectLike(ByVal Name As String, ByVal ValueA As Object) As CSelectionCriteria - Return addSelectlike(Name, ValueA, "", False) + Return addSelectLike(Name, ValueA, "", False) End Function Public Function addSelectLike(ByVal Name As String, ByVal ValueA As Object, ByVal useOr As Boolean) As CSelectionCriteria - Return addSelectlike(Name, ValueA, "", useOr) + Return addSelectLike(Name, ValueA, "", useOr) End Function '''----------------------------------------------------------------------------- ''' <summary> Index: CSelectInCriteria.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CSelectInCriteria.vb,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- CSelectInCriteria.vb 18 Oct 2004 00:08:10 -0000 1.6 +++ CSelectInCriteria.vb 28 Oct 2004 00:16:12 -0000 1.7 @@ -26,6 +26,7 @@ Private Shared m_subQueryCount As Integer = 0 Private m_SQC As Integer Private m_alias As String + Private m_rows As Short '''----------------------------------------------------------------------------- ''' <summary> @@ -111,6 +112,25 @@ '''----------------------------------------------------------------------------- ''' <summary> + ''' The number of records to retrieve in the sub condition + ''' </summary> + ''' <value>Short specifying the maximum number of records to retrieve from the database.</value> + ''' <remarks>The value is used in SQL generation only.</remarks> + ''' <history> + ''' [rbanks] 28/10/2004 Created + ''' </history> + '''----------------------------------------------------------------------------- + Public Property RowLimit() As Short + Get + Return m_rows + End Get + Set(ByVal Value As Short) + m_rows = Value + End Set + End Property + + '''----------------------------------------------------------------------------- + ''' <summary> ''' Creates a new instance of the CSelectInCriteria and sets the primary object. ''' </summary> ''' <param name="obj">The object to use in the sub-query.</param> @@ -261,10 +281,19 @@ statement.addSqlClause("(" & Me.ClassMap.RelationalDatabase.getClauseStringSelect & " ") + If m_rows > 0 And Me.ClassMap.RelationalDatabase.limitClauseAtStart Then + statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) + statement.addSqlClause(" " & Str(m_rows) & " ") + End If + statement.addSqlClause(m_selectAttribute.ColumnMap.getAliasQualifiedName(m_alias)) statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringFrom & " ") - statement.addSqlClause(m_joins.GetSQLString) + If m_joins Is Nothing Then + statement.addSqlClause(Me.Tables(1).Name) + Else + statement.addSqlClause(m_joins.GetSQLString) + End If 'Need to set correct table aliases for the selection criteria in the where condition Dim obj As Object @@ -285,6 +314,10 @@ fillStatementWithWhere(statement) + If m_rows > 0 And Not Me.ClassMap.RelationalDatabase.limitClauseAtStart Then + statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) + statement.addSqlClause(" " & Str(m_rows)) + End If statement.addSqlClause(")") Return statement.SqlString End Function Index: CMsAccessDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMsAccessDatabase.vb,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- CMsAccessDatabase.vb 18 Oct 2004 03:31:51 -0000 1.18 +++ CMsAccessDatabase.vb 28 Oct 2004 00:16:12 -0000 1.19 @@ -321,4 +321,11 @@ End If End Sub + Public Overrides Function limitClauseAtStart() As Boolean + Return True + End Function + + Public Overrides Function getClauseStringLimit() As String + Return "TOP" + End Function End Class \ No newline at end of file Index: CPersistentCriteria.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CPersistentCriteria.vb,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- CPersistentCriteria.vb 20 Oct 2004 06:44:23 -0000 1.8 +++ CPersistentCriteria.vb 28 Oct 2004 00:16:12 -0000 1.9 @@ -17,6 +17,7 @@ Sub fillStatementWithCondition(ByRef statement As CSqlStatement) Sub fillStatementWithWhere(ByRef statement As CSqlStatement) Function getSize() As Short + Sub addOffsetSubCriteria(ByVal offset As Integer) End Interface '''----------------------------------------------------------------------------- @@ -289,4 +290,29 @@ End If MyBase.Finalize() End Sub + + Public Sub addOffsetSubCriteria(ByVal offset As Integer) Implements _CPersistentCriteria.addOffsetSubCriteria + + Dim si As CSelectInCriteria + Dim baseClassConditions As New CCriteriaCondition + + baseClassConditions.ClassMap = Me.ClassMap + baseClassConditions.Tables = Me.Tables + For Each cc As CSelectionCriteria In WhereCondition.Parts + If cc.ClassMap.Name = Me.ClassMap.Name Then + baseClassConditions.Parts.Add(cc) + End If + Next + + For Each am As CAttributeMap In ClassMap.KeyAttributeMaps + si = New CSelectInCriteria + si.Tables = Me.Tables + si.ClassMap = Me.ClassMap + si.WhereCondition = baseClassConditions + si.SetSelectAttribute(am.Name) + si.RowLimit = offset + Me.WhereCondition.addSelectNotIn(am.Name, si) + Next + End Sub + End Class \ No newline at end of file Index: CMultiSummaryCriteria.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMultiSummaryCriteria.vb,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- CMultiSummaryCriteria.vb 18 Oct 2004 00:08:10 -0000 1.11 +++ CMultiSummaryCriteria.vb 28 Oct 2004 00:16:12 -0000 1.12 @@ -380,10 +380,10 @@ statement.addSqlClause(ClassMap.RelationalDatabase.getClauseStringSelect) If m_rows > 0 And Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset >= 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If statement.addSqlClause(" ") isFirst = True @@ -414,6 +414,9 @@ statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringFrom & " ") statement.addSqlClause(m_joins.GetSQLString) + If m_offset > 0 And Not Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + addOffsetSubCriteria(m_offset) + End If fillStatementWithWhere(statement) Dim attMap As CAttributeMap @@ -451,10 +454,10 @@ If m_rows > 0 And Not Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset >= 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If getSqlStatementParameters = statement Index: CMultiRetrieveCriteria.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMultiRetrieveCriteria.vb,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- CMultiRetrieveCriteria.vb 19 Oct 2004 03:32:08 -0000 1.17 +++ CMultiRetrieveCriteria.vb 28 Oct 2004 00:16:12 -0000 1.18 @@ -126,7 +126,7 @@ m_offset = -1 m_rows = -1 m_Having = Nothing - m_fullObjects = False 'default to proxy objects only + m_fullObjects = False 'default to proxy objects only End Sub Public Sub New(ByVal obj As CPersistentObject) @@ -349,10 +349,10 @@ statement.addSqlClause(Me.ClassMap.RelationalDatabase.getClauseStringSelect) If m_rows > 0 And Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset > 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If statement.addSqlClause(" ") j = 0 @@ -388,6 +388,9 @@ UpdateConditionAliases(WhereCondition, mapName, cm.Name) Next + If m_offset > 0 And Not Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + addOffsetSubCriteria(m_offset) + End If fillStatementWithWhere(statement) Dim attMap As CAttributeMap @@ -414,10 +417,10 @@ If m_rows > 0 And Not Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset > 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If getSqlStatementParameters = statement Index: CRetrieveCriteria.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CRetrieveCriteria.vb,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- CRetrieveCriteria.vb 16 Aug 2004 04:16:54 -0000 1.10 +++ CRetrieveCriteria.vb 28 Oct 2004 00:16:12 -0000 1.11 @@ -215,6 +215,9 @@ statement.addSqlClause(tm.Name) Next i + If m_offset > 0 And Not Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + addOffsetSubCriteria(m_offset) + End If fillStatementWithWhere(statement) Dim attMap As CAttributeMap @@ -256,10 +259,10 @@ If m_rows > 0 And Not Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset > 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If getSqlStatementParameters = statement Index: CMySqlDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMySqlDatabase.vb,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- CMySqlDatabase.vb 18 Oct 2004 03:31:51 -0000 1.20 +++ CMySqlDatabase.vb 28 Oct 2004 00:16:12 -0000 1.21 @@ -329,4 +329,8 @@ End If End If End Sub + + Public Overrides Function supportsSelectOffsets() As Boolean + Return True + End Function End Class Index: CColumnMap.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CColumnMap.vb,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- CColumnMap.vb 7 Oct 2004 05:57:33 -0000 1.10 +++ CColumnMap.vb 28 Oct 2004 00:16:12 -0000 1.11 @@ -267,7 +267,11 @@ ''' </history> '''----------------------------------------------------------------------------- Public Function getAliasQualifiedName(ByVal pAlias As String) As String - Return pAlias & "." & Me.Name + If pAlias = String.Empty Then + Return Me.Name + Else + Return pAlias & "." & Me.Name + End If End Function '''----------------------------------------------------------------------------- Index: CClassMap.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CClassMap.vb,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- CClassMap.vb 27 Oct 2004 07:38:48 -0000 1.37 +++ CClassMap.vb 28 Oct 2004 00:16:11 -0000 1.38 @@ -978,10 +978,10 @@ statement.addSqlClause(Me.RelationalDatabase.getClauseStringSelect) If rowLimit > 0 And Me.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.RelationalDatabase.getClauseStringLimit) - If rowOffset > 0 Then - statement.addSqlClause(Str(rowOffset) & ", ") + If rowOffset > 0 andalso Me.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(rowOffset) & ",") End If - statement.addSqlClause(Str(rowLimit)) + statement.addSqlClause(" " & Str(rowLimit)) End If statement.addSqlClause(" ") Dim isFirst As Boolean Index: CSummaryCriteria.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CSummaryCriteria.vb,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- CSummaryCriteria.vb 18 Oct 2004 00:08:10 -0000 1.9 +++ CSummaryCriteria.vb 28 Oct 2004 00:16:12 -0000 1.10 @@ -42,6 +42,7 @@ ''' </history> '''----------------------------------------------------------------------------- Public Enum SumMethod + None Sum Avg Min @@ -150,6 +151,8 @@ '''----------------------------------------------------------------------------- Public Sub addGroupAttribute(ByVal attributeName As String) m_groupAttributes.Add(ClassMap.getAttributeMapByString(attributeName, True)) + m_fieldsForSum.Add(ClassMap.getAttributeMapByString(attributeName, True)) + m_methodsForSum.Add(SumMethod.None) End Sub '''----------------------------------------------------------------------------- @@ -228,15 +231,17 @@ statement.addSqlClause(ClassMap.RelationalDatabase.getClauseStringSelect) If m_rows > 0 And Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset > 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If statement.addSqlClause(" ") isFirst = True For i = 1 To m_fieldsForSum.Count Select Case m_methodsForSum(i) + Case SumMethod.None + s = m_fieldsForSum(i).ColumnMap.getFullyQualifiedName Case SumMethod.Avg s = ClassMap.RelationalDatabase.getClauseStringAvg(m_fieldsForSum(i).ColumnMap.getFullyQualifiedName) Case SumMethod.Max @@ -248,6 +253,9 @@ Case SumMethod.Count s = ClassMap.RelationalDatabase.getClauseStringCount(m_fieldsForSum(i).ColumnMap.getFullyQualifiedName) End Select + If m_methodsForSum(i) <> SumMethod.None Then + s = s + " as " + m_fieldsForSum(i).ColumnMap.Name + End If If isFirst Then statement.addSqlClause(s) Else @@ -266,6 +274,9 @@ statement.addSqlClause(tm.Name) Next i + If m_offset > 0 And Not Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + addOffsetSubCriteria(m_offset) + End If fillStatementWithWhere(statement) Dim attMap As CAttributeMap @@ -303,10 +314,10 @@ If m_rows > 0 And Not Me.ClassMap.RelationalDatabase.limitClauseAtStart Then statement.addSqlClause(" " & Me.ClassMap.RelationalDatabase.getClauseStringLimit) - If m_offset > 0 Then - statement.addSqlClause(Str(m_offset) & ", ") + If m_offset > 0 AndAlso Me.ClassMap.RelationalDatabase.supportsSelectOffsets Then + statement.addSqlClause(" " & Str(m_offset) & ",") End If - statement.addSqlClause(Str(m_rows)) + statement.addSqlClause(" " & Str(m_rows)) End If getSqlStatementParameters = statement |