@@ -1108,13 +1108,13 @@ static void
1108
1108
jsonAccumulateSubPathSelectivity (Selectivity subpath_abs_sel ,
1109
1109
Selectivity path_freq ,
1110
1110
Selectivity * path_relative_sel ,
1111
- StringInfo pathstr ,
1111
+ bool is_array_accessor ,
1112
1112
JsonPathStats path_stats )
1113
1113
{
1114
1114
Selectivity sel = subpath_abs_sel / path_freq ; /* relative selectivity */
1115
1115
1116
1116
/* XXX Try to take into account array length */
1117
- if (pathstr -> data [ pathstr -> len - 1 ] == ']' )
1117
+ if (is_array_accessor )
1118
1118
sel = 1.0 - pow (1.0 - sel , jsonPathStatsGetAvgArraySize (path_stats ));
1119
1119
1120
1120
/* Accumulate selectivity of subpath into parent path */
@@ -1144,21 +1144,23 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1144
1144
Selectivity freq ; /* absolute frequence of path */
1145
1145
Selectivity sel ; /* relative selectivity of subpaths */
1146
1146
JsonPathStats stats ; /* statistics for the path */
1147
+ bool is_array_accesor ; /* is it '[*]' ? */
1147
1148
} root , /* root path entry */
1148
1149
* path = & root ; /* path entry stack */
1149
1150
Selectivity sel ; /* resulting selectivity */
1150
1151
Selectivity scalarSel ; /* selectivity of 'jsonb == scalar' */
1151
1152
1152
1153
/* Initialize root path string */
1153
1154
initStringInfo (& pathstr );
1154
- appendStringInfo (& pathstr , JSON_PATH_ROOT );
1155
+ appendBinaryStringInfo (& pathstr , stats -> prefix , stats -> prefixlen );
1155
1156
1156
1157
/* Initialize root path entry */
1157
1158
root .parent = NULL ;
1158
1159
root .len = pathstr .len ;
1159
- root .stats = jsonStatsGetPathByStr (stats , pathstr .data , pathstr .len );
1160
+ root .stats = jsonStatsFindPath (stats , pathstr .data , pathstr .len );
1160
1161
root .freq = jsonPathStatsGetFreq (root .stats , 0.0 );
1161
1162
root .sel = 1.0 ;
1163
+ root .is_array_accesor = pathstr .data [pathstr .len - 1 ] == ']' ;
1162
1164
1163
1165
/* Return 0, if NULL fraction is 1. */
1164
1166
if (root .freq <= 0.0 )
@@ -1202,6 +1204,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1202
1204
p -> stats = NULL ;
1203
1205
p -> freq = freq ;
1204
1206
p -> sel = 1.0 ;
1207
+ p -> is_array_accesor = false;
1205
1208
path = p ;
1206
1209
break ;
1207
1210
}
@@ -1214,7 +1217,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1214
1217
1215
1218
/* Appeend path string entry for array elements, get stats. */
1216
1219
jsonPathAppendEntry (& pathstr , NULL );
1217
- pstats = jsonStatsGetPathByStr (stats , pathstr .data , pathstr .len );
1220
+ pstats = jsonStatsFindPath (stats , pathstr .data , pathstr .len );
1218
1221
freq = jsonPathStatsGetFreq (pstats , 0.0 );
1219
1222
1220
1223
/* If there are no arrays, return 0 or scalar selectivity */
@@ -1228,6 +1231,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1228
1231
p -> stats = pstats ;
1229
1232
p -> freq = freq ;
1230
1233
p -> sel = 1.0 ;
1234
+ p -> is_array_accesor = true;
1231
1235
path = p ;
1232
1236
break ;
1233
1237
}
@@ -1247,7 +1251,8 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1247
1251
1248
1252
/* Accumulate selectivity into parent path */
1249
1253
jsonAccumulateSubPathSelectivity (abs_sel , path -> freq ,
1250
- & path -> sel , & pathstr ,
1254
+ & path -> sel ,
1255
+ path -> is_array_accesor ,
1251
1256
path -> stats );
1252
1257
break ;
1253
1258
}
@@ -1273,7 +1278,7 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1273
1278
* same statistics that was extracted in WJB_BEGIN_ARRAY.
1274
1279
*/
1275
1280
JsonPathStats pstats = r == WJB_ELEM ? path -> stats :
1276
- jsonStatsGetPathByStr (stats , pathstr .data , pathstr .len );
1281
+ jsonStatsFindPath (stats , pathstr .data , pathstr .len );
1277
1282
/* Make scalar jsonb datum */
1278
1283
Datum scalar = JsonbPGetDatum (JsonbValueToJsonb (& v ));
1279
1284
/* Absolute selectivity of 'path == scalar' */
@@ -1282,7 +1287,8 @@ jsonSelectivityContains(JsonStats stats, Jsonb *jb)
1282
1287
1283
1288
/* Accumulate selectivity into parent path */
1284
1289
jsonAccumulateSubPathSelectivity (abs_sel , path -> freq ,
1285
- & path -> sel , & pathstr ,
1290
+ & path -> sel ,
1291
+ path -> is_array_accesor ,
1286
1292
path -> stats );
1287
1293
break ;
1288
1294
}
0 commit comments