/*
* This file is part of NeighborNote
* Copyright 2013 Yuki Takahashi
*
* This file may be licensed under the terms of of the
* GNU General Public License Version 2 (the ``GPL'').
*
* Software distributed under the License is distributed
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the GPL for the specific language
* governing rights and limitations.
*
* You should have received a copy of the GPL along with this
* program. If not, go to http://www.gnu.org/licenses/gpl.html
* or write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package cx.fbn.nevernote.sql;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import cx.fbn.nevernote.Global;
import cx.fbn.nevernote.sql.driver.NSqlQuery;
import cx.fbn.nevernote.utilities.ApplicationLogger;
public class HistoryTable {
private final ApplicationLogger logger;
private final DatabaseConnection db;
// コンストラクタ
public HistoryTable(ApplicationLogger l, DatabaseConnection d) {
logger = l;
db = d;
}
// テーブル作成
public void createTable() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
logger.log(logger.HIGH, "Historyテーブルを作成しています...");
if (!query
.exec("Create table History (id integer primary key auto_increment, behaviorType varchar,"
+ "guid1 varchar, guid2 varchar)"))
logger.log(logger.HIGH, "Historyテーブル作成失敗!!!");
}
// テーブルをドロップ
public void dropTable() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.exec("Drop table History");
}
// Historyテーブルにアイテムを1つ追加
public void addHistory(String behaviorType, String guid1, String guid2) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
boolean excludedCheck = false;
// 操作ログの取得を停止中
if (Global.isHaltLogButton()) {
return;
}
if (behaviorType == null) {
return;
}
if (guid1 == null || guid1.equals("")) {
return;
}
if (guid2 == null || guid2.equals("")) {
return;
}
if (guid1.equals(guid2)) {
return;
}
// 除外ノートに指定されていないかチェックする
excludedCheck = db.getExcludedTable().existNote(guid1, guid2);
if (!excludedCheck) {
query.prepare("Insert Into History (behaviorType, guid1, guid2) Values(:behaviorType, :guid1, :guid2)");
query.bindValue(":behaviorType", behaviorType);
query.bindValue(":guid1", guid1);
query.bindValue(":guid2", guid2);
if (!query.exec()) {
logger.log(logger.MEDIUM, "Historyテーブルへのアイテム追加に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
}
// masterGuidとchildGuidをマージ
public void mergeHistoryGuid(String masterGuid, String childGuid) {
NSqlQuery histQuery = new NSqlQuery(db.getBehaviorConnection());
boolean check = false;
// マージ後に重複してしまうデータを先に削除
histQuery.prepare("Delete from history where (guid1=:oldGuid1 and guid2=:newGuid1) or (guid1=:newGuid2 and guid2=:oldGuid2)");
histQuery.bindValue(":oldGuid1", masterGuid);
histQuery.bindValue(":newGuid1", childGuid);
histQuery.bindValue(":oldGuid2", masterGuid);
histQuery.bindValue(":newGuid2", childGuid);
check = histQuery.exec();
if(!check){
logger.log(logger.MEDIUM, "historyテーブルの重複削除で失敗");
logger.log(logger.MEDIUM, histQuery.lastError());
}
updateHistoryGuid(masterGuid, childGuid);
}
// HistoryテーブルのGuidを更新
public void updateHistoryGuid(String newGuid, String oldGuid){
NSqlQuery histQuery = new NSqlQuery(db.getBehaviorConnection());
boolean check = false;
histQuery.prepare("Update history set guid1=:newGuid where guid1=:oldGuid");
histQuery.bindValue(":newGuid", newGuid);
histQuery.bindValue(":oldGuid", oldGuid);
check = histQuery.exec();
if (!check) {
logger.log(logger.MEDIUM, "historyテーブルのguid1のところでguid更新失敗");
logger.log(logger.MEDIUM, histQuery.lastError());
}
histQuery.prepare("Update history set guid2=:newGuid where guid2=:oldGuid");
histQuery.bindValue(":newGuid", newGuid);
histQuery.bindValue(":oldGuid", oldGuid);
check = histQuery.exec();
if (!check) {
logger.log(logger.MEDIUM, "historyテーブルのguid2のところでguid更新失敗");
logger.log(logger.MEDIUM, histQuery.lastError());
}
}
// Historyテーブルから引数ノートと関連のあるノートのguidと回数をゲット
public HashMap<String, Integer> getBehaviorHistory(String behaviorType, String guid) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
HashMap<String, Integer> behaviorHist = new HashMap<String, Integer>();
// guid1=guidの履歴一覧を取得
query.prepare("Select guid2 from History where behaviorType=:behaviorType and guid1=:guid1");
query.bindValue(":behaviorType", behaviorType);
query.bindValue(":guid1", guid);
if (!query.exec()) {
logger.log(logger.MEDIUM,
"HistoryテーブルからbehaviorType=" + behaviorType + "かつguid1=" + guid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, query.lastError());
}
// HashMapに記録
while (query.next()) {
// すでにHashMapに登録されていたら、回数を+1
String key = query.valueString(0);
if (behaviorHist.containsKey(key)) {
behaviorHist.put(key, behaviorHist.get(key) + 1);
} else { // そうでないなら新規登録
behaviorHist.put(key, 1);
}
}
// guid2=guidの履歴一覧を取得
query.prepare("Select guid1 from History where behaviorType=:behaviorType and guid2=:guid2");
query.bindValue(":behaviorType", behaviorType);
query.bindValue(":guid2", guid);
if (!query.exec()) {
logger.log(logger.MEDIUM,
"HistoryテーブルからbehaviorType=" + behaviorType + "かつguid2=" + guid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, query.lastError());
}
// HashMapに記録
while (query.next()) {
// すでにHashMapに登録されていたら、回数を+1
String key = query.valueString(0);
if (behaviorHist.containsKey(key)) {
behaviorHist.put(key, behaviorHist.get(key) + 1);
} else { // そうでないなら新規登録
behaviorHist.put(key, 1);
}
}
return behaviorHist;
}
// oldGuidのノートの操作履歴をnewGuidのノートの操作履歴として複製
public void duplicateHistory(String newGuid, String oldGuid) {
NSqlQuery histQuery = new NSqlQuery(db.getBehaviorConnection());
// guid1 = oldGuidの履歴一覧を取得
histQuery.prepare("Select behaviorType, guid2 from History where guid1=:oldGuid");
histQuery.bindValue(":oldGuid", oldGuid);
if(!histQuery.exec()){
logger.log(logger.MEDIUM, "Historyテーブルからguid1=" + oldGuid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, histQuery.lastError());
}
// guid1 = newGuidの履歴として複製
while(histQuery.next()){
String behaviorType = histQuery.valueString(0);
String guid2 = histQuery.valueString(1);
addHistory(behaviorType, newGuid, guid2);
}
// guid2 = oldGuidの履歴一覧を取得
histQuery.prepare("Select behaviorType, guid1 from History where guid2=:oldGuid");
histQuery.bindValue(":oldGuid", oldGuid);
if(!histQuery.exec()){
logger.log(logger.MEDIUM, "Historyテーブルからguid2=" + oldGuid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, histQuery.lastError());
}
// guid2 = newGuidの履歴として複製
while(histQuery.next()){
String behaviorType = histQuery.valueString(0);
String guid1 = histQuery.valueString(1);
addHistory(behaviorType, guid1, newGuid);
}
}
// guidを含む列をHistoryテーブルから削除
public void expungeHistory(String guid) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
boolean check;
query.prepare("Delete from History where guid1=:guid1 or guid2=:guid2");
query.bindValue(":guid1", guid);
query.bindValue(":guid2", guid);
check = query.exec();
if(!check){
logger.log(logger.MEDIUM, "historyテーブルからguid=" + guid + "のデータ削除に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
// guid1とguid2を指定してHistoryテーブルから削除
public void expungeHistory(String guid1, String guid2) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
boolean check;
query.prepare("Delete from History where guid1=:guid1 and guid2=:guid2");
query.bindValue(":guid1", guid1);
query.bindValue(":guid2", guid2);
check = query.exec();
if(!check){
logger.log(logger.MEDIUM, "historyテーブルからguid1=" + guid1 + "かつguid2=" + guid2 + "のデータ削除に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
// guid1とguid2が逆のパターンも削除
query.prepare("Delete from History where guid1=:guid1 and guid2=:guid2");
query.bindValue(":guid1", guid2);
query.bindValue(":guid2", guid1);
check = query.exec();
if(!check){
logger.log(logger.MEDIUM, "historyテーブルからguid1=" + guid2 + "かつguid2=" + guid1 + "のデータ削除に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
// 同じタグが付けられたノート間の履歴を登録
public void addSameTagHistory(String noteGuid, String tagGuid) {
if (noteGuid == null || noteGuid.equals("")) {
return;
}
if (tagGuid == null || tagGuid.equals("")) {
return;
}
// そのタグが新しいタグでないなら終了
List<String> prevTags = new ArrayList<String>(db.getNoteTable().noteTagsTable.getNoteTags(noteGuid));
for (int i = 0; i < prevTags.size(); i++) {
System.out.println(prevTags.get(i));
if (tagGuid.equals(prevTags.get(i))) {
return;
}
}
// すでにそのタグが付いているノートを取得
List<String> sameTagNoteGuids = new ArrayList<String>(db.getNoteTable().noteTagsTable.getTagNotes(tagGuid));
for (int i = 0; i < sameTagNoteGuids.size(); i++) {
String guid = sameTagNoteGuids.get(i);
addHistory("sameTag", noteGuid, guid);
}
}
// 同じノートブックに入れられたノート間の履歴を登録
public void addSameNotebookHistory(String noteGuid, String notebookGuid) {
if (noteGuid == null || noteGuid.equals("")) {
return;
}
if (notebookGuid == null || notebookGuid.equals("")) {
return;
}
// すでにそのノートブックに属しているノートを取得
List<String> sameNotebookNoteGuids = new ArrayList<String>(db.getNoteTable().getNotesByNotebook(notebookGuid));
for (int i = 0; i < sameNotebookNoteGuids.size(); i++) {
String guid = sameNotebookNoteGuids.get(i);
if (!noteGuid.equals(guid)) {
addHistory("sameNotebook", noteGuid, guid);
}
}
}
// 操作履歴数の取得
public int getHistoryCount() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.exec("Select count(*) from History");
query.next();
int returnValue = new Integer(query.valueString(0));
return returnValue;
}
// 連想ノートクリック回数を取得
public int getRensoClickCount() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.exec("Select count(*) from History where behaviorType='rensoItemClick'");
query.next();
int returnValue = new Integer(query.valueString(0));
return returnValue;
}
}