1 /*
2    Copyright (c) 2015 MariaDB Corporation Ab
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; version 2 of the License.
7 
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12 
13    You should have received a copy of the GNU General Public License
14    along with this program; if not, write to the Free Software
15    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
16 
17 #ifdef USE_PRAGMA_IMPLEMENTATION
18 #pragma implementation				// gcc: Class implementation
19 #endif
20 
21 #include "mariadb.h"
22 #include "sql_priv.h"
23 #include "sql_select.h"
24 #include "my_json_writer.h"
25 
26 void Filesort_tracker::print_json_members(Json_writer *writer)
27 {
28   const char *varied_str= "(varied across executions)";
29 
30   if (!get_r_loops())
31     writer->add_member("r_loops").add_null();
32   else
33     writer->add_member("r_loops").add_ll(get_r_loops());
34 
35   if (get_r_loops() && time_tracker.timed)
36   {
37     writer->add_member("r_total_time_ms").
38             add_double(time_tracker.get_time_ms());
39   }
40   if (r_limit != HA_POS_ERROR)
41   {
42     writer->add_member("r_limit");
43     if (!get_r_loops())
44       writer->add_null();
45     else if (r_limit == 0)
46       writer->add_str(varied_str);
47     else
48       writer->add_ll(r_limit);
49   }
50 
51   writer->add_member("r_used_priority_queue");
52   if (!get_r_loops())
53     writer->add_null();
54   else if (r_used_pq == get_r_loops())
55     writer->add_bool(true);
56   else if (r_used_pq == 0)
57     writer->add_bool(false);
58   else
59     writer->add_str(varied_str);
60 
61   if (!get_r_loops())
62     writer->add_member("r_output_rows").add_null();
63   else
64     writer->add_member("r_output_rows").add_ll(
65                         (longlong) rint((double)r_output_rows / get_r_loops()));
66 
67   if (sort_passes)
68   {
69     writer->add_member("r_sort_passes").add_ll(
70                         (longlong) rint((double)sort_passes / get_r_loops()));
71   }
72 
73   if (sort_buffer_size != 0)
74   {
75     writer->add_member("r_buffer_size");
76     if (sort_buffer_size == ulonglong(-1))
77       writer->add_str(varied_str);
78     else
79       writer->add_size(sort_buffer_size);
80   }
81 }
82 
83