@@ -94,6 +94,9 @@ private bool TryBuildKey(DatabaseTableDefinitionJson definition, DatabaseForeign
9494
9595 public async Task < bool > ParseDelete ( DeleteQuery deleteQuery , IQueryParsingContext context )
9696 {
97+ if ( deleteQuery . TableName == DatabaseTable . WorldTable ( "conditions" ) )
98+ return ParseDeleteConditions ( deleteQuery , context ) ;
99+
97100 var defi = tableDefinitionProvider . GetDefinitionByTableName ( deleteQuery . TableName ) ;
98101 if ( defi == null )
99102 return false ;
@@ -135,8 +138,75 @@ public async Task<bool> ParseDelete(DeleteQuery deleteQuery, IQueryParsingContex
135138 return true ;
136139 }
137140
141+ private bool ParseDeleteConditions ( DeleteQuery deleteConditions , IQueryParsingContext context )
142+ {
143+ foreach ( var where in deleteConditions . Where . Conditions )
144+ {
145+ var sourceTypeColumn = where . Columns . IndexOf ( "SourceTypeOrReferenceId" ) ;
146+ if ( sourceTypeColumn == - 1 )
147+ return false ;
148+
149+ if ( ! ( where . Values [ sourceTypeColumn ] is long sourceType ) )
150+ return false ;
151+
152+ var defi = tableDefinitionProvider . Definitions . FirstOrDefault ( d =>
153+ d . IsOnlyConditionsTable == OnlyConditionMode . IgnoreTableCompletely &&
154+ d . Condition ? . SourceType == sourceType ) ;
155+
156+ if ( defi == null || defi . PrimaryKey . Count != 1 )
157+ return false ;
158+
159+ var sourceEntryColumn = where . Columns . IndexOf ( "SourceEntry" ) ;
160+ var sourceGroupColumn = where . Columns . IndexOf ( "SourceGroup" ) ;
161+ var sourceIdColumn = where . Columns . IndexOf ( "SourceId" ) ;
162+
163+ DatabaseKey ? key = null ;
164+
165+ if ( defi . Condition ! . SourceEntryColumn . HasValue && defi . PrimaryKey [ 0 ] == defi . Condition ! . SourceEntryColumn . Value )
166+ {
167+ if ( sourceEntryColumn == - 1 )
168+ return false ;
169+
170+ if ( where . Values [ sourceEntryColumn ] is not long sourceEntry )
171+ return false ;
172+
173+ key = new DatabaseKey ( sourceEntry ) ;
174+ }
175+ else if ( defi . Condition ! . SourceGroupColumn != null && defi . PrimaryKey [ 0 ] == defi . Condition ! . SourceGroupColumn . Name )
176+ {
177+ if ( sourceGroupColumn == - 1 )
178+ return false ;
179+
180+ if ( where . Values [ sourceGroupColumn ] is not long sourceGroup )
181+ return false ;
182+
183+ key = new DatabaseKey ( sourceGroup ) ;
184+ }
185+ else if ( defi . Condition ! . SourceIdColumn . HasValue && defi . PrimaryKey [ 0 ] == defi . Condition ! . SourceIdColumn . Value )
186+ {
187+ if ( sourceIdColumn == - 1 )
188+ return false ;
189+
190+ if ( where . Values [ sourceIdColumn ] is not long sourceId )
191+ return false ;
192+
193+ key = new DatabaseKey ( sourceId ) ;
194+ }
195+
196+ if ( ! key . HasValue )
197+ return false ;
198+
199+ context . ProduceItem ( new DatabaseTableSolutionItem ( key . Value , false , true , new DatabaseTable ( defi . DataDatabaseType , defi . TableName ) , false ) ) ;
200+ }
201+
202+ return true ;
203+ }
204+
138205 public async Task < bool > ParseInsert ( InsertQuery query , IQueryParsingContext context )
139206 {
207+ if ( query . TableName == DatabaseTable . WorldTable ( "conditions" ) )
208+ return ParseInsertConditions ( query , context ) ;
209+
140210 var defi = tableDefinitionProvider . GetDefinitionByTableName ( query . TableName ) ;
141211 if ( defi == null )
142212 return false ;
@@ -180,6 +250,73 @@ public async Task<bool> ParseInsert(InsertQuery query, IQueryParsingContext cont
180250 return true ;
181251 }
182252
253+ private bool ParseInsertConditions ( InsertQuery query , IQueryParsingContext context )
254+ {
255+ var sourceTypeColumn = query . Columns . IndexOf ( "SourceTypeOrReferenceId" ) ;
256+ if ( sourceTypeColumn == - 1 )
257+ return false ;
258+
259+ var sourceEntryColumn = query . Columns . IndexOf ( "SourceEntry" ) ;
260+ var sourceGroupColumn = query . Columns . IndexOf ( "SourceGroup" ) ;
261+ var sourceIdColumn = query . Columns . IndexOf ( "SourceId" ) ;
262+
263+ if ( sourceEntryColumn == - 1 && sourceGroupColumn == - 1 && sourceIdColumn == - 1 )
264+ return false ;
265+
266+ foreach ( var insert in query . Inserts )
267+ {
268+ if ( ! ( insert [ sourceTypeColumn ] is long sourceType ) )
269+ return false ;
270+
271+ var defi = tableDefinitionProvider . Definitions . FirstOrDefault ( d =>
272+ d . IsOnlyConditionsTable == OnlyConditionMode . IgnoreTableCompletely &&
273+ d . Condition ? . SourceType == sourceType ) ;
274+
275+ if ( defi == null || defi . PrimaryKey . Count != 1 )
276+ return false ;
277+
278+ DatabaseKey ? key = null ;
279+
280+ if ( defi . Condition ! . SourceEntryColumn . HasValue && defi . PrimaryKey [ 0 ] == defi . Condition ! . SourceEntryColumn . Value )
281+ {
282+ if ( sourceEntryColumn == - 1 )
283+ return false ;
284+
285+ if ( insert [ sourceEntryColumn ] is not long sourceEntry )
286+ return false ;
287+
288+ key = new DatabaseKey ( sourceEntry ) ;
289+ }
290+ else if ( defi . Condition ! . SourceGroupColumn != null && defi . PrimaryKey [ 0 ] == defi . Condition ! . SourceGroupColumn . Name )
291+ {
292+ if ( sourceGroupColumn == - 1 )
293+ return false ;
294+
295+ if ( insert [ sourceGroupColumn ] is not long sourceGroup )
296+ return false ;
297+
298+ key = new DatabaseKey ( sourceGroup ) ;
299+ }
300+ else if ( defi . Condition ! . SourceIdColumn . HasValue && defi . PrimaryKey [ 0 ] == defi . Condition ! . SourceIdColumn . Value )
301+ {
302+ if ( sourceIdColumn == - 1 )
303+ return false ;
304+
305+ if ( insert [ sourceIdColumn ] is not long sourceId )
306+ return false ;
307+
308+ key = new DatabaseKey ( sourceId ) ;
309+ }
310+
311+ if ( ! key . HasValue )
312+ return false ;
313+
314+ context . ProduceItem ( new DatabaseTableSolutionItem ( key . Value , false , true , new DatabaseTable ( defi . DataDatabaseType , defi . TableName ) , false ) ) ;
315+ }
316+
317+ return true ;
318+ }
319+
183320 public async Task < bool > ParseUpdate ( UpdateQuery query , IQueryParsingContext context )
184321 {
185322 var defi = tableDefinitionProvider . GetDefinitionByTableName ( query . TableName ) ;
0 commit comments