/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.database;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

import jp.co.sint.config.SIConfig;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

/**
 * @version $Id: SIOrderBy.java,v 1.0 2003/10/20 Exp $
 * @author  Jinwang Chen
 * <br>Description:
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 *  ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Jinwang Chen   2003/10/20 10:41:39  Original
 */
public class SIOrderBy {

  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  //ソート項目名と順名を保存する用のコレクション
  private LinkedHashMap orderByTree = new LinkedHashMap();

  /**
   * <b>SIOrderBy</b>
   * コンストラクタ
   * @param  なし
   * @return なし
   * @throws なし
   */
  public SIOrderBy(){}

  /**
   * <b>SIOrderBy</b>
   * コンストラクタ
   * @param  lItemName ソート項目名
   * @param  lOrderFlag ソート順のフラグ(0:昇順 1:降順)
   * @return なし
   * @throws なし
   */
  public SIOrderBy(String lItemName,String lOrderFlag){
    this.addSort(lItemName,lOrderFlag);
  }

  public SIOrderBy(String lAlias,String lItemName,String lOrderFlag){
    this.addSort(lAlias,lItemName,lOrderFlag);
  }

  /**
   * <b>addSort</b>
   * 新しいソート項目を追加
   * @param  lItemName ソート項目名
   * @param  lOrderFlag ソート順(0:昇順 1:降順)
   * @return なし
   * @throws なし
   */
  public void addSort(String lItemName,String lOrderFlag){
    addSort("",lItemName,lOrderFlag);
  }

  /**
   * <b>addSort</b>
   * 新しいソート項目を追加
   * @param  lItemName ソート項目名
   * @param  lOrderFlag ソート順(0:昇順 1:降順)
   * @return なし
   * @throws なし
   */
  public void addSort(Map lMap){

    if (lMap.isEmpty()) return;
    orderByTree.putAll(lMap);
  }

  /**
   * <b>addSort</b>
   * 新しいソート項目を追加
   * @param  lItemName ソート項目名
   * @param  lOrderFlag ソート順(0:昇順 1:降順)
   * @return なし
   * @throws なし
   */
  public void addSort(String lAlias,String lItemName,String lOrderFlag){
    if (SIUtil.isNull(lAlias))orderByTree.put(lItemName,lOrderFlag);
    else orderByTree.put(lAlias+"."+lItemName,lOrderFlag);
  }

  /**
   * <b>getOrderBySQL</b>
   * ソート用のSQL文を出力
   * @param  なし
   * @return ソート用のSQL文
   * @throws なし
   */
  public String getOrderBySQL(){
    StringBuffer lResultBuf=new StringBuffer();
    String lKey="";
    Object lValue="";

    if (orderByTree.isEmpty()) return "";
    Iterator lIta=orderByTree.keySet().iterator();
    while (lIta.hasNext()){
      lKey=(String)lIta.next();
      lValue=(String)orderByTree.get(lKey);
      lResultBuf.append(","+lKey+" "+SIConfig.SIORDER_NAME[Integer.parseInt((String)lValue)]);
    }

    if (lResultBuf.length()==0) return "";
    else return " ORDER BY "+lResultBuf.toString().substring(1);
  }
}
