@@ -550,48 +550,31 @@ public override IQuery CreateQuery(IQueryExpression queryExpression)
550
550
551
551
public override void List ( IQueryExpression queryExpression , QueryParameters queryParameters , IList results )
552
552
{
553
- using ( new SessionIdLoggingContext ( SessionId ) )
554
- {
555
- CheckAndUpdateSessionStatus ( ) ;
556
- queryParameters . ValidateParameters ( ) ;
557
- var plan = GetHQLQueryPlan ( queryExpression , false ) ;
558
-
559
- AutoFlushIfRequired ( plan . QuerySpaces ) ;
560
-
561
- bool success = false ;
562
- using ( SuspendAutoFlush ( ) ) //stops flush being called multiple times if this method is recursively called
563
- {
564
- try
565
- {
566
- plan . PerformList ( queryParameters , this , results ) ;
567
- success = true ;
568
- }
569
- catch ( HibernateException )
570
- {
571
- // Do not call Convert on HibernateExceptions
572
- throw ;
573
- }
574
- catch ( Exception e )
575
- {
576
- throw Convert ( e , "Could not execute query" ) ;
577
- }
578
- finally
579
- {
580
- AfterOperation ( success ) ;
581
- }
582
- }
583
- }
553
+ List ( queryExpression , queryParameters , results , null ) ;
584
554
}
585
555
586
556
protected override void ListFilter ( object collection , IQueryExpression queryExpression , QueryParameters queryParameters , IList results )
557
+ {
558
+ if ( collection == null )
559
+ throw new ArgumentNullException ( nameof ( collection ) ) ;
560
+ List ( queryExpression , queryParameters , results , collection ) ;
561
+ }
562
+
563
+ private void List ( IQueryExpression queryExpression , QueryParameters queryParameters , IList results , object filterConnection )
587
564
{
588
565
using ( new SessionIdLoggingContext ( SessionId ) )
589
566
{
590
567
CheckAndUpdateSessionStatus ( ) ;
591
568
queryParameters . ValidateParameters ( ) ;
592
- var plan = GetFilterQueryPlan ( collection , queryExpression , queryParameters , false ) ;
593
569
594
- AutoFlushIfRequired ( plan . QuerySpaces ) ;
570
+ var isFilter = filterConnection != null ;
571
+ var plan = isFilter
572
+ ? GetFilterQueryPlan ( filterConnection , queryExpression , queryParameters , false )
573
+ : GetHQLQueryPlan ( queryExpression , false ) ;
574
+
575
+ // GetFilterQueryPlan has already auto flushed or fully flush.
576
+ if ( ! isFilter )
577
+ AutoFlushIfRequired ( plan . QuerySpaces ) ;
595
578
596
579
bool success = false ;
597
580
using ( SuspendAutoFlush ( ) ) //stops flush being called multiple times if this method is recursively called
@@ -751,69 +734,27 @@ public override IQuery CreateFilter(object collection, IQueryExpression queryExp
751
734
752
735
private IQueryExpressionPlan GetFilterQueryPlan ( object collection , IQueryExpression queryExpression , QueryParameters parameters , bool shallow )
753
736
{
754
- using ( new SessionIdLoggingContext ( SessionId ) )
755
- {
756
- CollectionEntry entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
757
- ICollectionPersister roleBeforeFlush = ( entry == null ) ? null : entry . LoadedPersister ;
758
-
759
- IQueryExpressionPlan plan ;
760
- if ( roleBeforeFlush == null )
761
- {
762
- // if it was previously unreferenced, we need to flush in order to
763
- // get its state into the database in order to execute query
764
- Flush ( ) ;
765
- entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
766
- ICollectionPersister roleAfterFlush = ( entry == null ) ? null : entry . LoadedPersister ;
767
- if ( roleAfterFlush == null )
768
- {
769
- throw new QueryException ( "The collection was unreferenced" ) ;
770
- }
771
- plan = Factory . QueryPlanCache . GetFilterQueryPlan ( queryExpression , roleAfterFlush . Role , shallow , EnabledFilters ) ;
772
- }
773
- else
774
- {
775
- // otherwise, we only need to flush if there are in-memory changes
776
- // to the queried tables
777
- plan = Factory . QueryPlanCache . GetFilterQueryPlan ( queryExpression , roleBeforeFlush . Role , shallow , EnabledFilters ) ;
778
-
779
- if ( AutoFlushIfRequired ( plan . QuerySpaces ) )
780
- {
781
- // might need to run a different filter entirely after the flush
782
- // because the collection role may have changed
783
- entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
784
- ICollectionPersister roleAfterFlush = ( entry == null ) ? null : entry . LoadedPersister ;
785
- if ( roleBeforeFlush != roleAfterFlush )
786
- {
787
- if ( roleAfterFlush == null )
788
- {
789
- throw new QueryException ( "The collection was dereferenced" ) ;
790
- }
791
- plan = Factory . QueryPlanCache . GetFilterQueryPlan ( queryExpression , roleAfterFlush . Role , shallow , EnabledFilters ) ;
792
- }
793
- }
794
- }
795
-
796
- if ( parameters != null )
797
- {
798
- parameters . PositionalParameterValues [ 0 ] = entry . LoadedKey ;
799
- parameters . PositionalParameterTypes [ 0 ] = entry . LoadedPersister . KeyType ;
800
- }
801
-
802
- return plan ;
803
- }
737
+ return GetFilterQueryPlan ( collection , parameters ,
738
+ role => Factory . QueryPlanCache . GetFilterQueryPlan ( queryExpression , role , shallow , EnabledFilters ) ) ;
804
739
}
805
740
806
741
private IQueryExpressionPlan GetFilterQueryPlan ( object collection , string filter , QueryParameters parameters , bool shallow )
742
+ {
743
+ return GetFilterQueryPlan ( collection , parameters ,
744
+ role => Factory . QueryPlanCache . GetFilterQueryPlan ( filter , role , shallow , EnabledFilters ) ) ;
745
+ }
746
+
747
+ private IQueryExpressionPlan GetFilterQueryPlan ( object collection , QueryParameters parameters , Func < string , IQueryExpressionPlan > getPlanForRole )
807
748
{
808
749
using ( new SessionIdLoggingContext ( SessionId ) )
809
750
{
810
751
if ( collection == null )
811
752
{
812
- throw new ArgumentNullException ( " collection" , "null collection passed to filter" ) ;
753
+ throw new ArgumentNullException ( nameof ( collection ) , "null collection passed to filter" ) ;
813
754
}
814
755
815
- CollectionEntry entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
816
- ICollectionPersister roleBeforeFlush = ( entry == null ) ? null : entry . LoadedPersister ;
756
+ var entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
757
+ var roleBeforeFlush = entry ? . LoadedPersister ;
817
758
818
759
IQueryExpressionPlan plan ;
819
760
if ( roleBeforeFlush == null )
@@ -822,31 +763,31 @@ private IQueryExpressionPlan GetFilterQueryPlan(object collection, string filter
822
763
// get its state into the database in order to execute query
823
764
Flush ( ) ;
824
765
entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
825
- ICollectionPersister roleAfterFlush = ( entry == null ) ? null : entry . LoadedPersister ;
766
+ var roleAfterFlush = entry ? . LoadedPersister ;
826
767
if ( roleAfterFlush == null )
827
768
{
828
769
throw new QueryException ( "The collection was unreferenced" ) ;
829
770
}
830
- plan = Factory . QueryPlanCache . GetFilterQueryPlan ( filter , roleAfterFlush . Role , shallow , EnabledFilters ) ;
771
+ plan = getPlanForRole ( roleAfterFlush . Role ) ;
831
772
}
832
773
else
833
774
{
834
775
// otherwise, we only need to flush if there are in-memory changes
835
776
// to the queried tables
836
- plan = Factory . QueryPlanCache . GetFilterQueryPlan ( filter , roleBeforeFlush . Role , shallow , EnabledFilters ) ;
777
+ plan = getPlanForRole ( roleBeforeFlush . Role ) ;
837
778
if ( AutoFlushIfRequired ( plan . QuerySpaces ) )
838
779
{
839
780
// might need to run a different filter entirely after the flush
840
781
// because the collection role may have changed
841
782
entry = persistenceContext . GetCollectionEntryOrNull ( collection ) ;
842
- ICollectionPersister roleAfterFlush = ( entry == null ) ? null : entry . LoadedPersister ;
783
+ var roleAfterFlush = entry ? . LoadedPersister ;
843
784
if ( roleBeforeFlush != roleAfterFlush )
844
785
{
845
786
if ( roleAfterFlush == null )
846
787
{
847
788
throw new QueryException ( "The collection was dereferenced" ) ;
848
789
}
849
- plan = Factory . QueryPlanCache . GetFilterQueryPlan ( filter , roleAfterFlush . Role , shallow , EnabledFilters ) ;
790
+ plan = getPlanForRole ( roleAfterFlush . Role ) ;
850
791
}
851
792
}
852
793
}
0 commit comments