java/sql-dk/src/main/java/info/globalcode/sql/dk/formatting/TabularPrefetchingFormatter.java
author František Kučera <franta-hg@frantovo.cz>
Thu, 24 Oct 2019 21:43:08 +0200
branchv_0
changeset 250 aae5009bd0af
parent 238 4a1864c3e867
permissions -rw-r--r--
fix license version: GNU GPLv3
franta-hg@88
     1
/**
franta-hg@88
     2
 * SQL-DK
franta-hg@88
     3
 * Copyright © 2013 František Kučera (frantovo.cz)
franta-hg@88
     4
 *
franta-hg@88
     5
 * This program is free software: you can redistribute it and/or modify
franta-hg@88
     6
 * it under the terms of the GNU General Public License as published by
franta-hg@250
     7
 * the Free Software Foundation, version 3 of the License.
franta-hg@88
     8
 *
franta-hg@88
     9
 * This program is distributed in the hope that it will be useful,
franta-hg@88
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
franta-hg@88
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
franta-hg@88
    12
 * GNU General Public License for more details.
franta-hg@88
    13
 *
franta-hg@88
    14
 * You should have received a copy of the GNU General Public License
franta-hg@88
    15
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
franta-hg@88
    16
 */
franta-hg@88
    17
package info.globalcode.sql.dk.formatting;
franta-hg@88
    18
franta-hg@88
    19
import java.util.ArrayList;
franta-hg@88
    20
import java.util.List;
franta-hg@88
    21
franta-hg@88
    22
/**
franta-hg@155
    23
 * <p>
franta-hg@88
    24
 * Prefetches whole result set and computes column widths. Whole table is flushed at once in
franta-hg@88
    25
 * {@linkplain #writeEndResultSet()}.
franta-hg@155
    26
 * </p>
franta-hg@88
    27
 *
franta-hg@155
    28
 * <p>
franta-hg@155
    29
 * Long values will not overflow the cells, but whole result set must be loaded into the memory.
franta-hg@155
    30
 * </p>
franta-hg@88
    31
 *
franta-hg@88
    32
 * @author Ing. František Kučera (frantovo.cz)
franta-hg@88
    33
 */
franta-hg@88
    34
public class TabularPrefetchingFormatter extends TabularFormatter {
franta-hg@88
    35
franta-hg@88
    36
	public static final String NAME = "tabular-prefetching"; // bash-completion:formatter
franta-hg@88
    37
	private ColumnsHeader currentHeader;
franta-hg@88
    38
	private List<Object[]> currentResultSet;
franta-hg@88
    39
	private Object[] currentRow;
franta-hg@88
    40
	private int currentColumnsCount;
franta-hg@88
    41
	private boolean prefetchDone = false;
franta-hg@88
    42
franta-hg@88
    43
	public TabularPrefetchingFormatter(FormatterContext formatterContext) {
franta-hg@88
    44
		super(formatterContext);
franta-hg@88
    45
	}
franta-hg@88
    46
franta-hg@88
    47
	@Override
franta-hg@88
    48
	protected int getCurrentColumnsCount() {
franta-hg@88
    49
		if (prefetchDone) {
franta-hg@88
    50
			return super.getCurrentColumnsCount();
franta-hg@88
    51
		} else {
franta-hg@88
    52
			return currentColumnsCount;
franta-hg@88
    53
		}
franta-hg@88
    54
	}
franta-hg@88
    55
franta-hg@88
    56
	@Override
franta-hg@142
    57
	public void writeStartResultSet(ColumnsHeader header) {
franta-hg@88
    58
		currentResultSet = new ArrayList<>();
franta-hg@88
    59
		currentHeader = header;
franta-hg@88
    60
		initColumnWidths(header.getColumnCount());
franta-hg@88
    61
	}
franta-hg@88
    62
franta-hg@88
    63
	@Override
franta-hg@88
    64
	public void writeStartRow() {
franta-hg@88
    65
		currentRow = new Object[currentHeader.getColumnCount()];
franta-hg@88
    66
		currentResultSet.add(currentRow);
franta-hg@88
    67
		currentColumnsCount = 0;
franta-hg@88
    68
	}
franta-hg@88
    69
franta-hg@88
    70
	@Override
franta-hg@88
    71
	public void writeColumnValue(Object value) {
franta-hg@88
    72
		currentRow[currentColumnsCount] = value;
franta-hg@88
    73
		currentColumnsCount++;
franta-hg@88
    74
		String textRepresentation = toString(value);
franta-hg@88
    75
		/** TODO: count only printable characters (currently not an issue) */
franta-hg@88
    76
		updateColumnWidth(currentColumnsCount, textRepresentation.length());
franta-hg@88
    77
	}
franta-hg@88
    78
franta-hg@88
    79
	@Override
franta-hg@88
    80
	public void writeEndRow() {
franta-hg@88
    81
		// do nothing
franta-hg@88
    82
	}
franta-hg@88
    83
franta-hg@88
    84
	@Override
franta-hg@88
    85
	public void writeEndResultSet() {
franta-hg@88
    86
		prefetchDone = true;
franta-hg@88
    87
franta-hg@224
    88
		postprocessPrefetchedResultSet(currentHeader, currentResultSet);
franta-hg@224
    89
franta-hg@142
    90
		super.writeStartResultSet(currentHeader);
franta-hg@88
    91
franta-hg@88
    92
		for (Object[] row : currentResultSet) {
franta-hg@88
    93
			super.writeStartRow();
franta-hg@88
    94
			for (Object cell : row) {
franta-hg@88
    95
				super.writeColumnValue(cell);
franta-hg@88
    96
			}
franta-hg@88
    97
			super.writeEndRow();
franta-hg@88
    98
		}
franta-hg@88
    99
franta-hg@88
   100
		currentColumnsCount = 0;
franta-hg@88
   101
		currentHeader = null;
franta-hg@88
   102
		currentRow = null;
franta-hg@88
   103
		currentResultSet = null;
franta-hg@88
   104
		super.writeEndResultSet();
franta-hg@88
   105
		prefetchDone = false;
franta-hg@88
   106
	}
franta-hg@224
   107
franta-hg@224
   108
	/**
franta-hg@224
   109
	 * Optional post-processing – override in sub-classes if needed.
franta-hg@224
   110
	 * Don't forget to {@linkplain #updateColumnWidth(int, int)}
franta-hg@224
   111
	 *
franta-hg@224
   112
	 * @param currentHeader
franta-hg@224
   113
	 * @param currentResultSet
franta-hg@224
   114
	 */
franta-hg@224
   115
	protected void postprocessPrefetchedResultSet(ColumnsHeader currentHeader, List<Object[]> currentResultSet) {
franta-hg@224
   116
	}
franta-hg@224
   117
franta-hg@88
   118
}