Skip to content

Commit 837d562

Browse files
committed
New test, check if object exists in parent but not in child table.
Uncommented ValidateNotNullColumns.
1 parent 8cddf8c commit 837d562

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

Source/PMapper/Validator/BoldDbDataValidator.pas

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ implementation
6262
BoldDefs,
6363
SysUtils,
6464
BoldUtils,
65+
BoldPMConsts,
6566
BoldMath;
6667

6768
const
@@ -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

153165
procedure TBoldDbDataValidator.OpenQuery;
154166
begin
155-
Sleep(PauseBetweenQueries);
167+
Sleep(1000*PauseBetweenQueries);
156168
Query.Open;
157169
end;
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;
843871
end;
844872

845-
initialization
846-
847873
end.

0 commit comments

Comments
 (0)