jOOQ中一个鲜为人知的功能是 [Formattable.formatChart()](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Formattable.html#formatChart())
的能力,它允许将任何jOOQ结果格式化为ASCII图表。这对于在你的控制台应用程序中快速绘制结果非常有用。
假设你有一个这种形式的结果集(当你调用result.format()
或只调用result.toString()
时,你得到的就是这种结果)。
+---+---+---+---+
|c | v1| v2| v3|
+---+---+---+---+
|a | 1| 2| 3|
|b | 2| 1| 1|
|c | 4| 0| 1|
+---+---+---+---+
这个结果可以由任何查询产生,或者你可以不执行这样的查询来构建它。
Field<String> c = field("c", VARCHAR);
Field<Integer> v1 = field("v1", INTEGER);
Field<Integer> v2 = field("v2", INTEGER);
Field<Integer> v3 = field("v3", INTEGER);
Result<Record4<String, Integer, Integer, Integer>> result =
create.newResult(c, v1, v2, v3);
result.add(create.newRecord(c, v1, v2, v3).values("a", 1, 2, 3));
result.add(create.newRecord(c, v1, v2, v3).values("b", 2, 1, 1));
result.add(create.newRecord(c, v1, v2, v3).values("c", 4, 0, 1));
然后,调用result.formatChart()
,将产生一个漂亮的ASCII图表,默认情况下是这样的。
4.00| █████████████████████████
3.86| █████████████████████████
3.73| █████████████████████████
3.59| █████████████████████████
3.45| █████████████████████████
3.32| █████████████████████████
3.18| █████████████████████████
3.05| █████████████████████████
2.91| █████████████████████████
2.77| █████████████████████████
2.64| █████████████████████████
2.50| █████████████████████████
2.36| █████████████████████████
2.23| █████████████████████████
2.09| █████████████████████████
1.95| ██████████████████████████████████████████████████
1.82| ██████████████████████████████████████████████████
1.68| ██████████████████████████████████████████████████
1.55| ██████████████████████████████████████████████████
1.41| ██████████████████████████████████████████████████
1.27| ██████████████████████████████████████████████████
1.14| ██████████████████████████████████████████████████
1.00|███████████████████████████████████████████████████████████████████████████
----+---------------------------------------------------------------------------
| a b c
它包括第一列作为X轴上的类别标签,以及第二列作为Y轴上要绘制的数值。你可以对各种配置进行调整,包括高度和宽度。
result.formatChart(new ChartFormat().dimensions(6, 20));
为了得到这个小得多的图表。
4.00| █████
3.00| █████
2.00| ██████████
1.00|███████████████
----+---------------
| a b c
要在堆积图中包括其他数值列的数值(这是默认的),请写。
result.formatChart(new ChartFormat()
.dimensions(40, 8)
.values(1, 2, 3)
);
制作。
6.00|▒▒▒▒▒▒▒▒▒▒▒▒
5.00|▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒
4.00|▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒███████████
3.00|▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███████████
2.00|▓▓▓▓▓▓▓▓▓▓▓▓███████████████████████
1.00|███████████████████████████████████
----+-----------------------------------
| a b c
如果那些来自可爱的90年代MS-DOS和BBS时代的默认ASCII字符与你的字体不一致(例如在这个博客上),你可以像这样切换它们。
result.formatChart(new ChartFormat()
.dimensions(40, 8)
.values(1, 2, 3)
.shades('@', 'o', '.')
);
而现在你得到了。
6.00|............
5.00|............ ...........
4.00|........................@@@@@@@@@@@
3.00|oooooooooooooooooooooooo@@@@@@@@@@@
2.00|oooooooooooo@@@@@@@@@@@@@@@@@@@@@@@
1.00|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
----+-----------------------------------
| a b c
更喜欢显示100%的图表?没有问题
result.formatChart(new ChartFormat()
.dimensions(40, 8)
.values(1, 2, 3)
.shades('@', 'o', '.')
.display(Display.HUNDRED_PERCENT_STACKED)
);
而现在,结果是。
100.00%|................................
80.00%|......................@@@@@@@@@@
60.00%|...........ooooooooooo@@@@@@@@@@
40.00%|ooooooooooo@@@@@@@@@@@@@@@@@@@@@
20.00%|ooooooooooo@@@@@@@@@@@@@@@@@@@@@
0.00%|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-------+--------------------------------
| a b c
谁需要MS Excel?没有人,如果你有jOOQ!