<commit_before>package org.nutz.dao.pager;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import org.nutz.dao.sql.SqlContext;

/**
 * 遍历 RersultSet
 * 
 * @author zozoh(<EMAIL>)
 */
public abstract class ResultSetLooping {

	protected List<Object> list;

	private int index;

	public ResultSetLooping() {
		list = new LinkedList<Object>();
		index = -1;
	}

	public void doLoop(ResultSet rs, SqlContext context) throws SQLException {
		Pager pager = context.getPager();
		if (null == rs)
			return;
		/**
		 * 如果没有设置 Pager 或者 rs 的类型是 ResultSet.TYPE_FORWARD_ONLY，那么<br>
		 * 无法利用 游标的滚动 来计算结果集合大小。这比较高效，但是如果使用者希望得到页数量，<br>
		 * 需要为 Pager 另行计算 总体的结果集大小。
		 * <p>
		 * 一般的，为特殊数据建立的 Pager，生成的 ResultSet 类型应该是 TYPE_FORWARD_ONLY
		 */
		if (null == pager
			|| ResultSet.TYPE_FORWARD_ONLY == rs.getType()
			|| pager.getPageNumber() <= 0) {
			// 根据 Pager 设定 Fetch Size
			if (null != pager && pager.getPageSize() > 0)
				rs.setFetchSize(pager.getPageSize());

			// 循环调用
			while (rs.next()) {
				createObject(++index, rs, context, -1);
			}
		}
		/**
		 * 如果进行到了这个分支，则表示，整个查询的 Pager 是不区分数据库类型的。 <br>
		 * 并且 ResultSet 的游标是可以来回滚动的。
		 * <p>
		 * 所以我就会利用游标的滚动，为你计算整个结果集的大小。比较低效，在很小<br>
		 * 数据量的时候 还是比较有用的
		 */
		else if (rs.last()) {
			// 设置结果集合的 FetchSize
			if (pager.getPageSize() <= 0)
				rs.setFetchSize(Pager.DEFAULT_PAGE_SIZE);
			else if (pager.getPageSize() > Pager.MAX_FETCH_SIZE)
				rs.setFetchSize(Pager.MAX_FETCH_SIZE);
			else
				rs.setFetchSize(pager.getPageSize());

			// 开始循环
			int rowCount = rs.getRow();
			LoopScope ls = LoopScope.eval(pager, rowCount);
			if (rs.absolute(ls.start + 1))<commit_msg>fix issue #172<commit_after>package org.nutz.dao.pager;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import org.nutz.dao.sql.SqlContext;

/**
 * 遍历 RersultSet
 * 
 * @author zozoh(<EMAIL>)
 */
public abstract class ResultSetLooping {

	protected List<Object> list;

	private int index;

	public ResultSetLooping() {
		list = new LinkedList<Object>();
		index = -1;
	}

	public void doLoop(ResultSet rs, SqlContext context) throws SQLException {
		Pager pager = context.getPager();
		if (null == rs)
			return;
		/**
		 * 如果没有设置 Pager 或者 rs 的类型是 ResultSet.TYPE_FORWARD_ONLY，那么<br>
		 * 无法利用 游标的滚动 来计算结果集合大小。这比较高效，但是如果使用者希望得到页数量，<br>
		 * 需要为 Pager 另行计算 总体的结果集大小。
		 * <p>
		 * 一般的，为特殊数据建立的 Pager，生成的 ResultSet 类型应该是 TYPE_FORWARD_ONLY
		 */
		if (null == pager
			|| ResultSet.TYPE_FORWARD_ONLY == rs.getType()
			|| pager.getPageNumber() <= 0) {
			// 根据 Pager 设定 Fetch Size
			// by wendal: 设置与否,影响不大的,而且旧版本的Oracle会出问题,故,注释掉了
			//if (null != pager && pager.getPageSize() > 0)
			//	rs.setFetchSize(pager.getPageSize());

			// 循环调用
			while (rs.next()) {
				createObject(++index, rs, context, -1);
			}
		}
		/**
		 * 如果进行到了这个分支，则表示，整个查询的 Pager 是不区分数据库类型的。 <br>
		 * 并且 ResultSet 的游标是可以来回滚动的。
		 * <p>
		 * 所以我就会利用游标的滚动，为你计算整个结果集的大小。比较低效，在很小<br>
		 * 数据量的时候 还是比较有用的
		 */
		else if (rs.last()) {
			// 设置结果集合的 FetchSize
			if (pager.getPageSize() <= 0)
				rs.setFetchSize(Pager.DEFAULT_PAGE_SIZE);
			else if (pager.getPageSize() > Pager.MAX_FETCH_SIZE)
				rs.setFetchSize(Pager.MAX_FETCH_SIZE);
			else
				rs.setFetchSize(pager.getPageSize());

			// 开始循环
			int rowCount = rs.getRow();
			LoopScope ls = LoopScope.eval(pager, rowCount);
			if (rs.absolute(ls.start + 1))
{'fraction_non_alphanumeric': 0.1393992417614465, 'fraction_numerical': 0.004374453193350831, 'mean_word_length': 3.5013123359580054, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1551790', 'n_tokens_mistral': 1763, 'n_tokens_neox': 1651, 'n_words': 264}