diff --git a/scripts/dde/RatingQubits.xml b/scripts/dde/RatingQubits.xml index 2d1a48df26a..ca43fe4ce1c 100755 --- a/scripts/dde/RatingQubits.xml +++ b/scripts/dde/RatingQubits.xml @@ -9,4 +9,13 @@ 300 + + 150 + 149 + + + 06/01/2010 06:06:06 + NULL + + diff --git a/src/main/com/topcoder/dde/util/DWLoad/RatingQubits.java b/src/main/com/topcoder/dde/util/DWLoad/RatingQubits.java index 14135147452..c34b308b44b 100755 --- a/src/main/com/topcoder/dde/util/DWLoad/RatingQubits.java +++ b/src/main/com/topcoder/dde/util/DWLoad/RatingQubits.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004 - 2009 TopCoder Inc., All Rights Reserved. + * Copyright (C) 2004 - 2018 TopCoder Inc., All Rights Reserved. */ package com.topcoder.dde.util.DWLoad; @@ -13,10 +13,7 @@ import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.TreeMap; -import java.util.Vector; +import java.util.*; import com.topcoder.shared.util.DBMS; import com.topcoder.shared.util.logging.Logger; @@ -42,8 +39,15 @@ * *

* - * @author pulky, VolodymyrK - * @version 1.2 + *

+ * Version 1.3 Change notes(Topcoder - Support Rating and Reliability Generation For Code Challenges in DWLoad): + *

    + *
  1. Added support for code challenge and load phase ids, cutoffs configurations from file.
  2. + *
+ *

+ * + * @author pulky, VolodymyrK,TCCODER + * @version 1.3 */ public class RatingQubits { private static final Logger log = Logger.getLogger(RatingQubits.class); @@ -52,6 +56,34 @@ public class RatingQubits { public static final String CONNECTION_URL_KEY = "ConnectionURL"; public static final String HISTORY_LENGTH_KEY = "HistoryLength"; + /** + * Property key name for phase ids + * + * @since 1.3 + */ + private static final String PHASE_IDS_KEY = "PhaseIds"; + + /** + * Property key name for cutoffs + * + * @since 1.3 + */ + private static final String CUT_OFFS_KEY = "CutOffs"; + + /** + * Property value for null value of cutoff + * + * @since 1.3 + */ + private static final String NULL_CUT_OFF = "null"; + + /** + * The simple date format for cut off. + * + * @since 1.3 + */ + private static final SimpleDateFormat SDF = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); + private static final String NEW_PHASES_CUT_OFF = "03/23/2009 00:00:00"; private static final String UI_PROTOTYPE_CUT_OFF = "08/01/2009 00:00:00"; private static final String RIA_BUILD_CUT_OFF = "06/01/2010 00:00:00"; @@ -68,26 +100,37 @@ public class RatingQubits { private static final int RIA_BUILDS_PHASE_ID = 135; private static final int CONTENT_CREATION_PHASE_ID = 146; private static final int REPORTING_PHASE_ID = 147; + /** + * Code challenge phase id. + * + * @since 1.3 + */ + private static final int CODE_PHASE_ID = 150; private final static String NEW_RATING_STATUSES = "(4, 7, 8)"; /** * SQL fragment to be added to a where clause to not select projects with eligibility constraints - * + * * @since 1.1 */ private static final String ELIGIBILITY_CONSTRAINTS_SQL_FRAGMENT = " and p.project_id not in (select ce.contest_id from contest_eligibility ce " + - " where ce.is_studio = 0) "; + " where ce.is_studio = 0) "; /** * SQL fragment to be added to a where clause to select only rated projects - * + * * @since 1.2 */ private static final String RATED_CONSTRAINTS_SQL_FRAGMENT = " and p.project_id in (select pi.project_id from project_info pi where pi.project_info_type_id=13 " + - "and (pi.value='Yes' or pi.value='yes')) "; + "and (pi.value='Yes' or pi.value='yes')) "; + /** + * Load phase ids and cutoffs configurations from file + * @param args the command arguments + * @since 1.3 + */ public static void main(String[] args) { RatingQubits tmp = new RatingQubits(); @@ -113,6 +156,7 @@ public static void main(String[] args) { String jdbcDriver; String connectionURL; + Map projects = new HashMap(); try { jdbcDriver = config.getString(namespace, DRIVER_KEY); connectionURL = config.getString(namespace, CONNECTION_URL_KEY); @@ -126,6 +170,42 @@ public static void main(String[] args) { System.err.println("No Connection URL specified. (Config param '" + CONNECTION_URL_KEY + "')"); return; } + String[] phaseIds = config.getStringArray(namespace, PHASE_IDS_KEY); + String[] cutOffs = config.getStringArray(namespace, CUT_OFFS_KEY); + if (phaseIds!= null && cutOffs !=null) { + if (phaseIds.length != cutOffs.length) { + System.err.println("(Config param '" + PHASE_IDS_KEY + "')(" + phaseIds.length + ") and (Config param '" + + CUT_OFFS_KEY + "')("+ cutOffs.length + ") should have same length of string array"); + return; + } + for (int i = 0; i < phaseIds.length; i++) { + String id = phaseIds[i]; + int phaseId = -1; + try { + phaseId = Integer.parseInt(id); + } catch (NumberFormatException e) { + System.err.println("Invalid phase id value for "+ id + ", please check it"); + return; + } + if (projects.containsKey(phaseId)) { + System.err.println("(Config param '" + PHASE_IDS_KEY + "') contains duplicated phase id "+id); + return; + } + String cutoff = cutOffs[i]; + + Date cutoffDate = null; + try { + if (!NULL_CUT_OFF.equalsIgnoreCase(cutoff)){ + cutoffDate = new Date(SDF.parse(cutoff).getTime()); + } + } catch (ParseException e) { + e.printStackTrace(); + System.err.println("Invalid cutoff value " + cutoff + "for phase id "+ phaseId + ", please check it"); + return; + } + projects.put(phaseId, cutoffDate); + } + } } catch (UnknownNamespaceException e) { System.err.println("Initialized ConfigManager and namespace '" + namespace + "' without trouble but could not retrieve resource bundle"); return; @@ -137,7 +217,7 @@ public static void main(String[] args) { c = DriverManager.getConnection(connectionURL); c.setAutoCommit(true); - tmp.runAllScores(c, historyLength); + tmp.runAllScores(c, historyLength, projects); } catch (Exception e) { e.printStackTrace(); } finally { @@ -149,13 +229,18 @@ public static void main(String[] args) { } } - public void runAllScores(Connection conn, String historyLength) { - - SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); + /** + * Run all score + * @param conn the database connection + * @param historyLength the length of history + * @param projects the projects map with keyis phase id and value is cut off date + * @since 1.3 + */ + public void runAllScores(Connection conn, String historyLength, Map projects) { Date newPhasesCutoff = null; try { - newPhasesCutoff = new Date(sdf.parse(NEW_PHASES_CUT_OFF).getTime()); + newPhasesCutoff = new Date(SDF.parse(NEW_PHASES_CUT_OFF).getTime()); } catch (ParseException e1) { System.err.println("Invalid value for constant NEW_PHASES_CUT_OFF, please check it"); return; @@ -163,7 +248,7 @@ public void runAllScores(Connection conn, String historyLength) { Date uiPrototypeCutoff = null; try { - uiPrototypeCutoff = new Date(sdf.parse(UI_PROTOTYPE_CUT_OFF).getTime()); + uiPrototypeCutoff = new Date(SDF.parse(UI_PROTOTYPE_CUT_OFF).getTime()); } catch (ParseException e1) { System.err.println("Invalid value for constant UI_PROTOTYPE_CUT_OFF, please check it"); return; @@ -171,24 +256,43 @@ public void runAllScores(Connection conn, String historyLength) { Date riaBuildCutoff = null; try { - riaBuildCutoff = new Date(sdf.parse(RIA_BUILD_CUT_OFF).getTime()); + riaBuildCutoff = new Date(SDF.parse(RIA_BUILD_CUT_OFF).getTime()); } catch (ParseException e1) { System.err.println("Invalid value for constant RIA_BUILD_CUT_OFF, please check it"); return; } - runScore(conn, historyLength, DESIGN_PHASE_ID); - runScore(conn, historyLength, DEV_PHASE_ID); - runScore(conn, historyLength, ASSEMBLY_PHASE_ID, newPhasesCutoff); - runScore(conn, historyLength, ARCHITECTURE_PHASE_ID, newPhasesCutoff); - runScore(conn, historyLength, SPECIFICATION_PHASE_ID, newPhasesCutoff); - runScore(conn, historyLength, CONCEPTUALIZATION_PHASE_ID, newPhasesCutoff); - runScore(conn, historyLength, TESTING_PHASE_ID, newPhasesCutoff); - runScore(conn, historyLength, TEST_SCENARIOS_PHASE_ID, newPhasesCutoff); - runScore(conn, historyLength, UI_PROTOTYPES_PHASE_ID, uiPrototypeCutoff); - runScore(conn, historyLength, RIA_BUILDS_PHASE_ID, riaBuildCutoff); - runScore(conn, historyLength, CONTENT_CREATION_PHASE_ID, riaBuildCutoff); - runScore(conn, historyLength, REPORTING_PHASE_ID, riaBuildCutoff); + for (Map.Entry entry : projects.entrySet()) { + runScore(conn, historyLength, entry.getKey(), entry.getValue()); + } + // phase ids without cut off + int[] phaseIds1 = new int [] { DESIGN_PHASE_ID, DEV_PHASE_ID } ; + for (int i = 0; i < phaseIds1.length; i++) { + if(!projects.containsKey(phaseIds1[i])) { + runScore(conn, historyLength, phaseIds1[i]); + } + } + + // phase ids with newPhasesCutoff + int[] phaseIds2 = new int [] { ASSEMBLY_PHASE_ID, ARCHITECTURE_PHASE_ID, SPECIFICATION_PHASE_ID, + CONCEPTUALIZATION_PHASE_ID, TESTING_PHASE_ID, TEST_SCENARIOS_PHASE_ID } ; + for (int i = 0; i < phaseIds2.length; i++) { + if(!projects.containsKey(phaseIds2[i])) { + runScore(conn, historyLength, phaseIds2[i], newPhasesCutoff); + } + } + + if (!projects.containsKey(UI_PROTOTYPES_PHASE_ID)) { + runScore(conn, historyLength, UI_PROTOTYPES_PHASE_ID, uiPrototypeCutoff); + } + + // phase ids with riaBuildCutoff + int[] phaseIds3 = new int [] { RIA_BUILDS_PHASE_ID, CONTENT_CREATION_PHASE_ID, REPORTING_PHASE_ID, CODE_PHASE_ID } ; + for (int i = 0; i < phaseIds3.length; i++) { + if(!projects.containsKey(phaseIds3[i])) { + runScore(conn, historyLength, phaseIds3[i], riaBuildCutoff); + } + } } // Run a score without a specific cut off time @@ -203,8 +307,11 @@ private void runScore(Connection conn, String historyLength, int phase) { * @param historyLength the history length * @param phase the phase * @param cutoff the cutoff date + * @since 1.3 */ private void runScore(Connection conn, String historyLength, int phase, Date cutoff) { + System.out.println("Run score for historyLength " + historyLength + " phase " + phase + + " cutoff " + ( cutoff == null ? NULL_CUT_OFF : SDF.format(cutoff))); PreparedStatement ps = null; ResultSet rs = null; @@ -216,7 +323,7 @@ private void runScore(Connection conn, String historyLength, int phase, Date cut "case when substr(pi_rd.value, 18,2)='PM' then round(substr(pi_rd.value, 12, 2)) +12 else round(substr(pi_rd.value, 12, 2)) end as hour " + "from project_result pr, project p, project_info pi_rd " ; if (cutoff != null) { - sqlStr += ", project_phase pp "; + sqlStr += ", project_phase pp "; } sqlStr += "where p.project_id = pr.project_id " + "and p.project_status_id in " + NEW_RATING_STATUSES + " " + @@ -227,11 +334,10 @@ private void runScore(Connection conn, String historyLength, int phase, Date cut RATED_CONSTRAINTS_SQL_FRAGMENT + "and pi_rd.project_id = p.project_id and pi_rd.project_info_type_id = 22 "; if (cutoff != null) { - sqlStr += "and pp.project_id = p.project_id and pp.phase_type_id = 1 " + - "and pp.actual_start_time > ? "; + sqlStr += "and pp.project_id = p.project_id and pp.phase_type_id = 1 " + + "and pp.actual_start_time > ? "; } sqlStr += "order by year, month, day, hour, 1"; - ps = conn.prepareStatement(sqlStr); ps.setInt(1, phase - 111); // Project Category if (cutoff != null) { @@ -969,13 +1075,13 @@ private double normsinv(double p) { private double normsinvnew(double p) { /* ******************************************** - * Original algorythm and Perl implementation can - * be found at: - * http://www.math.uio.no/~jacklam/notes/invnorm/index.html - * Author: - * Peter J. Acklam - * jacklam@math.uio.no - * ****************************************** */ + * Original algorythm and Perl implementation can + * be found at: + * http://www.math.uio.no/~jacklam/notes/invnorm/index.html + * Author: + * Peter J. Acklam + * jacklam@math.uio.no + * ****************************************** */ // Define break-points. // variable for result @@ -1107,4 +1213,3 @@ private double winprobability(double meana, double stddeva, double meanb, double //----------------------END RATING FUNCTIONS0----------------------------------------------- } -