/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
// 学習状況(ユーザ一覧)ログ取得クラス
// 
//
//	変更履歴
//	2004.01.08 新規作成		ishizaki
//

package jp.co.ntt.lms.xms.logsumup;

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

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.util.XMODate;
import jp.co.ntt.lms.xms.common.util.StringUtil;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;

/**
 * 学習状況(ユーザ一覧)ログ取得クラス
 * 
 * <pre>
 * 	ユーザ一覧では次の形式で取得項目をわけます
 * 
 * コンテナが選ばれた時は 学習開始日時,最終アクセス日時, 総アクセス回数（回）,累積滞在時間（分）,完了LO数(%),合格LO数(%)
 * 教材が選ばれた時は 学習開始日時,最終アクセス日時,総アクセス回数（回）, 累積滞在時間（分）, 最新得点(%), 最高得点(%),完了,合格
 * 
 * 
 * </pre>
 * 
 * @author ishizaki
 * 
 */
public class LoLogLearnUserStatusLogic extends LoLogLearnStatusLogic {

	/**
	 * コンストラクタ検索条件を設定する
	 * Constructor for LoLogLearnUserStatusLogic.
	 * @param action 		選択の仕方(グループ/コンテナ,グループ/教材,ユーザ/コンテナ,ユーザ/教材)
	 * @param loId 			LOID	
	 * @param loIdList 		LOIDのリスト(コンテナ指定の場合そのLOIDのリスト
	 * @param userId 		ユーザＩＤ
	 * @param geroupIdList	グループIDのリスト(グループが選ばれた場合グループの下のリスト)
	 * @param userCount 	グループの下にいるユーザの人数
	 * @param loCount  	 	コンテナの下にあるLOの数
	 *
	 * @exception XmsException
	 */
	public LoLogLearnUserStatusLogic(
		LoLogLearnStatusParam param,
		int action,
		String loId,
		List loIdList,
		String userId,
		List groupIdList,
		int userCount,
		int loCount)
		throws XmsException {
		super(param,action,loId,loIdList,userId,groupIdList,userCount,loCount);
	}


	//---------------------------------- LoLogLearnStatusLogicのabstractメソッド実装メソッドstart ------

	/**
	 * アサイン情報を取得しLoLogResultに反映させる.
	 * 
	 * @param result 学習状況LogResultオブジェクト
	 * @param subordinateFlg 直下配下フラグ
	 * @return アサイン情報反映後のLoLogLearnStatusResult
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusLogic#doAssain(LoLogLearnStatusResult, LoLogLearnStatusParam)
	 */
	public LoLogLearnStatusResult doAssain(
		LoLogLearnStatusResult result,
		String subordinateFlg)
		throws XmsException {
		try {
			//////////////////////////////////////////////////
			//アサイン情報取得用パラメータの作成
			/////////////////////////////////////////////////
			String userId = null; //ユーザＩＤ
			String groupId = null; //グループID
			String loId = getLoId(); //loId
			int type = 0; //ユーザ一覧の場合は0(選択されたLOをチェック)

			switch (getAction()) {
				//グループ/コンテナまたはグループ/教材
				case LoLogConstant.LOG_SELECT_G_C :
				case LoLogConstant.LOG_SELECT_G_M :
					groupId = getUserId(); //グループを選んだ場合はuserIdがグループＩＤである
					loId = getLoId(); //LOIDの設定	　
					break;

				//ユーザ/コンテナ
				case LoLogConstant.LOG_SELECT_U_C :
					userId = getUserId(); //ユーザIDの設定
					groupId = getBelonggroupid(); //所属グループIDを設定
					break;
				//ユーザ/教材
				case LoLogConstant.LOG_SELECT_U_M :
						return result;

				default :
					break;
			}

			//アサイン情報の取得
			AssignmentsClient client = new AssignmentsClient();
			client.getAssignInfo(userId, groupId, loId, type, subordinateFlg);

			result.beforeFirst(); //カーソルを一行へ
			//アサインがあるかないか判断しLogResultに設定する
			int index = 0;
			while (result.next()) {
				String sub_userId = result.getId();
				if (client.isAssign(sub_userId, loId)) {
					//アサイン有り
					result.setAssain(index, "1");
				} else {
					//アサイン無し
					result.setAssain(index, "0");
				}
				index++;
			}
			return result;
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}

	/****
	 * ユーザ一覧のデータの取得を行う.
	 * 
	 * SQLでIN句が1000を越える場合は引数logの末尾にデータが追加される<BR>
	 * 
	 * 
	 * その他<br>
	 * デバックモード10でSQLの中身をデバック
	 * 
	 * 
	 * @param log ログ結果格納クラス
	 * @param dataAccess データアクセスクラス
	 * @param sql 実行するSQL
	 * @param SQLのIN句が1000を越える場合のgetLog実行が何回目であるか
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusLogic#getLog(DataAccess, String)
	 */
	public LoLogLearnStatusResult getLog(LoLogLearnStatusResult log, DataAccess dataAccess, String sql, int sqlCount)
		throws XmsException {

		ResultSet rs = null;

		String dateStart = null;				//学習開始日時
		String dateLast = null;				//最終アクセス日時
		String totalAccess = null;				//総アクセス回数
		String totalLearnTime = null;			//累積滞在時間
		String matComplete = null;				//完了LO数
		String matPass = null;					//合格LO数
		String matNewestScore = null;			//最新得点
		String matHighScore = null;			//最高得点
		String completeCondition = null;		//完了
		String passCondition = null;			//合格
		String userCompleteCondition = null;	//完了者数
		String userPass = null;				//合格者数
		String id = null;						//ユーザまたはLOのＩＤ
		String name = null;					//ユーザまたはLOの名称
		String affiliationGroup = null;		//ユーザの所属するグループのパス
		String groupForeinId = null;			//ユーザの所属するグループの外部ＩＤ
		String foreinId = null;				//ユーザまたはＬＯの外部ＩＤ
		String fullScore = null;				//総得点
		String matCompletePercent = null;		//完了LO数パーセント
		String matPassPercent = null;			//合格LO数パーセント
		String userCompleteConditionPercent = null;	//完了者数パーセント
		String userPassPercent = null;			//合格者数パーセント
		String totalLoCount = null;			//総LO数
		String totalUserCount = null;			//総ユーザ数
		String newScorePercent = null;			//最新得点パーセント
		String highScorePercent = null;		//最高得点パーセント
		String assain = null;					//アサイン
		String groupId = null;					//グループID


		try {
			//SQLの中身をデバック
			DebugLog.write(this.getClass(),sql,DebugLog.ROW );


			rs = dataAccess.executeQuery(sql);

			
			while(rs.next()){
				//ユーザ名の取得
				name = ChangeEncode.setChar(rs.getString("UserName"));				
				//外部ユーザID
				foreinId = ChangeEncode.setChar(rs.getString("UserForeignID"));
				//所属グループ
				affiliationGroup = ChangeEncode.setChar(rs.getString("GroupName"));
				//所属外部グループＩＤ
				groupForeinId = ChangeEncode.setChar(rs.getString("GroupForeignID"));
				//学習開始日
				dateStart = XMODate.parseTime(rs.getTimestamp("StartDate"));
				//最終アクセス日時
				dateLast =  XMODate.parseTime(rs.getTimestamp("LastDate"));
				//最終アクセス回数リスト
				totalAccess = ChangeEncode.setChar(rs.getString("AccessCount"));
				//完了ＬＯ数
				matComplete = ChangeEncode.setChar(rs.getString("CompleteCount"));
				//完了ＬＯ数パーセント
				matCompletePercent = ChangeEncode.setChar(rs.getString("CompleteCountRate"));	
				//合格ＬＯ数
				matPass = ChangeEncode.setChar(rs.getString("PassCount"));
				//合格ＬＯ数パーセント
				matPassPercent = ChangeEncode.setChar(rs.getString("PassCountRate"));		
				//累積滞在時間
				totalLearnTime = ChangeEncode.setChar(rs.getString("LearnTime"));
				//最新得点
				matNewestScore = ChangeEncode.setChar(String.valueOf(rs.getLong("ExecisePoint")));
				//最高得点
				matHighScore = ChangeEncode.setChar(String.valueOf(rs.getLong("HighScore")));
				//総得点
				fullScore = ChangeEncode.setChar(String.valueOf(rs.getLong("FullScore")));
				//完了
				completeCondition = ChangeEncode.setChar(rs.getString("IsComplete"));
				//合格
				passCondition = ChangeEncode.setChar(rs.getString("IsPass"));

				//ユーザＩＤの取得
				id = ChangeEncode.setChar(rs.getString("UserID"));
				//グループＩＤ
				groupId = ChangeEncode.setChar(rs.getString("GroupID"));
				//最新得点パーセント
				newScorePercent = ChangeEncode.setChar(String.valueOf(rs.getLong("ExecisePointRate")));
				//最高得点パーセント
				highScorePercent = ChangeEncode.setChar(String.valueOf(rs.getLong("HighScoreRate")));
				totalLoCount =  String.valueOf(super.loCount);
				totalUserCount = String.valueOf(super.userCount);
				
				 //LogResultに値をセット
				log.addLog(
					    dateStart,
						dateLast,
						totalAccess,
						totalLearnTime,
						matComplete,
						matPass,
						matNewestScore,
						matHighScore,
						completeCondition,
						passCondition,
						userCompleteCondition,
						userPass,
						id,
						name,
						affiliationGroup,
						groupForeinId,
						foreinId,
						fullScore,
						matCompletePercent,
						matPassPercent,
						userCompleteConditionPercent,
						userPassPercent,
						totalLoCount,
						totalUserCount,
						newScorePercent,
						highScorePercent,
						assain,
						groupId
						
					);

			}
			
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (Exception e) {
						throw new XmsSystemException( e );
				}
				rs = null;
			}
		}	

		return log;
	}


	/**
	 * グループ/コンテナを選択した場合のSQL文を返却する.
	 * 
	 * @param inGroup グループIDのIN句 IN(グループID,グループID,グループID,......)
	 * @param loId    コンテナのloId
	 * @return グループ/コンテナを選択した場合のSQL文
	 * @exception XmsException
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusLogic#getGroupContainerSql(String inGroup,String loId)
	 */
	public String getGroupContainerSql(String inGroup,String loId) throws XmsException{
		try {

			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			StringBuffer sql = new StringBuffer();
			//select SQL
			sql.append(getSelectSql());
			sql.append(" WHERE ");

			//グループＩＤの指定IN('GR000001'GR000002'...)
			sql.append(" p.ParentID ");
			sql.append(inGroup);

			sql.append(" ) L ");

			//メニュー画面から来た場合
			if(super.isFirst){
				//全件表示する
				sql.append(" LEFT OUTER JOIN ");
			}else{
				sql.append(" INNER JOIN ");
			
			}

			//内側のselect条件
			sql.append(getInnerSelectSql(loId));

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )) {
				sql.append(" WHERE ");

				//グループＩＤの指定IN('GR000001'GR000002'...)
				sql.append(" p.ParentID ");
				sql.append(inGroup);

				//コンテナ指定
				sql.append(" AND ");
				sql.append(  " l.ParentID = '");
				sql.append(    StringEscapeUtils.escapeSql(loId));
				sql.append(  "'");
			
			//GROUP BY
				sql.append(" GROUP BY ALL ");
			//Oracleの場合 OR PostgreSQLの場合
			} else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sql.append(" WHERE ");
				//グループＩＤの指定IN('GR000001'GR000002'...)
				sql.append(" p.ParentID ");
				sql.append(inGroup);

				// コンテナ指定
				sql.append(" AND ");
				sql.append(" ( ");
				sql.append(  " l.ParentID = '");
				sql.append(    StringEscapeUtils.escapeSql(loId));
				sql.append(  "'");

				//メニューからではくnullプラス条件に一致
				if (this.isFirst == false && this.isAllDisp()) {
					sql.append(" OR ");
					sql.append(" l.ParentID IS NULL ");
				}
				sql.append(" ) ");

				//GROUP BY
				sql.append(" GROUP BY ");
			}

			sql.append(" p.ParentForeignID,p.ParentID,p.ParentName,p.ChildName,p.ChildForeignID,p.ChildID ");
			sql.append(" HAVING ");

			//グループＩＤの指定IN('GR000001'GR000002'...)
			sql.append(" p.ParentID ");
			sql.append(inGroup);

			//グルーピング条件指定(検索条件オプション)
			sql.append(super.getGroupingSql());

			//メニューからきたのではなく条件+NULLを表示
			if(super.isFirst== false && isAllDisp()){
				sql.append(" OR ");
				sql.append(" ( ");
				
				//グループＩＤの指定IN('GR000001'GR000002'...)
				sql.append(" p.ParentID ");
				sql.append(inGroup);

				sql.append(" AND ");
				sql.append(" MIN(lg.study_start_date) IS NULL ");        
				sql.append(" ) ");        
				
			}
							
			sql.append(" ) R ");	 				
			sql.append(" ON ");	 				
			sql.append(" L.UserID = R.UserID ");	 				
    		sql.append(" AND ");
    		sql.append(" L.GroupID = R.GroupID ");
    		
			sql.append(" ORDER BY L.UserForeignID ");	 				
			
			return sql.toString();
		} catch(XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		
	}

	/**
	 * グループ/教材を選択した場合のSQL文を取得する.
	 * 
	 * @param inGroup グループIDのIN句 IN(グループID,グループID,グループID,......)
	 * @param loId    教材のloId
	 * @return グループ/コンテナを選択した場合のSQL文
	 * @exception XmsException
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusLogic#getGroupMateriallSql()
	 */
	public String getGroupMateriallSql(String inGroup, String loId)
		throws XmsException {
		try {
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			StringBuffer sql = new StringBuffer();
			//select SQL
			sql.append(getSelectSql());
			sql.append(" WHERE ");

			//グループＩＤの指定IN('GR000001'GR000002'...)
			sql.append(" p.ParentID ");
			sql.append(inGroup);

			sql.append(" ) L ");

			//メニューから来た場合は全件表示する
			if (super.isFirst) {
				//全件表示する
				sql.append(" LEFT OUTER JOIN ");
			} else {
				sql.append(" INNER JOIN ");

			}
			
			//内側のselect条件
			sql.append(getInnerSelectSql(loId));

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )) {
				sql.append(" WHERE ");

				//グループＩＤの指定IN('GR000001'GR000002'...)
				sql.append(" p.ParentID ");
				sql.append(inGroup);


				//教材ＩＤ指定
				sql.append(" AND ");
				sql.append(" l.ChildID= '");
				sql.append(StringEscapeUtils.escapeSql(loId));
				sql.append("'");
			
				//GROUP BY
				sql.append(" GROUP BY ALL ");
			//Oracleの場合 OR PostgreSQLの場合
			} else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sql.append(" WHERE ");

				//グループＩＤの指定IN('GR000001'GR000002'...)
				sql.append(" p.ParentID ");
				sql.append(inGroup);


				//教材ＩＤ指定
				sql.append(" AND ");
				sql.append(" ( ");
				sql.append(" l.ChildID= '");
				sql.append(StringEscapeUtils.escapeSql(loId));
				sql.append("'");

				//メニューからではくnullプラス条件に一致
				if (this.isFirst == false && this.isAllDisp()) {
					sql.append(" OR ");
					sql.append(" l.ParentID IS NULL ");
				}
				sql.append(" ) ");

				//GROUP BY
				sql.append(" GROUP BY ");
			}

			sql.append(
				" p.ParentForeignID,p.ParentID,p.ParentName,p.ChildName,p.ChildForeignID,p.ChildID ");
			sql.append(" HAVING ");

			//グループＩＤの指定IN('GR000001'GR000002'...)
			sql.append(" p.ParentID ");
			sql.append(inGroup);

			//グルーピング条件指定(検索条件オプション)
			sql.append(super.getGroupingSql());
			
			//メニューからきたのではなく全件表示 + nullも表示
			if(super.isFirst== false && isAllDisp()){
				sql.append(" OR ");
				sql.append(" ( ");

				//グループＩＤの指定IN('GR000001'GR000002'...)
				sql.append(" p.ParentID ");
				sql.append(inGroup);

				sql.append(" AND ");
				sql.append(" MIN(lg.study_start_date) IS NULL ");        
				sql.append(" ) ");        
				
			}


			sql.append(" ) R ");
			sql.append(" ON ");
			sql.append(" L.UserID = R.UserID ");
    		sql.append(" AND ");
    		sql.append(" L.GroupID = R.GroupID ");
			sql.append(" ORDER BY L.UserForeignID ");
			return sql.toString();

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 
	 * ユーザ/コンテナを選択した場合のSQL文を取得する.
	 * 
	 * @param belonggroupid ユーザが所属しているグループID
	 * @return ユーザ/コンテナを選択した場合のSQL文
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusLogic#getUserContainerSql()
	 * @exception XmsException
	 */
	public String getUserContainerSql(String userId, String loId,String belonggroupid)throws XmsException{
		try {
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();
			
			StringBuffer sql = new StringBuffer();
			//select SQL
			sql.append(getSelectSql());
			sql.append(" WHERE ");

			//ユーザIDの指定
			sql.append(" p.ChildID = '");
			sql.append(StringEscapeUtils.escapeSql(userId));
			sql.append("'");
			
			//コンテナ指定
// 学習者の場合（所属グループIDが送信されてこない場合）条件に含めない
			if ( StringUtil.isNullString(belonggroupid) == false ) {
				sql.append(" AND ");
				sql.append(" p.ParentID = '");
				
				//ユーザの所属しているグループ
				sql.append(StringEscapeUtils.escapeSql(belonggroupid));
				sql.append("'");
			}
			
			sql.append(" ) L ");
			
			//メニュー画面から来た
			if (super.isFirst) {
				//全件表示する
				sql.append(" LEFT OUTER JOIN ");
			} else {
				sql.append(" INNER JOIN ");
			
			}
			
			//内側のselect条件
			sql.append(getInnerSelectSql(loId));

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )) {
				sql.append(" WHERE ");
				sql.append(" p.ChildID = '");
				sql.append(StringEscapeUtils.escapeSql(userId));
				sql.append("'");

				//コンテナ指定
				sql.append(" AND ");
				sql.append("  l.ParentID = '");
				sql.append(StringEscapeUtils.escapeSql(loId));
				sql.append("'");

				//GROUP BY
				sql.append(" GROUP BY ALL ");
			//Oracleの場合 OR PostgreSQLの場合
			} else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sql.append(" WHERE ");

				sql.append(" p.ChildID = '");
				sql.append(StringEscapeUtils.escapeSql(userId));
				sql.append("'");

				//コンテナ指定
				sql.append(" AND ");
				sql.append(" ( ");
				sql.append("  l.ParentID = '");
				sql.append(StringEscapeUtils.escapeSql(loId));
				sql.append("'");

				//メニューからではくnullプラス条件に一致
				if (this.isFirst == false && this.isAllDisp()) {
					sql.append(" OR ");
					sql.append(" l.ParentID IS NULL ");
				}
				sql.append(" ) ");

				//GROUP BY
				sql.append(" GROUP BY ");
			}

			sql.append(" p.ParentForeignID,p.ParentID,p.ParentName,p.ChildName,p.ChildForeignID,p.ChildID ");
			sql.append(" HAVING ");
			
			//ユーザＩＤ指定
			sql.append(" p.ChildID = '");
			sql.append(StringEscapeUtils.escapeSql(userId));
			sql.append("'");
			
			//グルーピング条件指定(検索条件のオプション指定)
			sql.append(super.getGroupingSql());				
			if(super.isFirst== false && isAllDisp()){
				sql.append(" OR ");
				sql.append(" ( ");
				sql.append(" p.ChildID = '");
				sql.append(StringEscapeUtils.escapeSql(userId));
				sql.append("'");
				sql.append(" AND ");
				sql.append(" MIN(lg.study_start_date) IS NULL ");        
				sql.append(" ) ");        
				
			}


			sql.append(" ) R ");
			sql.append(" ON ");
			sql.append(" L.UserID = R.UserID ");
			if (userId.equals("PE000000") == false) {
				sql.append(" AND ");
				sql.append(" L.GroupID = R.GroupID ");
			}
			sql.append(" ORDER BY L.UserForeignID ");
			
			return sql.toString();
		} catch(XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		

	}

	/**
	 * ユーザ/教材を選択した場合のSQL文を返却する
	 * 
	 * ユーザ一覧の時はユーザ/教材タイプはないので実装しない
	 * 
	 * @param userId ユーザID
	 * @param loId   教材のloId
	 * @param belonggroupid ユーザが所属しているグループID
	 * @return 教材/コンテナを選択した場合のSQL文
	 * @exception XmsException
	 * 
	 * @see jp.co.ntt.lms.xms.logsumup.LoLogLearnStatusLogic#getUserMateriallSql()
	 */
	public String getUserMateriallSql(String userId, String loId,String belonggroupid)throws XmsException{
		//ユーザ/教材タイプはないので実装しない
		return null;
	}


	//---------------------------------- LoLogLearnStatusLogicのabstractメソッド実装メソッドend ------


	/**
	 * ネストしたSQLの内側のSELECT文を返却する.
	 *
	 * 
	 * @return ネストしたSQLの内側のSELECT文
	 * @exception XmsException
	 */
	private String getInnerSelectSql(String loId)throws XmsException{
		try {

			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			StringBuffer sql = new StringBuffer();		
			sql.append(" ( ");	 				
			sql.append(" SELECT ");	 				
			sql.append(" p.ChildName AS UserName, ");					// ユーザ名 	 				
			sql.append(" p.ChildForeignID AS UserForeignID,  ");		// 外部ユーザID 	 				
			sql.append(" p.ParentName AS GroupName, ");					// 所属グループ  				
			sql.append(" p.ParentForeignID AS GroupForeignID, ");		// 外部グループID 	 				
			sql.append(" MIN(lg.study_start_date) AS StartDate, ");		// 学習開始日時  				
			sql.append(" MAX(lg.last_access) AS LastDate, ");			// 最終アクセス日時 	 				
			sql.append(" SUM(lg.Access_cnt) AS AccessCount, ");			// 総アクセス回数  				

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )) {
				sql.append(" COUNT(DISTINCT(CASE WHEN lg.study_end_date IS NOT NULL THEN '1' + l.ChildID END)) AS CompleteCount, ");// 完了LO数 	 				
				sql.append(" COUNT(DISTINCT(CASE WHEN lg.passday IS NOT NULL THEN '1' + l.ChildID END)) AS PassCount, ");// 合格LO数
			//Oracleの場合 OR PostgreSQLの場合
			} else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sql.append(" COUNT(DISTINCT(CASE WHEN lg.study_end_date IS NOT NULL THEN '1' || l.ChildID END)) AS CompleteCount, ");// 完了LO数 	 				
				sql.append(" COUNT(DISTINCT(CASE WHEN lg.passday IS NOT NULL THEN '1' || l.ChildID END)) AS PassCount, ");// 合格LO数
			}

			sql.append(" SUM(lg.residanceTime) AS LearnTime, ");		// 累積滞在時間（分） 	 				
			sql.append(" MAX(lg.execise_point) AS ExecisePoint, ");		// 最新得点  				
			sql.append(" MAX(lg.highScore) AS HighScore, ");			// 最高得点 	 				
			sql.append(" MAX(lg.fullScore) AS FullScore, ");			// 満点 	 				
			sql.append(" (CASE WHEN MAX(lg.study_end_date) IS NOT NULL THEN '1' ELSE '0' END) AS IsComplete, ");// 完了ステータス 	 				
			sql.append(" (CASE WHEN MAX(lg.passday) IS NOT NULL THEN '1' ELSE '0' END) AS IsPass, ");// 合格ステータス 	 				
			sql.append(" p.ChildID AS UserID, ");						// ユーザID 	 				
			sql.append(" p.ParentID AS GroupID ");						// グループID 	 				
			sql.append(" FROM ");	 				
			sql.append(" (select * from v_UserList ");					// ユーザ情報ビュー
			sql.append(" union all ");
			sql.append(" select null AS ParentID, null AS ParentName, null AS ParentForeignID, ");
			sql.append(" pl.user_id AS ChildID, pl.user_name AS ChildName, ");
			sql.append(" pl.foreignID AS ChildForeignID, 0 AS sort_no ");
			sql.append(" from People pl ");
			sql.append(" where pl.user_id = 'PE000000') p ");

			sql.append(" LEFT OUTER JOIN  ");	 				
			sql.append(" LOLog lg ");								// LoLogテーブル
			sql.append(" INNER JOIN ");	 				
			// LO情報ビュー
			switch (getAction()) {
				// グループ/コンテナ
				// ユーザ/コンテナ
				case LoLogConstant.LOG_SELECT_G_C :
				case LoLogConstant.LOG_SELECT_U_C :
					sql.append(" (select * from v_LoList where parentid = '" + StringEscapeUtils.escapeSql(loId) + "') l ");
					break;

				// グループ/教材
				// ユーザ/教材
				case LoLogConstant.LOG_SELECT_G_M :
				case LoLogConstant.LOG_SELECT_U_M :
					sql.append(" (select * from v_LoList where childid = '" + StringEscapeUtils.escapeSql(loId) + "') l ");
					break;
				
				// ありえない
				default :
					break;
			}
			sql.append(" ON ");	 				
			sql.append(" l.RealID = lg.LOID ");	 				
			sql.append(" ON ");	 				
			sql.append(" lg.UserID = p.ChildID ");	
			return sql.toString(); 				
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		

	}

	/**
	 * ネストしたSQL文の外側のSQLを返却する.
	 *
	 * @return ネストしたSQL文
	 * @exception XmsException
	 *
	 */
	private String getSelectSql()throws XmsException{
		try {

			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			StringBuffer sql = new StringBuffer();		
			sql.append(" SELECT ");
			sql.append(" L.UserName AS UserName, ");	 					// ユーザ名 
			sql.append(" L.UserForeignID AS UserForeignID, "); 				// 外部ユーザID 
			sql.append(" L.GroupName AS GroupName, ");						// 所属グループ 
			sql.append(" L.GroupForeignID AS GroupForeignID, "); 	 		// 外部グループID 
			sql.append(" StartDate, ");										// 学習開始日時 
			sql.append(" LastDate, ");										// 最終アクセス日時 
			sql.append(" AccessCount, "); 									// 総アクセス回数 
			sql.append(" CompleteCount, "); 								// 完了LO数 

			//PostgreSQLの場合
			if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )) {
				sql.append(" CAST(ROUND(TO_NUMBER(R.CompleteCount * 100.0 / " + loCount + ",'99999999D9'),0) AS INT) AS CompleteCountRate, ");// 完了LO数 （%)
				sql.append(" PassCount, ");										// 合格LO数 
				sql.append(" CAST(ROUND(TO_NUMBER(R.PassCount * 100.0 / " + loCount + ",'99999999D9'),0) AS INT) AS PassCountRate, ");	// 合格LO数 (%)
				sql.append(" LearnTime, ");										// 累積滞在時間（分）  				
				sql.append(" ExecisePoint, ");		 							// 最新得点  				
				sql.append(" ROUND(TO_NUMBER(R.ExecisePoint * 100 / (CASE WHEN FullScore = 0 THEN NULL ELSE FullScore END),'99999999D9'),0) AS ExecisePointRate, ");	 // 最新得点（%） 				
				sql.append(" HighScore, ");	 	 								// 最高得点 				
				sql.append(" ROUND(TO_NUMBER(R.HighScore * 100 / (CASE WHEN FullScore = 0 THEN NULL ELSE FullScore END),'99999999D9'),0) AS HighScoreRate, ");	// 最高得点(%）  				
			//SQLServerの場合 OR Oracleの場合
			} else if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER ) || objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				sql.append(" CAST(ROUND(R.CompleteCount * 100.0 / " + loCount + ",0) as int) AS CompleteCountRate, ");// 完了LO数 （%)
				sql.append(" PassCount, ");										// 合格LO数 
				sql.append(" CAST(ROUND(R.PassCount * 100.0 / " + loCount + ",0) as int) AS PassCountRate, ");	// 合格LO数 (%)
				sql.append(" LearnTime, ");										// 累積滞在時間（分）  				
				sql.append(" ExecisePoint, ");		 							// 最新得点  				
				sql.append(" ROUND(R.ExecisePoint * 100 / (CASE WHEN FullScore = 0 THEN NULL ELSE FullScore END),0) AS ExecisePointRate, ");	 // 最新得点（%） 				
				sql.append(" HighScore, ");	 	 								// 最高得点 				
				sql.append(" ROUND(R.HighScore * 100 / (CASE WHEN FullScore = 0 THEN NULL ELSE FullScore END),0) AS HighScoreRate, ");	// 最高得点(%）  				
			}

			sql.append(" FullScore, ");										// 満点  				
			sql.append(" IsComplete, ");    								// 完了ステータス  	 				
			sql.append(" IsPass, ");    									// 合格ステータス 	 				
			sql.append(" L.UserID AS UserID, ");							// ユーザID  				
			sql.append(" L.GroupID AS GroupID ");							// グループID  				
			sql.append(" FROM  ");	 				
			sql.append(" ( ");	 				
			sql.append(" SELECT ");	 				
			sql.append(" p.ChildName AS UserName, ");	 				
			sql.append(" p.ChildForeignID AS UserForeignID, ");				// 外部ユーザID 	 				
			sql.append(" p.ParentName AS GroupName, ");						// 所属グループ 	 				
			sql.append(" p.ParentForeignID AS GroupForeignID, ");			// 外部グループID 	 				
			sql.append(" p.ChildID AS UserID, ");							// ユーザID 	 				
			sql.append(" p.ParentID AS GroupID ");							// グループID  				
			sql.append(" FROM ");	 				
			sql.append(" (select * from v_UserList ");						// ユーザ情報ビュー
			sql.append(" union all ");
			sql.append(" select null AS ParentID, null AS ParentName, null AS ParentForeignID, ");
			sql.append(" pl.user_id AS ChildID, pl.user_name AS ChildName, ");
			sql.append(" pl.foreignID AS ChildForeignID, 0 AS sort_no ");
			sql.append(" from People pl ");
			sql.append(" where pl.user_id = 'PE000000') p ");
			return sql.toString();
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		
	}
	

}
