/*
このファイルの中身は、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) ______________________________________.
*/

//
//	Offline教材 演習成績分析データストアクラス
//			変更履歴
//				2004.01.08	新規作成	滝島　英幸
//
package jp.co.ntt.lms.lo.Offline.IndividualLog;

// Java API
import java.util.Vector;

import jp.co.ntt.lms.Common.RDF.RDFNode;

/**
 * 演習成績分析のデータストア<BR>
 * 
 * @author H.Takishima
 * @version 2.0.4.0.0 2004/01/08
 */
public class IndividualLogResultStoreData extends IndividualLogStoreData {


	/**LOID **/
	private String mstrLOID;
	
	/**GroupID **/
	private String mstrGroupID;
	
	/**LoType **/
	private String mstrLoType;
	
	/**セッションから取得した目次**/
	private RDFNode mobjNode;

	/**SQL取得データ格納領域**/
	private String mstrSqlData[ ][ ];
	
	/**演習成績分析データ（全件）**/
	private Vector mvecStoreData;
	
	/**演習成績分析データ（AU単位）**/
	private Vector mvecWrk;	
	
	
	/**
	 * コンストラクタ
	 * @param LOID
	 * @param GroupID
	 * @param LoType
	 * @param objNode
	 **/
	public IndividualLogResultStoreData(String strLOID,String strGroupID,String strLoType,RDFNode objNode ) {
		this.mstrLOID = strLOID;
		this.mstrGroupID = strGroupID;
		this.mstrLoType = strLoType;
		this.mobjNode = objNode;
	}

	/**
	 * 演習成績分析表データオブジェクト作成
	 * @return 正常、異常
	 **/
	public boolean makeStoreData( ) {
		try{
			//演習分析表作成
			makeResultSql( );
			
			//データが存在した場合
			if( mstrSqlData.length != 0 && mstrSqlData != null){
				//RecordSet→データObj
				setStoreData( );

				//IndividualLogStoreDataに作成した一覧表Objをセット
				setStoreDataObj(mvecStoreData);
			}
			return true;

		}catch(Exception e){
			return false;
		}
	}
	
	/**
	 * SQLを発行し、DBからデータ取得
	 **/
	private void makeResultSql() throws Exception{
	
		Vector vecParam = new Vector();		//条件格納領域
		
		// リアルLOIDを取得。
		String strRealLoID = new IndividualLogStoreData().getRealLoID(mstrLOID);

		//条件セット
		vecParam.addElement(strRealLoID);
		vecParam.addElement(mstrGroupID);

		//SQL発行(SQLID:LOG0501)
		mstrSqlData = execute( mstrLoType, SQLID_RESULT,  vecParam);
		
	}

	/**
	 * DBから取得したデータを編集し、表示するAU順にデータObjに格納
	 * 設定：[UID][InteractionID][正解者数][回答者数][目次一覧データ該当Row番号]
	 * 設定順：目次データのAU名、Interaction_IDの順に格納
	 * ユーザが同じAU名の設問（Interaction_ID）に回答した場合、1度でも正解すれば正解者に含む。
	 */
	private void setStoreData( ){
		int intRowCnt;								//件数（行）
		int intColCnt;									//横（列）
		String strFlg;								//成績判定フラグ
		Vector vecWrkRow;							//AUI単位のデータ
		String strNodeUID = new String( );			//目次から取得したUID
		String strUID = new String( );				//DBから取得したUID
		String strInteraction_id = new String( );		//DBから取得したInteraction_id
		String strOldInteraction_id = new String( );	//編集時の一時格納Interaction_id
		String strUserID = new String( );			//DBから取得したUserID
		String strOldUserID = new String( );			//編集時の一時格納UserID
		String strResult = new String( );			//DBから取得したResult
	
		//件数（行）
		intRowCnt = mstrSqlData.length;
		
		//横（列）
		intColCnt = mstrSqlData[0].length;
		
		//目次
		createRDFStoreData(mobjNode);
		
		//目次順にループ
		mvecStoreData = new Vector( );
		for(int i=0; i<getRDFMaxRow( ); i++){
			
			strNodeUID = getRDFAUID( i );					//目次からのUID

			mvecWrk = new Vector();								//AU単位にためる
			strFlg = "0";
			strOldUserID = "";
			strOldInteraction_id = "";
			
			//目次順のAUで、SQLから取得したデータを検索
			for(int j=0; j<intRowCnt; j++){							//目次のRow数Loop
				strUID = mstrSqlData[ j ][ RSULT_REC_UID_COL ];

				//セクション判定
				if(getRDFType(i).equals(IndividualLogRDFNode.STATUS_S)){
					continue;
				}

				//AUIDが一致したら
				if(strNodeUID.equals(strUID)){
					strInteraction_id = mstrSqlData[ j ][ RSULT_REC_INTERACTION_ID_COL ];		//interaction_id
					strUserID = mstrSqlData[ j ][ RSULT_REC_USERID_COL ];				//UserID
					strResult= mstrSqlData[ j ][ RSULT_REC_RESULT_COL ];				//result
					
					//UserID、Interaction_id単位（UserID、Interaction_idが変わった）でBreak
					if(strUserID.equals(strOldUserID) && strInteraction_id.equals(strOldInteraction_id)){
					
					//始めのデータは登録しない
					}else if(strOldUserID.equals("")){
						strOldUserID = strUserID;
						strOldInteraction_id = strInteraction_id;
					}else{
						//登録
						serchStoreData(strUID, strOldInteraction_id, strFlg, i );
						strOldUserID = strUserID;
						strOldInteraction_id = strInteraction_id;
						strFlg = "0";						//初期化
					}
					
					// resultがDecimal値の場合、result値を返します。
					if( !judgeResult(strResult).equals(DEF_CORREC) && !judgeResult(strResult).equals(DEF_NO_ANSWER) && !judgeResult(strResult).equals(DEF_WRONG) ){
						strFlg = judgeResult(strResult);
					}
					//ユーザ単位、設問単位で１回でも正解したら、正解
					else if ( judgeResult(strResult)==DEF_CORREC || strFlg == DEF_CORREC ) {
						strFlg =DEF_CORREC;
					}else{
						strFlg = DEF_WRONG;
					}
				}
				//Breakした最後のデータを登録
				if( j == intRowCnt-1 && strOldUserID.equals("") == false){
					serchStoreData(strNodeUID, strOldInteraction_id, strFlg ,i );
				}
				
			}
			
			//vecWrk→mvecStoreData追加
			for(int k=0; k<mvecWrk.size( ); k++){
					mvecStoreData.addElement( (Vector)mvecWrk.get(k) );
			}
			
		}
	}
	

	/**
	 * AU単位にデータObjを作成
	 * 設定：[UID][InteractionID][正解者数][回答者数]
	 * 同じUID、InteractionIDが存在すれば正解者数と回答者数を+1、存在しなければ追加
	 * @param AUID
	 * @param Interaction_id
	 */
	private void serchStoreData(String strParamUID, String strParamInteraction_id ,String strResultFlg, int intAURow)  
	{
	 	int intNum;
	 	
		Vector vecSerchRow;
		Vector vecWrkRow;

	 	intNum = -1;
	 	vecWrkRow = new Vector();
	 	vecSerchRow = new Vector();
	 	//intAURow→strAURowに変換
	 	String strAURow = new String();
	 	strAURow =String.valueOf( intAURow );
	 	
	 	//すでに登録している演習成績分析データObjから検索
	 	for(int i=0; i < mvecWrk.size( ); i++){
			vecSerchRow = (Vector)mvecWrk.get( i );
			//存在した場合
			if ( strParamUID.equals( vecSerchRow.get(RSULT_OBJ_UID_COL) ) 
			     && strParamInteraction_id.equals( vecSerchRow.get(RSULT_OBJ_INTERACTION_ID_COL) ) ){
				//String→int
				Integer cNum = new Integer( vecSerchRow.get(RSULT_OBJ_CORRECT_COL).toString( ) );
				Integer wNum = new Integer( vecSerchRow.get(RSULT_OBJ_ANSWER_COL).toString( ) );
				int cintNum =  cNum.intValue( ) ;
				int wintNum =  wNum.intValue( ) ;
				//計算
				// Decimal値の場合
				if(!strResultFlg.equals(DEF_CORREC) && !strResultFlg.equals(DEF_NO_ANSWER) && !strResultFlg.equals(DEF_WRONG)){
					cintNum  = -1;						// 正解者数
					wintNum = wintNum + 1;				// 回答者数
				}
				// 正解の場合
				else if (strResultFlg.equals(DEF_CORREC)){
					cintNum  = cintNum + 1;				// 正解者数
					wintNum = wintNum + 1;				// 回答者数
				//不正解の場合
				}else{
					wintNum = wintNum + 1;				// 回答者数
				}
				//置き換え
				vecWrkRow.addElement( strParamUID);
				vecWrkRow.addElement( strParamInteraction_id);
				vecWrkRow.addElement( Integer.toString( cintNum ) );
				vecWrkRow.addElement( Integer.toString( wintNum ) );
				vecWrkRow.addElement( strAURow );
				mvecWrk.set( i , vecWrkRow);
				intNum = i;
				break;
			}
	 	}
	 	//存在しない場合
	 	if (intNum == -1){
			vecWrkRow.addElement(strParamUID);
			vecWrkRow.addElement(strParamInteraction_id);
			// Decimal値
			if(!strResultFlg.equals(DEF_CORREC) && !strResultFlg.equals(DEF_NO_ANSWER) && !strResultFlg.equals(DEF_WRONG)){
				vecWrkRow.addElement( "-1" );	// 正解者数
				vecWrkRow.addElement( "1" );	// 回答者数
			}
			// 正解
			else if (strResultFlg.equals(DEF_CORREC)){
				vecWrkRow.addElement( "1" );		// 正解者数
				vecWrkRow.addElement( "1" );		// 回答者数
			// 不正解
			}else{
				vecWrkRow.addElement( "0" );		// 正解者数
				vecWrkRow.addElement( "1" );		// 回答者数
			}
			vecWrkRow.addElement( strAURow );
			//追加
			mvecWrk.addElement(vecWrkRow);
	 	}
	 	vecWrkRow = null;
		 
	}

}