view src/main/java/org/mpi/openmind/scripts/FixRelationNonCurrent.java @ 10:dc458969f479

added script to fix relations with non-current targets.
author casties
date Thu, 09 Apr 2015 17:31:55 +0000
parents
children d71f28dac165
line wrap: on
line source

/**
 * 
 */
package org.mpi.openmind.scripts;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * @author casties
 *
 */
public class FixRelationNonCurrent {
    
    public static void show(String dbUser, String dbPw) {
        Connection conn = DBUtils.getConn(dbUser, dbPw);
        List<Long> relIds = getRelIds(conn);
        for (Long id : relIds) {
            System.out.println("RELATION "+id+" target is not CURRENT_VERSION");
            int ncv = getCurrentVersionTime(id, conn).size();
            if (ncv == 1) {
                System.out.println("  RELATION "+id+" can be fixed");
            } else {
                System.out.println("  ERROR: RELATION "+id+" has " + ncv + " CURRENT_VERSIONs");                
            }
        }
        System.out.println(relIds.size() + " RELATION targets are not CURRENT_VERSION");
    }

    public static void repair(String dbUser, String dbPw) {
        Connection conn = DBUtils.getConn(dbUser, dbPw);
        List<Long> relIds = getRelIds(conn);
        int fixed = 0;
        for (Long id : relIds) {
            System.out.println("RELATION "+id+" target is not CURRENT_VERSION");
            if (updateCurrentRelationTarget(id, conn)) {
                System.out.println("  RELATION "+id+" target updated to current version");
                fixed += 1;
            } else {
                System.out.println("  ERROR: RELATION "+id+" was not fixed!");
            }
        }
        System.out.println(relIds.size() + " RELATION targets are not CURRENT_VERSION");
        System.out.println(fixed + " RELATION targets were fixed.");
    }

    public static List<Long> getRelIds(Connection conn) {
        List<Long> relIds = new ArrayList<Long>();
        String qTargetRels = "select rel.id from openmind.node rel, openmind.node ent "
                + "where rel.target_id = ent.id "
                + "and rel.target_modif = ent.modification_time "
                + "and rel.node_type = 'RELATION' "
                + "and rel.system_status = 'CURRENT_VERSION' "
                + "and ent.system_status != 'CURRENT_VERSION' ";
        
        try {
            Statement sTargetRels = conn.createStatement();
            ResultSet rTargetRels = sTargetRels.executeQuery(qTargetRels);
            while (rTargetRels.next()) {
                long id = rTargetRels.getLong(1);
                relIds.add(id);
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return relIds;
    }

    public static List<Long> getCurrentVersionTime(Long id, Connection conn) {
        List<Long> times = new ArrayList<Long>();
        String query = "select modification_time from openmind.node "
                + "where id = " + id.toString() + " "
                + "and system_status = 'CURRENT_VERSION' ";
        try {
            Statement statement = conn.createStatement();
            ResultSet results = statement.executeQuery(query);
            while (results.next()) {
                long mtime = results.getLong(1);
                times.add(mtime);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return times;
    }

    public static boolean updateCurrentRelationTarget(Long id, Connection conn) {
        // get target_id of relation
        String qTargetId = "select target_id from openmind.node "
                + "where id = " + id.toString() + " "
                + "and system_status = 'CURRENT_VERSION' ";
        try {
            Statement sTargetId = conn.createStatement();
            ResultSet rTargetId = sTargetId.executeQuery(qTargetId);
            if (rTargetId.next()) {
                long target_id = rTargetId.getLong(1);
                // get mtime of current version of target
                List<Long> target_mtimes = getCurrentVersionTime(target_id, conn);
                if (target_mtimes.size() == 1) {
                    // update target_mtime of relation
                    String qUpdate = "update openmind.node "
                            + "set target_modif = " + target_mtimes.get(0).toString() + " "
                            + "where id = " + id.toString() + " "
                            + "and system_status = 'CURRENT_VERSION' ";
                    Statement sUpdate = conn.createStatement();
                    int rUpdate = sUpdate.executeUpdate(qUpdate);
                    return true;
                } else {
                    System.out.println("ERROR: relation target " + target_id + " has " + target_mtimes.size() + " CURRENT_VERSIONs");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        if (args.length == 3) {
            String user = args[1];
            String pw = args[2];
            if (args[0].equalsIgnoreCase("fix")) {
                repair(user, pw);
            } else {
                show(user, pw);
            }
        } else {
            System.out.println("Parameter/s not found! Should be: mode(SHOW/FIX), mysql_user, mysql_password");
        }
    }

}