@@ -132,17 +132,54 @@ private list[QuerySnippet] buildQG2Snippets(list[Expr] parts){
132132 return snippets ;
133133}
134134
135- public lrel [str ,int ] reportQCPCounts (){
135+ public lrel [str ,int ] reportQCPCounts (bool subcases ){
136136 qs = buildAndClassifyQueryStrings ();
137- return [
138- <"QCP1" , size ({q | q <- qs , q .flags .qcp1 == true })>,
139- <"QCP2" , size ({q | q <- qs , q .flags .qcp2 == true })>,
140- <"QCP3a" , size ({q | q <- qs , q .flags .qcp3a == true })>,
141- <"QCP3b" , size ({q | q <- qs , q .flags .qcp3b == true })>,
142- <"QCP4" , size ({q | q <- qs , q .flags .qcp4 == true })>,
143- <"QCP5" , size ({q | q <- qs , q .flags .qcp5 == true })>,
144- <"other" , size ({q | q <- qs , q .flags .unclassified == true })>
145- ];
137+ if (!subcases ){
138+ return [
139+ <"QCP1" , size ({q | q <- qs , q .flags .qcp1 == true })>,
140+ <"QCP2" , size ({q | q <- qs , q .flags .qcp2 == true })>,
141+ <"QCP3a" , size ({q | q <- qs , q .flags .qcp3a == true })>,
142+ <"QCP3b" , size ({q | q <- qs , q .flags .qcp3b == true })>,
143+ <"QCP4" , size ({q | q <- qs , q .flags .qcp4 == true })>,
144+ <"other" , size ({q | q <- qs , q .flags .unclassified == true })>
145+ ];
146+ }
147+ else {
148+ return [
149+ <"QCP1" , size ({q | q <- qs , q .flags .qcp1 == true })>,
150+ <"QCP2" , size ({q | q <- qs , q .flags .qcp2 == true })>,
151+ <"QCP3a" , size ({q | q <- qs , q .flags .qcp3a == true })>,
152+ <"QCP3b" , size ({q | q <- qs , q .flags .qcp3b == true })>
153+
154+ ] + getQCP4SubcaseCounts () + [<"other" , size ({q | q <- qs , q .flags .unclassified == true })>];
155+ }
156+ }
157+
158+ private lrel [str , int ] getQCP4SubcaseCounts (){
159+ Corpus corpus = getCorpus ();
160+ qcp4 = readBinaryValueFile (#set [QueryString ], |project://QCPAnalysis/results/lists/qcp4| );
161+ locs = [q .callloc | q <- qcp4 ];
162+ queriesRel = [];
163+ for (p <- corpus , v := corpus [p ]) {
164+ pt = loadBinary (p ,v );
165+ // Get all the calls to mysql_query
166+ queriesRel += [ <c , params > | /c:call(name(name("mysql_query")),params) := pt, c@at in locs];
167+ }
168+
169+
170+ res = [<"QCP4a" , 0 > , <"QCP4b" , 0 > , <"QCP4c" , 0 > ];
171+ for(<q , params > <- queriesRel ){
172+ switch (params ){
173+ case [actualParameter (scalar (encapsed (_)),_)]: res [0 ][1 ] += 1 ;
174+ case [actualParameter (scalar (encapsed (_)), _),_]: res [0 ][1 ] += 1 ;
175+ case [actualParameter (binaryOperation (left ,right ,concat ()),_)]: res [1 ][1 ] += 1 ;
176+ case [actualParameter (binaryOperation (left ,right ,concat ()),_), _]: res [1 ][1 ] += 1 ;
177+ case [actualParameter (var (name (name (_))), _)] : res [2 ][1 ] += 1 ;
178+ case [actualParameter (var (name (name (_))), _), _] : res [2 ][1 ] += 1 ;
179+ default : println ("this is broken" );
180+ }
181+ }
182+ return res ;
146183}
147184
148185public set [QueryString ] getQCP (str id ){
0 commit comments