@@ -62,6 +62,7 @@ implementation
6262 BoldDefs,
6363 SysUtils,
6464 BoldUtils,
65+ BoldPMConsts,
6566 BoldMath;
6667
6768const
@@ -72,6 +73,7 @@ implementation
7273 ' SELECT PARENT.BOLD_ID ' + BOLDCRLF +
7374 ' FROM %s PARENT ' + BOLDCRLF +
7475 ' WHERE PARENT.BOLD_ID = OWN.BOLD_ID)' ;
76+ // [Own, Parent]
7577
7678 ExistenceInChildTest: string =
7779 ' SELECT PARENT.BOLD_ID, PARENT.BOLD_TYPE ' + BOLDCRLF +
@@ -81,13 +83,17 @@ implementation
8183 ' SELECT BOLD_ID' + BOLDCRLF +
8284 ' FROM %s OWN ' + BOLDCRLF +
8385 ' WHERE OWN.BOLD_ID = PARENT.BOLD_ID)' ;
86+ // [parent, types, Own]
87+
8488
8589 TypeTest: String =
8690 ' SELECT PARENT.BOLD_ID, PARENT.BOLD_TYPE, OWN.BOLD_TYPE' + BOLDCRLF +
8791 ' FROM %s PARENT, %s OWN' + BOLDCRLF +
8892 ' WHERE (PARENT.BOLD_ID = OWN.BOLD_ID) AND' + BOLDCRLF +
8993 ' (PARENT.BOLD_TYPE <> OWN.BOLD_TYPE)' ;
94+ // [Parent, Own]
9095
96+ // find all objects that are related, but the other end does not exist.
9197
9298 RelationTest: String =
9399 ' SELECT OWN.%s, OWN.BOLD_ID' + BOLDCRLF +
@@ -96,6 +102,7 @@ implementation
96102 ' SELECT RELATED.BOLD_ID' + BOLDCRLF +
97103 ' FROM %2:s RELATED' + BOLDCRLF +
98104 ' WHERE RELATED.BOLD_ID = OWN.%0:s)' ;
105+ // [Link, OwnTable, RelatedTable]
99106
100107 DuplicateSingleLinkTest: String =
101108 ' SELECT %0:s' + BOLDCRLF +
@@ -110,16 +117,20 @@ implementation
110117 ' GROUP BY LINKTABLE.%0:s, LINKTABLE.%1:s' + BOLDCRLF +
111118 ' HAVING COUNT(*) >= 2' + BOLDCRLF +
112119 ' ORDER BY %0:s, %1:s' ;
120+ // [Link1, link2, linktable]
113121
122+ // linkobjects with empty ends
114123 LinkObjectTest: String =
115124 ' SELECT BOLD_ID' + BOLDCRLF +
116125 ' FROM %s' + BOLDCRLF +
117126 ' WHERE %s = -1 or %s = -1' ;
127+
128+ // Linkobjects pointing to nonexisting objects
118129 LinkObjectTest2: String =
119130 ' SELECT LT.BOLD_ID' + BOLDCRLF +
120131 ' FROM %s LT' + BOLDCRLF +
121132 ' WHERE NOT EXISTS (SELECT T.BOLD_ID FROM %s T WHERE LT.%s = T.BOLD_ID)' ;
122-
133+ // [LinkTable, OtherTable, LinkColumn]
123134
124135 StrayObjectsTest: string =
125136 ' SELECT BOLD_ID, BOLD_TYPE ' + BOLDCRLF +
@@ -130,6 +141,7 @@ implementation
130141 ' SELECT T1.BOLD_ID, T1.BOLD_TYPE ' + BOLDCRLF +
131142 ' FROM %s T1, %s T2 ' + BOLDCRLF +
132143 ' WHERE (T1.%s = T2.BOLD_ID) and (T2.%s <> T1.BOLD_ID)' ;
144+ // [Table1, table2, link1, link2Own, Parent]
133145
134146{ TBoldDbDataValidator }
135147
@@ -152,7 +164,7 @@ function TBoldDbDataValidator.MemberIsInherited(
152164
153165procedure TBoldDbDataValidator.OpenQuery ;
154166begin
155- Sleep(PauseBetweenQueries);
167+ Sleep(1000 * PauseBetweenQueries);
156168 Query.Open;
157169end ;
158170
@@ -171,8 +183,8 @@ function TBoldDbDataValidator.Prepare2TableTest(SQLTemplate: String; CheckList:
171183 Query.Close;
172184 Query.AssignSQLText(format(SQLTemplate, args));
173185 OpenQuery;
174- BoldIdField := Query.FieldByName(' BOLD_ID ' );
175- BoldTypeField := Query.FieldByName(' BOLD_TYPE ' );
186+ BoldIdField := Query.FieldByName(Field_BOLD_ID );
187+ BoldTypeField := Query.FieldByName(Field_BOLD_TYPE );
176188 while not query.eof do
177189 begin
178190 IdList.Add(BoldIdField.AsString);
@@ -210,7 +222,7 @@ procedure TBoldDbDataValidator.Validate;
210222 BoldLog.LogHeader := Format(' Processing class %d %s' , [i, ObjectPMapper.ExpressionName]);
211223 ValidateExistence(ObjectPMapper);
212224 ValidateRelations(ObjectPMapper);
213- // ValidateNotNullColumns(ObjectPMapper);
225+ ValidateNotNullColumns(ObjectPMapper);
214226 if ObjectPmapper is TBoldObjectDefaultMapper then
215227 ValidateStrayObjects(ObjectPMapper as TBoldObjectDefaultMapper);
216228 if ObjectPMapper.IsLinkClass then
@@ -356,6 +368,22 @@ procedure TBoldDbDataValidator.ValidateExistence(ObjectSQLMapper: TBoldObjectSQL
356368 end ;
357369 end ;
358370 end ;
371+
372+ for i:= Tables.Count-1 downto 1 do
373+ begin
374+ SuperTable := Tables[i].SQLName;
375+ SubTable := Tables[i-1 ].SQLName;
376+ if Prepare2TableTest(ExistenceInChildTest, nil , [
377+ SuperTable,
378+ (ObjectSQLMapper as TBoldObjectDefaultMapper).SubClassesID,
379+ SubTable], SubTable, SuperTable, IdList, TypeList) then
380+ begin
381+ BoldLog.LogFmt(' The following objects exists in %s, but not in child table %s' , [SuperTable, SubTable], ltWarning);
382+ Boldlog.Log(IdList.CommaText, ltDetail);
383+ SuggesttableInsert(ObjectSQLMapper.MainTable, IdList, TypeList);
384+ end ;
385+ end ;
386+
359387 finally
360388 tables.free;
361389 IdList.Free;
@@ -752,8 +780,8 @@ procedure TBoldDbDataValidator.ValidateStrayObjects(ObjectDefaultMapper: TBoldOb
752780 Query.Close;
753781 Query.AssignSQLText(format(StrayObjectsTest, [ObjectDefaultMapper.MainTable.SQLName, ObjectDefaultMapper.SubClassesID]));
754782 OpenQuery;
755- BoldIdField := Query.FieldByName(' BOLD_ID ' );
756- BoldTypeField := Query.FieldByName(' BOLD_TYPE ' );
783+ BoldIdField := Query.FieldByName(Field_BOLD_ID );
784+ BoldTypeField := Query.FieldByName(Field_BOLD_TYPE );
757785 while not query.eof do
758786 begin
759787 IdList.Add(BoldIdField.AsString);
@@ -842,6 +870,4 @@ procedure TBoldDbDataValidator.AddRemedyForDeleteObjects(Mapper: TBoldObjectSQLM
842870 end ;
843871end ;
844872
845- initialization
846-
847873end .
0 commit comments