@@ -2009,16 +2009,22 @@ impl<'a, Conn> RunQueryDsl<Conn> for FindQuery<'a> {}
20092009#[ derive( Debug , Clone ) ]
20102010pub struct FindRangeQuery < ' a > {
20112011 tables : & ' a Vec < & ' a Table > ,
2012+ is_upper_range : bool ,
20122013 imm_range : EntityBlockRange ,
20132014 mut_range : EntityBlockRange ,
20142015}
20152016
20162017impl < ' a > FindRangeQuery < ' a > {
2017- pub fn new ( tables : & ' a Vec < & Table > , block_range : Range < BlockNumber > ) -> Self {
2018- let imm_range = EntityBlockRange :: new ( true , block_range. clone ( ) ) ;
2019- let mut_range = EntityBlockRange :: new ( false , block_range) ;
2018+ pub fn new (
2019+ tables : & ' a Vec < & Table > ,
2020+ is_upper_range : bool ,
2021+ block_range : Range < BlockNumber > ,
2022+ ) -> Self {
2023+ let imm_range = EntityBlockRange :: new ( true , block_range. clone ( ) , false ) ;
2024+ let mut_range = EntityBlockRange :: new ( false , block_range, is_upper_range) ;
20202025 Self {
20212026 tables,
2027+ is_upper_range,
20222028 imm_range,
20232029 mut_range,
20242030 }
@@ -2028,42 +2034,46 @@ impl<'a> FindRangeQuery<'a> {
20282034impl < ' a > QueryFragment < Pg > for FindRangeQuery < ' a > {
20292035 fn walk_ast < ' b > ( & ' b self , mut out : AstPass < ' _ , ' b , Pg > ) -> QueryResult < ( ) > {
20302036 out. unsafe_to_cache_prepared ( ) ;
2037+ let mut first = true ;
20312038
2032- let mut iter = self . tables . iter ( ) . peekable ( ) ;
2033- while let Some ( table) = iter. next ( ) {
2034- // Generate
2035- // select '..' as entity, to_jsonb(e.*) as data, block$ as block_number
2036- // from schema.table e where id = $1
2037- out. push_sql ( "select " ) ;
2038- out. push_bind_param :: < Text , _ > ( table. object . as_str ( ) ) ?;
2039- out. push_sql ( " as entity, to_jsonb(e.*) as data," ) ;
2040- if table. immutable {
2041- self . imm_range . compare_column ( & mut out)
2042- } else {
2043- self . mut_range . compare_column ( & mut out)
2044- }
2045- out. push_sql ( "as block_number\n " ) ;
2046- out. push_sql ( " from " ) ;
2047- out. push_sql ( table. qualified_name . as_str ( ) ) ;
2048- out. push_sql ( " e\n where" ) ;
2049- // TODO: do we need to care about it?
2050- // if self.table.has_causality_region {
2051- // out.push_sql("causality_region = ");
2052- // out.push_bind_param::<Integer, _>(&self.key.causality_region)?;
2053- // out.push_sql(" and ");
2054- // }
2055- if table. immutable {
2056- self . imm_range . contains ( & mut out) ?;
2057- } else {
2058- self . mut_range . contains ( & mut out) ?;
2059- }
2060- // more elements left?
2061- if iter. peek ( ) . is_some ( ) {
2062- out. push_sql ( "\n union all\n " ) ; // with the next
2063- } else {
2064- out. push_sql ( "\n order by block_number" ) ; // on the last
2039+ for table in self . tables . iter ( ) {
2040+ // the immutable entities don't have upper range and also can't be modified or deleted
2041+ if !( self . is_upper_range && table. immutable ) {
2042+ if first {
2043+ first = false ;
2044+ } else {
2045+ out. push_sql ( "\n union all\n " ) ;
2046+ }
2047+
2048+ // Generate
2049+ // select '..' as entity, to_jsonb(e.*) as data, block$ as block_number
2050+ // from schema.table e where id = $1
2051+ out. push_sql ( "select " ) ;
2052+ out. push_bind_param :: < Text , _ > ( table. object . as_str ( ) ) ?;
2053+ out. push_sql ( " as entity, to_jsonb(e.*) as data," ) ;
2054+ if table. immutable {
2055+ self . imm_range . compare_column ( & mut out)
2056+ } else {
2057+ self . mut_range . compare_column ( & mut out)
2058+ }
2059+ out. push_sql ( "as block_number, id\n " ) ;
2060+ out. push_sql ( " from " ) ;
2061+ out. push_sql ( table. qualified_name . as_str ( ) ) ;
2062+ out. push_sql ( " e\n where" ) ;
2063+ // TODO: do we need to care about it?
2064+ // if self.table.has_causality_region {
2065+ // out.push_sql("causality_region = ");
2066+ // out.push_bind_param::<Integer, _>(&self.key.causality_region)?;
2067+ // out.push_sql(" and ");
2068+ // }
2069+ if table. immutable {
2070+ self . imm_range . contains ( & mut out) ?;
2071+ } else {
2072+ self . mut_range . contains ( & mut out) ?;
2073+ }
20652074 }
20662075 }
2076+ out. push_sql ( "\n order by block_number, entity, id" ) ;
20672077
20682078 Ok ( ( ) )
20692079 }
0 commit comments