@@ -233,13 +233,15 @@ jsonPathStatsCompare(const void *pv1, const void *pv2)
233
233
}
234
234
235
235
/*
236
- * jsonStatsFindPathStats
236
+ * jsonStatsFindPath
237
237
* Find stats for a given path.
238
238
*
239
239
* The stats are sorted by path, so we can simply do bsearch().
240
+ * This is low-level function and jsdata->prefix is not considered, the caller
241
+ * should handle it by itself.
240
242
*/
241
243
static JsonPathStats
242
- jsonStatsFindPathStats (JsonStats jsdata , char * path , int pathlen )
244
+ jsonStatsFindPath (JsonStats jsdata , char * path , int pathlen )
243
245
{
244
246
JsonPathStats stats ;
245
247
JsonbValue jbvkey ;
@@ -264,15 +266,11 @@ jsonStatsFindPathStats(JsonStats jsdata, char *path, int pathlen)
264
266
}
265
267
266
268
/*
267
- * jsonStatsGetPathStatsStr
268
- * ???
269
- *
270
- * XXX Seems to do essentially what jsonStatsFindPathStats, except that it also
271
- * considers jsdata->prefix. Seems fairly easy to combine those into a single
272
- * function.
269
+ * jsonStatsGetPathByStr
270
+ * Find stats for a given path string considering jsdata->prefix.
273
271
*/
274
272
JsonPathStats
275
- jsonStatsGetPathStatsStr (JsonStats jsdata , const char * subpath , int subpathlen )
273
+ jsonStatsGetPathByStr (JsonStats jsdata , const char * subpath , int subpathlen )
276
274
{
277
275
JsonPathStats stats ;
278
276
char * path ;
@@ -287,14 +285,20 @@ jsonStatsGetPathStatsStr(JsonStats jsdata, const char *subpath, int subpathlen)
287
285
memcpy (path , jsdata -> prefix , jsdata -> prefixlen );
288
286
memcpy (& path [jsdata -> prefixlen ], & subpath [1 ], subpathlen - 1 );
289
287
290
- stats = jsonStatsFindPathStats (jsdata , path , pathlen );
288
+ stats = jsonStatsFindPath (jsdata , path , pathlen );
291
289
292
290
if (!stats )
293
291
pfree (path );
294
292
295
293
return stats ;
296
294
}
297
295
296
+ #define jsonStatsGetRootPath (jsdata ) \
297
+ jsonStatsGetPathByStr(jsdata, JSON_PATH_ROOT, JSON_PATH_ROOT_LEN)
298
+
299
+ #define jsonStatsGetRootArrayPath (jsdata ) \
300
+ jsonStatsGetPathByStr(jsdata, JSON_PATH_ROOT_ARRAY, JSON_PATH_ROOT_ARRAY_LEN)
301
+
298
302
/*
299
303
* jsonPathAppendEntry
300
304
* Append entry (represented as simple string) to a path.
@@ -344,7 +348,7 @@ jsonPathStatsGetSubpath(JsonPathStats pstats, const char *key)
344
348
path = str .data ;
345
349
pathlen = str .len ;
346
350
347
- spstats = jsonStatsFindPathStats (pstats -> data , path , pathlen );
351
+ spstats = jsonStatsFindPath (pstats -> data , path , pathlen );
348
352
if (!spstats )
349
353
pfree (path );
350
354
@@ -378,16 +382,15 @@ jsonPathStatsGetArrayIndexSelectivity(JsonPathStats pstats, int index)
378
382
}
379
383
380
384
/*
381
- * jsonStatsGetPathStats
385
+ * jsonStatsGetPath
382
386
* Find JSON statistics for a given path.
383
387
*
384
388
* 'path' is an array of text datums of length 'pathlen' (can be zero).
385
389
*/
386
390
static JsonPathStats
387
- jsonStatsGetPathStats (JsonStats jsdata , Datum * path , int pathlen ,
388
- float4 * nullfrac )
391
+ jsonStatsGetPath (JsonStats jsdata , Datum * path , int pathlen , float4 * nullfrac )
389
392
{
390
- JsonPathStats pstats = jsonStatsGetPathStatsStr (jsdata , JSON_PATH_ROOT , JSON_PATH_ROOT_LEN );
393
+ JsonPathStats pstats = jsonStatsGetRootPath (jsdata );
391
394
Selectivity sel = 1.0 ;
392
395
393
396
for (int i = 0 ; pstats && i < pathlen ; i ++ )
@@ -840,16 +843,15 @@ jsonPathStatsFormTuple(JsonPathStats pstats, JsonStatType type, float4 nullfrac)
840
843
}
841
844
842
845
/*
843
- * jsonStatsGetPathStatsTuple
846
+ * jsonStatsGetPathTuple
844
847
* Extract JSON statistics for a path and form pg_statistics tuple.
845
848
*/
846
849
static HeapTuple
847
- jsonStatsGetPathStatsTuple (JsonStats jsdata , JsonStatType type ,
848
- Datum * path , int pathlen )
850
+ jsonStatsGetPathTuple (JsonStats jsdata , JsonStatType type ,
851
+ Datum * path , int pathlen )
849
852
{
850
853
float4 nullfrac ;
851
- JsonPathStats pstats = jsonStatsGetPathStats (jsdata , path , pathlen ,
852
- & nullfrac );
854
+ JsonPathStats pstats = jsonStatsGetPath (jsdata , path , pathlen , & nullfrac );
853
855
854
856
return jsonPathStatsFormTuple (pstats , type , nullfrac );
855
857
}
@@ -862,9 +864,7 @@ static HeapTuple
862
864
jsonStatsGetArrayIndexStatsTuple (JsonStats jsdata , JsonStatType type , int32 index )
863
865
{
864
866
/* Extract statistics for root array elements */
865
- JsonPathStats pstats = jsonStatsGetPathStatsStr (jsdata ,
866
- JSON_PATH_ROOT_ARRAY ,
867
- JSON_PATH_ROOT_ARRAY_LEN );
867
+ JsonPathStats pstats = jsonStatsGetRootArrayPath (jsdata );
868
868
Selectivity index_sel ;
869
869
870
870
if (!pstats )
@@ -885,10 +885,9 @@ jsonStatsGetArrayIndexStatsTuple(JsonStats jsdata, JsonStatType type, int32 inde
885
885
static float4
886
886
jsonStatsGetPathFreq (JsonStats jsdata , Datum * path , int pathlen )
887
887
{
888
- float4 nullfrac ;
889
- JsonPathStats pstats = jsonStatsGetPathStats (jsdata , path , pathlen ,
890
- & nullfrac );
891
- float4 freq = (1.0 - nullfrac ) * jsonPathStatsGetFreq (pstats , 0.0 );
888
+ float4 nullfrac ;
889
+ JsonPathStats pstats = jsonStatsGetPath (jsdata , path , pathlen , & nullfrac );
890
+ float4 freq = (1.0 - nullfrac ) * jsonPathStatsGetFreq (pstats , 0.0 );
892
891
893
892
CLAMP_PROBABILITY (freq );
894
893
return freq ;
@@ -933,8 +932,7 @@ jsonbStatsVarOpConst(Oid opid, VariableStatData *resdata,
933
932
}
934
933
935
934
resdata -> statsTuple =
936
- jsonStatsGetPathStatsTuple (& jsdata , statype ,
937
- & cnst -> constvalue , 1 );
935
+ jsonStatsGetPathTuple (& jsdata , statype , & cnst -> constvalue , 1 );
938
936
break ;
939
937
}
940
938
@@ -985,7 +983,7 @@ jsonbStatsVarOpConst(Oid opid, VariableStatData *resdata,
985
983
986
984
if (!have_nulls )
987
985
resdata -> statsTuple =
988
- jsonStatsGetPathStatsTuple (& jsdata , statype , path , pathlen );
986
+ jsonStatsGetPathTuple (& jsdata , statype , path , pathlen );
989
987
990
988
pfree (path );
991
989
pfree (nulls );
@@ -1151,7 +1149,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1151
1149
/* Initialize root path entry */
1152
1150
root .parent = NULL ;
1153
1151
root .len = pathstr .len ;
1154
- root .stats = jsonStatsGetPathStatsStr (stats , pathstr .data , pathstr .len );
1152
+ root .stats = jsonStatsGetPathByStr (stats , pathstr .data , pathstr .len );
1155
1153
root .freq = jsonPathStatsGetFreq (root .stats , 0.0 );
1156
1154
root .sel = 1.0 ;
1157
1155
@@ -1209,8 +1207,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1209
1207
1210
1208
/* Appeend path string entry for array elements, get stats. */
1211
1209
jsonPathAppendEntry (& pathstr , NULL );
1212
- pstats = jsonStatsGetPathStatsStr (stats , pathstr .data ,
1213
- pathstr .len );
1210
+ pstats = jsonStatsGetPathByStr (stats , pathstr .data , pathstr .len );
1214
1211
freq = jsonPathStatsGetFreq (pstats , 0.0 );
1215
1212
1216
1213
/* If there are no arrays, return 0 or scalar selectivity */
@@ -1269,7 +1266,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1269
1266
* same statistics that was extracted in WJB_BEGIN_ARRAY.
1270
1267
*/
1271
1268
JsonPathStats pstats = r == WJB_ELEM ? path -> stats :
1272
- jsonStatsGetPathStatsStr (stats , pathstr .data , pathstr .len );
1269
+ jsonStatsGetPathByStr (stats , pathstr .data , pathstr .len );
1273
1270
/* Make scalar jsonb datum */
1274
1271
Datum scalar = JsonbPGetDatum (JsonbValueToJsonb (& v ));
1275
1272
/* Absolute selectivity of 'path == scalar' */
@@ -1317,12 +1314,10 @@ jsonSelectivityExists(JsonStats stats, Datum key)
1317
1314
1318
1315
keysel = jsonStatsGetPathFreq (stats , & key , 1 );
1319
1316
1320
- rootstats = jsonStatsGetPathStatsStr (stats , JSON_PATH_ROOT ,
1321
- JSON_PATH_ROOT_LEN );
1317
+ rootstats = jsonStatsGetRootPath (stats );
1322
1318
scalarsel = jsonSelectivity (rootstats , jbkey , JsonbEqOperator );
1323
1319
1324
- arrstats = jsonStatsGetPathStatsStr (stats , JSON_PATH_ROOT_ARRAY ,
1325
- JSON_PATH_ROOT_ARRAY_LEN );
1320
+ arrstats = jsonStatsGetRootArrayPath (stats );
1326
1321
arraysel = jsonSelectivity (arrstats , jbkey , JsonbEqOperator );
1327
1322
arraysel = 1.0 - pow (1.0 - arraysel ,
1328
1323
jsonPathStatsGetAvgArraySize (arrstats ));
0 commit comments