java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularPrefetchingFormatter.java
author František Kučera <franta-hg@frantovo.cz>
Sat, 28 Dec 2013 12:19:39 +0100
branchv_0
changeset 88 102ba0fcb07f
child 142 da1e38386d84
permissions -rw-r--r--
TabularPrefetchingFormatter: prefetch whole result set to avoid value overflow the cell
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 info.globalcode.sql.dk.Parameter;
franta-hg@88
    21
import java.util.ArrayList;
franta-hg@88
    22
import java.util.List;
franta-hg@88
    23
franta-hg@88
    24
/**
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@88
    27
 *
franta-hg@88
    28
 * Long values will not overflow the cells, but whole result set must be loaded into memory.
franta-hg@88
    29
 *
franta-hg@88
    30
 * @author Ing. František Kučera (frantovo.cz)
franta-hg@88
    31
 */
franta-hg@88
    32
public class TabularPrefetchingFormatter extends TabularFormatter {
franta-hg@88
    33
franta-hg@88
    34
	public static final String NAME = "tabular-prefetching"; // bash-completion:formatter
franta-hg@88
    35
	private String currentSql;
franta-hg@88
    36
	private List<? extends Parameter> currentParameters;
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@88
    57
	public void writeStartResultSet() {
franta-hg@88
    58
		currentResultSet = new ArrayList<>();
franta-hg@88
    59
	}
franta-hg@88
    60
franta-hg@88
    61
	@Override
franta-hg@88
    62
	public void writeQuery(String sql) {
franta-hg@88
    63
		currentSql = sql;
franta-hg@88
    64
	}
franta-hg@88
    65
franta-hg@88
    66
	@Override
franta-hg@88
    67
	public void writeParameters(List<? extends Parameter> parameters) {
franta-hg@88
    68
		currentParameters = parameters;
franta-hg@88
    69
	}
franta-hg@88
    70
franta-hg@88
    71
	@Override
franta-hg@88
    72
	public void writeColumnsHeader(ColumnsHeader header) {
franta-hg@88
    73
		currentHeader = header;
franta-hg@88
    74
		initColumnWidths(header.getColumnCount());
franta-hg@88
    75
	}
franta-hg@88
    76
franta-hg@88
    77
	@Override
franta-hg@88
    78
	public void writeStartRow() {
franta-hg@88
    79
		currentRow = new Object[currentHeader.getColumnCount()];
franta-hg@88
    80
		currentResultSet.add(currentRow);
franta-hg@88
    81
		currentColumnsCount = 0;
franta-hg@88
    82
	}
franta-hg@88
    83
franta-hg@88
    84
	@Override
franta-hg@88
    85
	public void writeColumnValue(Object value) {
franta-hg@88
    86
		currentRow[currentColumnsCount] = value;
franta-hg@88
    87
		currentColumnsCount++;
franta-hg@88
    88
		String textRepresentation = toString(value);
franta-hg@88
    89
		/** TODO: count only printable characters (currently not an issue) */
franta-hg@88
    90
		updateColumnWidth(currentColumnsCount, textRepresentation.length());
franta-hg@88
    91
	}
franta-hg@88
    92
franta-hg@88
    93
	@Override
franta-hg@88
    94
	public void writeEndRow() {
franta-hg@88
    95
		// do nothing
franta-hg@88
    96
	}
franta-hg@88
    97
franta-hg@88
    98
	@Override
franta-hg@88
    99
	public void writeEndResultSet() {
franta-hg@88
   100
		prefetchDone = true;
franta-hg@88
   101
franta-hg@88
   102
		super.writeStartResultSet();
franta-hg@88
   103
		super.writeQuery(currentSql);
franta-hg@88
   104
		super.writeParameters(currentParameters);
franta-hg@88
   105
		super.writeColumnsHeader(currentHeader);
franta-hg@88
   106
franta-hg@88
   107
		for (Object[] row : currentResultSet) {
franta-hg@88
   108
			super.writeStartRow();
franta-hg@88
   109
			for (Object cell : row) {
franta-hg@88
   110
				super.writeColumnValue(cell);
franta-hg@88
   111
			}
franta-hg@88
   112
			super.writeEndRow();
franta-hg@88
   113
		}
franta-hg@88
   114
franta-hg@88
   115
		currentColumnsCount = 0;
franta-hg@88
   116
		currentSql = null;
franta-hg@88
   117
		currentParameters = null;
franta-hg@88
   118
		currentHeader = null;
franta-hg@88
   119
		currentRow = null;
franta-hg@88
   120
		currentResultSet = null;
franta-hg@88
   121
		super.writeEndResultSet();
franta-hg@88
   122
		prefetchDone = false;
franta-hg@88
   123
	}
franta-hg@88
   124
}