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