@@ -5177,5 +5177,199 @@ describe('Parameterized', () => {
51775177 { q1 : { r1 : { c : 'a_2' } } } ,
51785178 ) ;
51795179 } ) ;
5180+
5181+ test ( 'addParamValuesListener for specific query' , ( ) => {
5182+ store . setTable ( 't1' , {
5183+ r1 : { c1 : 'a' , c2 : 'b' } ,
5184+ r2 : { c1 : 'c' , c2 : 'd' } ,
5185+ r3 : { c1 : 'e' , c2 : 'f' } ,
5186+ } ) ;
5187+ queries . setQueryDefinition (
5188+ 'q1' ,
5189+ 't1' ,
5190+ ( { select, where, param} ) => {
5191+ select ( 'c1' ) ;
5192+ where ( 'c2' , param ( 'p1' ) as Cell ) ;
5193+ } ,
5194+ { p1 : 'b' } ,
5195+ ) ;
5196+
5197+ const listener = vi . fn ( ) ;
5198+ const listenerId = queries . addParamValuesListener ( 'q1' , listener ) ;
5199+
5200+ queries . setParamValues ( 'q1' , { p1 : 'd' } ) ;
5201+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q1' , { p1 : 'd' } ) ;
5202+
5203+ queries . setParamValues ( 'q1' , { p1 : 'f' } ) ;
5204+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q1' , { p1 : 'f' } ) ;
5205+
5206+ queries . delListener ( listenerId ) ;
5207+ queries . setParamValues ( 'q1' , { p1 : 'b' } ) ;
5208+ expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
5209+ } ) ;
5210+
5211+ test ( 'addParamValuesListener with wildcard' , ( ) => {
5212+ store . setTable ( 't1' , {
5213+ r1 : { c1 : 'a' , c2 : 'b' } ,
5214+ r2 : { c1 : 'c' , c2 : 'd' } ,
5215+ } ) ;
5216+ queries
5217+ . setQueryDefinition (
5218+ 'q1' ,
5219+ 't1' ,
5220+ ( { select, where, param} ) => {
5221+ select ( 'c1' ) ;
5222+ where ( 'c2' , param ( 'p1' ) as Cell ) ;
5223+ } ,
5224+ { p1 : 'b' } ,
5225+ )
5226+ . setQueryDefinition (
5227+ 'q2' ,
5228+ 't1' ,
5229+ ( { select, where, param} ) => {
5230+ select ( 'c2' ) ;
5231+ where ( 'c1' , param ( 'p2' ) as Cell ) ;
5232+ } ,
5233+ { p2 : 'a' } ,
5234+ ) ;
5235+
5236+ const listener = vi . fn ( ) ;
5237+ queries . addParamValuesListener ( null , listener ) ;
5238+
5239+ queries . setParamValues ( 'q1' , { p1 : 'd' } ) ;
5240+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q1' , { p1 : 'd' } ) ;
5241+
5242+ queries . setParamValues ( 'q2' , { p2 : 'c' } ) ;
5243+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q2' , { p2 : 'c' } ) ;
5244+
5245+ expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
5246+ } ) ;
5247+
5248+ test ( 'addParamValuesListener only fires when values change' , ( ) => {
5249+ store . setTable ( 't1' , { r1 : { c1 : 'a' , c2 : 'b' } } ) ;
5250+ queries . setQueryDefinition (
5251+ 'q1' ,
5252+ 't1' ,
5253+ ( { select, where, param} ) => {
5254+ select ( 'c1' ) ;
5255+ where ( 'c2' , param ( 'p1' ) as Cell ) ;
5256+ } ,
5257+ { p1 : 'b' } ,
5258+ ) ;
5259+
5260+ const listener = vi . fn ( ) ;
5261+ queries . addParamValuesListener ( 'q1' , listener ) ;
5262+ queries . setParamValues ( 'q1' , { p1 : 'b' } ) ; // Same value
5263+ expect ( listener ) . toHaveBeenCalledTimes ( 0 ) ;
5264+
5265+ queries . setParamValues ( 'q1' , { p1 : 'd' } ) ; // Different value
5266+ expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
5267+
5268+ queries . setParamValues ( 'q1' , { p1 : 'd' } ) ; // Same value again
5269+ expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
5270+ } ) ;
5271+
5272+ test ( 'addParamValueListener for specific query and param' , ( ) => {
5273+ store . setTable ( 't1' , {
5274+ r1 : { c1 : 'a' , c2 : 'b' , c3 : 5 } ,
5275+ r2 : { c1 : 'c' , c2 : 'd' , c3 : 3 } ,
5276+ } ) ;
5277+ queries . setQueryDefinition (
5278+ 'q1' ,
5279+ 't1' ,
5280+ ( { select, where, param} ) => {
5281+ select ( 'c1' ) ;
5282+ where (
5283+ ( getTableCell ) =>
5284+ getTableCell ( 'c2' ) === param ( 'p1' ) &&
5285+ ( getTableCell ( 'c3' ) as number ) >= ( param ( 'p2' ) as number ) ,
5286+ ) ;
5287+ } ,
5288+ { p1 : 'b' , p2 : 3 } ,
5289+ ) ;
5290+
5291+ const listener = vi . fn ( ) ;
5292+ const listenerId = queries . addParamValueListener ( 'q1' , 'p1' , listener ) ;
5293+
5294+ queries . setParamValue ( 'q1' , 'p1' , 'd' ) ;
5295+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q1' , 'p1' , 'd' ) ;
5296+ expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
5297+
5298+ queries . setParamValue ( 'q1' , 'p2' , 5 ) ;
5299+ expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
5300+
5301+ queries . setParamValue ( 'q1' , 'p1' , 'e' ) ;
5302+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q1' , 'p1' , 'e' ) ;
5303+ expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
5304+
5305+ queries . delListener ( listenerId ) ;
5306+ queries . setParamValue ( 'q1' , 'p1' , 'b' ) ;
5307+ expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
5308+ } ) ;
5309+
5310+ test ( 'addParamValueListener with wildcards' , ( ) => {
5311+ store . setTable ( 't1' , {
5312+ r1 : { c1 : 'a' , c2 : 'b' , c3 : 5 } ,
5313+ r2 : { c1 : 'c' , c2 : 'd' , c3 : 3 } ,
5314+ } ) ;
5315+ queries
5316+ . setQueryDefinition (
5317+ 'q1' ,
5318+ 't1' ,
5319+ ( { select, where, param} ) => {
5320+ select ( 'c1' ) ;
5321+ where ( 'c2' , param ( 'p1' ) as Cell ) ;
5322+ } ,
5323+ { p1 : 'b' } ,
5324+ )
5325+ . setQueryDefinition (
5326+ 'q2' ,
5327+ 't1' ,
5328+ ( { select, where, param} ) => {
5329+ select ( 'c2' ) ;
5330+ where (
5331+ ( getTableCell ) =>
5332+ ( getTableCell ( 'c3' ) as number ) >= ( param ( 'p2' ) as number ) ,
5333+ ) ;
5334+ } ,
5335+ { p2 : 3 } ,
5336+ ) ;
5337+
5338+ const listener = vi . fn ( ) ;
5339+ queries . addParamValueListener ( null , null , listener ) ;
5340+
5341+ queries . setParamValue ( 'q1' , 'p1' , 'd' ) ;
5342+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q1' , 'p1' , 'd' ) ;
5343+
5344+ queries . setParamValue ( 'q2' , 'p2' , 5 ) ;
5345+ expect ( listener ) . toHaveBeenCalledWith ( queries , 'q2' , 'p2' , 5 ) ;
5346+
5347+ expect ( listener ) . toHaveBeenCalledTimes ( 2 ) ;
5348+ } ) ;
5349+
5350+ test ( 'addParamValueListener only fires when value actually changes' , ( ) => {
5351+ store . setTable ( 't1' , { r1 : { c1 : 'a' , c2 : 'b' } } ) ;
5352+ queries . setQueryDefinition (
5353+ 'q1' ,
5354+ 't1' ,
5355+ ( { select, where, param} ) => {
5356+ select ( 'c1' ) ;
5357+ where ( 'c2' , param ( 'p1' ) as Cell ) ;
5358+ } ,
5359+ { p1 : 'b' } ,
5360+ ) ;
5361+
5362+ const listener = vi . fn ( ) ;
5363+ queries . addParamValueListener ( 'q1' , 'p1' , listener ) ;
5364+
5365+ queries . setParamValue ( 'q1' , 'p1' , 'b' ) ; // Same value
5366+ expect ( listener ) . toHaveBeenCalledTimes ( 0 ) ;
5367+
5368+ queries . setParamValue ( 'q1' , 'p1' , 'd' ) ; // Different value
5369+ expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
5370+
5371+ queries . setParamValue ( 'q1' , 'p1' , 'd' ) ; // Same value again
5372+ expect ( listener ) . toHaveBeenCalledTimes ( 1 ) ;
5373+ } ) ;
51805374 } ) ;
51815375} ) ;
0 commit comments