/* HSQLColumnMap.java - created: January 2008
* Copyright (C) 2008 Clayton Carter
*
* This file is part of the project "Crop Planning Software". For more
* information:
* website: https://github.com/claytonrcarter/cropplanning
* email: cropplanning@gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package CPS.Core.DB;
import CPS.Module.CPSDataModelConstants;
import CPS.Module.CPSModule;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
*
* @author kendrajm
*/
public class HSQLColumnMap {
private ArrayList<ColumnStruct> plantingColumnMap;
private ArrayList<ColumnStruct> cropColumnMap;
public HSQLColumnMap() {
buildPlantingColumnMap();
buildCropColumnMap();
}
public ArrayList<String> getPlantingColumnList() {
return getColumnNameList( plantingColumnMap, false );
}
public ArrayList<String> getDefaultPlantingColumnList() {
return getColumnNameList( plantingColumnMap, true );
}
public ArrayList<String> getCropColumnList() {
return getColumnNameList(cropColumnMap, false );
}
public ArrayList<String> getDefaultCropColumnList() {
return getColumnNameList(cropColumnMap, true );
}
private ArrayList<String> getColumnNameList( ArrayList<ColumnStruct> m, boolean justDefaults ) {
ArrayList<String> s = new ArrayList<String>();
for ( ColumnStruct cs : m )
if ( cs.mandatory ||
justDefaults && cs.displayByDefault && cs.displayable ||
! justDefaults && cs.displayable )
s.add( cs.columnName );
return s;
}
public ArrayList<Integer> getPlantingPropertyList() {
return getPropertyList( plantingColumnMap, false );
}
public ArrayList<Integer> getDefaultPlantingPropertyList() {
return getPropertyList( plantingColumnMap, true );
}
public ArrayList<Integer> getCropPropertyList() {
return getPropertyList(cropColumnMap, false );
}
public ArrayList<Integer> getDefaultCropPropertyList() {
return getPropertyList(cropColumnMap, true );
}
private ArrayList<Integer> getPropertyList( ArrayList<ColumnStruct> m, boolean justDefaults ) {
ArrayList<Integer> s = new ArrayList<Integer>();
for ( ColumnStruct cs : m )
if ( cs.mandatory ||
justDefaults && cs.displayByDefault && cs.displayable ||
! justDefaults && cs.displayable )
s.add( cs.propertyNum );
return s;
}
public ArrayList<String> getPlantingFilterColumnNames() {
return getFilterColumnNames(plantingColumnMap);
}
public ArrayList<String> getCropFilterColumnNames() {
return getFilterColumnNames(cropColumnMap);
}
private ArrayList<String> getFilterColumnNames( ArrayList<ColumnStruct> m ) {
ArrayList<String> l = new ArrayList<String>();
for ( ColumnStruct cs : m )
// TODO figure out some way to filter/search for data in columns which are not or cannot be displayed
if ( cs.filterable && cs.displayable )
l.add( cs.columnName );
return l;
}
public ArrayList<String[]> getPlantingShortNameMapping() {
return getColumnNameShortNameMapping( plantingColumnMap );
}
private ArrayList<String[]> getColumnNameShortNameMapping( ArrayList<ColumnStruct> m ) {
ArrayList<ColumnStruct> l = new ArrayList<ColumnStruct>();
/* collect displayable columns */
for ( ColumnStruct cs : m ) {
if ( cs.displayable )
l.add( cs );
}
/* sort the columns to move all of the "most important" to the top */
Collections.sort( l, new Comparator<ColumnStruct>() {
public int compare( ColumnStruct c1, ColumnStruct c2 ) {
if ( c1.mostImportant == c2.mostImportant )
return 0;
else if ( c1.mostImportant && ! c2.mostImportant )
return -1;
else if ( ! c1.mostImportant && c2.mostImportant )
return 1;
else
return 0;
}
} );
/* now just collect the column names from the sorted list */
ArrayList<String[]> als = new ArrayList<String[]>();
for ( ColumnStruct cs : l )
if ( cs.displayable )
if ( cs.shortColumnName == null )
als.add( new String[]{ cs.columnName, cs.prettyColumnName, "" + cs.editable } );
else
als.add( new String[]{ cs.columnName, cs.shortColumnName, "" + cs.editable } );
return als;
}
public ArrayList<String[]> getPlantingPrettyNameMapping() {
return getColumnNamePrettyNameMapping(plantingColumnMap);
}
public ArrayList<String[]> getCropPrettyNameMapping() {
return getColumnNamePrettyNameMapping(cropColumnMap);
}
private ArrayList<String[]> getColumnNamePrettyNameMapping( ArrayList<ColumnStruct> m ) {
ArrayList<ColumnStruct> l = new ArrayList<ColumnStruct>();
/* collect displayable columns */
for ( ColumnStruct cs : m ) {
if ( cs.displayable )
l.add( cs );
}
/* sort the columns to move all of the "most important" to the top */
Collections.sort( l, new Comparator<ColumnStruct>() {
public int compare( ColumnStruct c1, ColumnStruct c2 ) {
if ( c1.mostImportant == c2.mostImportant )
return 0;
else if ( c1.mostImportant && ! c2.mostImportant )
return -1;
else if ( ! c1.mostImportant && c2.mostImportant )
return 1;
else
return 0;
}
} );
/* now just collect the column names from the sorted list */
ArrayList<String[]> als = new ArrayList<String[]>();
for ( ColumnStruct cs : l )
if ( cs.displayable )
als.add( new String[] { cs.columnName, cs.prettyColumnName, "" + cs.editable } );
return als;
}
public ArrayList<String[]> getCropInheritanceColumnMapping() {
ArrayList<String[]> l = new ArrayList<String[]>( cropColumnMap.size() );
for ( ColumnStruct cs : cropColumnMap )
// if ( cs.displayable || cs.mandatory )
l.add( new String[] { cs.columnName, cs.correlatedColumn } );
return l;
}
public ArrayList<String[]> getPlantingToCropColumnMapping() {
ArrayList<String[]> l = new ArrayList<String[]>( plantingColumnMap.size() );
for ( ColumnStruct cs : plantingColumnMap )
// if ( cs.displayable || cs.mandatory )
l.add( new String[] { cs.columnName, cs.correlatedColumn, cs.calculation, "" + cs.pseudoColumn } );
return l;
}
public ArrayList<String> getPlantingColumns() {
return getColumnList(plantingColumnMap);
}
public ArrayList<String> getCropColumns() {
return getColumnList(cropColumnMap);
}
private ArrayList<String> getColumnList( ArrayList<ColumnStruct> m ) {
ArrayList<String> l = new ArrayList<String>();
for ( ColumnStruct cs : m )
// if ( cs.displayable || cs.mandatory )
if (( cs.displayable || cs.mandatory ) && ! cs.pseudoColumn )
l.add( cs.columnName );
return l;
}
public ArrayList<String> getPlantingDisplayableColumns() {
return getDisplayableColumns( plantingColumnMap );
}
public ArrayList<String> getCropDisplayableColumns() {
return getDisplayableColumns( cropColumnMap );
}
private ArrayList<String> getDisplayableColumns( ArrayList<ColumnStruct> m ) {
ArrayList<ColumnStruct> l = new ArrayList<ColumnStruct>();
/* collect displayable columns */
for ( ColumnStruct cs : m ) {
if ( cs.displayable )
l.add( cs );
}
/* sort the columns to move all of the "most important" to the top */
Collections.sort( l, new Comparator<ColumnStruct>() {
public int compare( ColumnStruct c1, ColumnStruct c2 ) {
if ( c1.mostImportant == c2.mostImportant )
return 0;
else if ( c1.mostImportant && ! c2.mostImportant )
return -1;
else if ( ! c1.mostImportant && c2.mostImportant )
return 1;
else
return 0;
}
} );
/* now just collect the column names from the sorted list */
ArrayList<String> als = new ArrayList<String>();
for ( ColumnStruct cs : l )
als.add( cs.columnName );
return als;
}
protected String getCropColumnNameForProperty( int prop ) {
return getColNameForProperty( prop, cropColumnMap );
}
protected String getPlantingColumnNameForProperty( int prop ) {
return getColNameForProperty( prop, plantingColumnMap );
}
private String getColNameForProperty( int prop, ArrayList<ColumnStruct> m ) {
for ( ColumnStruct cs : m ) {
if ( cs.propertyNum == prop )
return cs.columnName;
}
CPSModule.debug( "HSQLColumnMap", "Error:NoSuchProperty (" + prop + ")" );
return "Error:NoSuchProperty (" + prop + ")";
}
protected int getCropPropertyNumFromName( String colName ) {
return getPropertyNumForColumn( colName, cropColumnMap );
}
protected int getPlantingPropertyNumFromName( String colName ) {
return getPropertyNumForColumn( colName, plantingColumnMap );
}
private int getPropertyNumForColumn( String colName, ArrayList<ColumnStruct> m ) {
for ( ColumnStruct cs : m ) {
if ( colName.equalsIgnoreCase( cs.columnName ))
return cs.propertyNum;
}
return 0;
}
private void buildCropColumnMap() {
ArrayList<ColumnStruct> l = new ArrayList<ColumnStruct>();
/*
* If a column is inheritable from a crop to a var, then duplicate the
* column name in the "mapsTo" field.
*/
// (mapsTo: null == not inherited)
// l.add( new ColumnStruct( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, prettyName ));
l.add( new ColumnStruct( "id", CPSDataModelConstants.PROP_CROP_ID, null, null, true, false, false, false, false, "" ));
l.add( new ColumnStruct( "crop_name", CPSDataModelConstants.PROP_CROP_NAME, null, null, true, true, true, true, true, "Crop Name" ));
l.add( new ColumnStruct( "var_name", CPSDataModelConstants.PROP_VAR_NAME, null, null, false, true, true, true, true, "Variety Name" ));
l.add( new ColumnStruct( "bot_name", CPSDataModelConstants.PROP_BOT_NAME, "bot_name", null, false, false, true, false, false, "Botanical Name" ));
l.add( new ColumnStruct( "description", CPSDataModelConstants.PROP_CROP_DESC, null, null, false, false, true, false, false, "Description" ));
l.add( new ColumnStruct( "keywords", CPSDataModelConstants.PROP_KEYWORDS, null, null, false, true, true, false, false, "Keywords" ));
l.add( new ColumnStruct( "other_req", CPSDataModelConstants.PROP_OTHER_REQ, "other_req", null, false, true, true, false, false, "Other Requirements" ));
l.add( new ColumnStruct( "notes", CPSDataModelConstants.PROP_NOTES, null, null, false, false, true, false, false, "Notes" ));
l.add( new ColumnStruct( "maturity", CPSDataModelConstants.PROP_MATURITY, "maturity", null, false, true, false, true, true, "Maturity Days" ));
l.add( new ColumnStruct( "direct_seed", CPSDataModelConstants.PROP_DIRECT_SEED, "direct_seed", null, false, true, false, false, true, "Can be direct seeded?" ));
l.add( new ColumnStruct( "ds_mat_adjust", CPSDataModelConstants.PROP_DS_MAT_ADJUST, "ds_mat_adjust", null, false, true, false, false, false, "Mat. Adjustment (DS)" ));
l.add( new ColumnStruct( "ds_rows_p_bed", CPSDataModelConstants.PROP_DS_ROWS_P_BED, "ds_rows_p_bed", null, false, true, false, false, true, "Rows/Bed (DS)" ));
l.add( new ColumnStruct( "ds_row_space", CPSDataModelConstants.PROP_DS_SPACE_BETROW, "ds_row_space", null, false, true, false, false, false, "Space between Rows (DS)" ));
l.add( new ColumnStruct( "ds_plant_notes", CPSDataModelConstants.PROP_DS_PLANT_NOTES, "ds_plant_notes", null, false, true, true, false, false, "Planting Notes (DS)" ));
l.add( new ColumnStruct( "transplant", CPSDataModelConstants.PROP_TRANSPLANT, "transplant", null, false, true, false, false, false, "Can be Transplanted?" ));
l.add( new ColumnStruct( "tp_mat_adjust", CPSDataModelConstants.PROP_TP_MAT_ADJUST, "tp_mat_adjust", null, false, true, false, false, false, "Mat. Adjustment (TP)" ));
l.add( new ColumnStruct( "tp_rows_p_bed", CPSDataModelConstants.PROP_TP_ROWS_P_BED, "tp_rows_p_bed", null, false, true, false, false, true, "Rows/Bed (TP)" ));
l.add( new ColumnStruct( "tp_row_space", CPSDataModelConstants.PROP_TP_SPACE_BETROW, "tp_row_space", null, false, true, false, false, false, "Space between Rows (TP)" ));
l.add( new ColumnStruct( "tp_inrow_space", CPSDataModelConstants.PROP_TP_SPACE_INROW, "tp_inrow_space", null, false, true, false, false, true, "Space between Plants (TP)" ));
l.add( new ColumnStruct( "tp_time_in_gh", CPSDataModelConstants.PROP_TP_TIME_IN_GH, "tp_time_in_gh", null, false, true, false, false, true, "Weeks In GH (TP)" ));
l.add( new ColumnStruct( "tp_flat_size", CPSDataModelConstants.PROP_TP_FLAT_SIZE, "tp_flat_size", null, false, true, true, false, false, "Plug Flat Size or Capacity" ));
l.add( new ColumnStruct( "tp_pot_up", CPSDataModelConstants.PROP_TP_POT_UP, "tp_pot_up", null, false, true, true, false, false, "Pot up? (TP)" ));
l.add( new ColumnStruct( "tp_pot_up_notes",CPSDataModelConstants.PROP_TP_POT_UP_NOTES, "tp_pot_up_notes", null, false, true, true, false, false, "Plug Flat Size or Capacity" ));
l.add( new ColumnStruct( "tp_plant_notes", CPSDataModelConstants.PROP_TP_PLANT_NOTES, "tp_plant_notes", null, false, true, true, false, false, "Seeding Notes (TP)" ));
l.add( new ColumnStruct( "frost_hardy", CPSDataModelConstants.PROP_FROST_HARDY, "frost_hardy", null, false, true, false, false, true, "Frost Hardy", "Hardy" ) );
l.add( new ColumnStruct( "yield_p_foot", CPSDataModelConstants.PROP_YIELD_P_FOOT, "yield_p_foot", null, false, true, false, false, true, "Yield/Foot" ));
l.add( new ColumnStruct( "yield_num_weeks",CPSDataModelConstants.PROP_YIELD_NUM_WEEKS, "yield_num_weeks", null, false, true, false, false, false, "Yields For (weeks)" ));
l.add( new ColumnStruct( "yield_p_week", CPSDataModelConstants.PROP_YIELD_P_WEEK, "yield_p_week", null, false, true, false, false, false, "Yield/Week" ));
l.add( new ColumnStruct( "crop_unit", CPSDataModelConstants.PROP_CROP_UNIT, "crop_unit", null, false, true, true, false, false, "Yield Unit" ));
l.add( new ColumnStruct( "crop_unit_value",CPSDataModelConstants.PROP_CROP_UNIT_VALUE, "crop_unit_value", null, false, true, false, false, true, "Unit Value" ));
l.add( new ColumnStruct( "fam_name", CPSDataModelConstants.PROP_FAM_NAME, "fam_name", null, false, true, true, true, true, "Family Name" ));
l.add( new ColumnStruct( "groups", CPSDataModelConstants.PROP_GROUPS, "groups", null, false, true, true, false, false, "Groups" ));
// l.add( new ColumnStruct( colName, mapsTo, calc, mand, disp, filt, def, imp, prettyName ));
cropColumnMap = l;
}
private void buildPlantingColumnMap() {
ArrayList<ColumnStruct> l = new ArrayList<ColumnStruct>();
// l.add( new ColumnStruct( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, edit, pseudo, prettyName, shortName ));
l.add( new ColumnStruct( "id", CPSDataModelConstants.PROP_PLANTING_ID, null, null, true, false, false, false, false, false, false, "" ) );
l.add( new ColumnStruct( "crop_name", CPSDataModelConstants.PROP_CROP_NAME, "crop_name", null, true, true, true, true, true, true, false, "Crop Name", "Crop" ));
l.add( new ColumnStruct( "var_name", CPSDataModelConstants.PROP_VAR_NAME, "var_name", null, false, true, true, true, true, true, false, "Variety Name", "Variety" ));
l.add( new ColumnStruct( "groups", CPSDataModelConstants.PROP_GROUPS, "groups", null, false, true, true, false, false, true, false, "Groups" ) );
l.add( new ColumnStruct( "location", CPSDataModelConstants.PROP_LOCATION, null, null, false, true, true, true, true, true, false, "Location", "Loc." ) );
l.add( new ColumnStruct( "keywords", CPSDataModelConstants.PROP_KEYWORDS, "keywords", null, false, true, true, false, false, true, false, "Keywords" ) );
l.add( new ColumnStruct( "other_req", CPSDataModelConstants.PROP_OTHER_REQ, "other_req", null, false, true, true, false, false, true, false, "Other Requirements" ) );
l.add( new ColumnStruct( "notes", CPSDataModelConstants.PROP_NOTES, null, null, false, true, true, false, false, true, false, "Notes" ) );
l.add( new ColumnStruct( "ignore", CPSDataModelConstants.PROP_IGNORE, null, null, false, true, false, false, false, true, false, "Ignore?", "Ign?" ) );
l.add( new ColumnStruct( "maturity", CPSDataModelConstants.PROP_MATURITY, "maturity", null, false, true, false, true, true, true, false, "Maturity Days", "Mat." ) );
// l.add( new ColumnStruct( "mat_adjust", CPSDataModelConstants.PROP_MAT_ADJUST, "direct_seed, ds_mat_adjust, tp_mat_adjust",
// null, false, true, false, false, false, true, false, "Mat. Adjustment", "Mat +/-" ) );
l.add( new ColumnStruct( "mat_adjust", CPSDataModelConstants.PROP_MAT_ADJUST, null, "CASE WHEN direct_seed THEN ds_mat_adjust ELSE tp_mat_adjust END",
false, true, false, false, false, false, true, "Mat. Adjustment", "Mat +/-" ) );
l.add( new ColumnStruct( "ds_mat_adjust", CPSDataModelConstants.PROP_DS_MAT_ADJUST, "ds_mat_adjust", null, false, false, false, false, false, true, false, "Mat. Adjustment (DS)", "Mat +/- (DS)" ) );
l.add( new ColumnStruct( "tp_mat_adjust", CPSDataModelConstants.PROP_TP_MAT_ADJUST, "tp_mat_adjust", null, false, false, false, false, false, true, false, "Mat. Adjustment (TP)", "Mat +/- (TP)" ) );
l.add( new ColumnStruct( "direct_seed", CPSDataModelConstants.PROP_DIRECT_SEED, "direct_seed", null, false, true, false, false, true, true, false, "Direct Seeded", "DS" ));
l.add( new ColumnStruct( "frost_hardy", CPSDataModelConstants.PROP_FROST_HARDY, "frost_hardy", null, false, true, false, false, true, true, false, "Frost Hardy", "Hardy" ));
l.add( new ColumnStruct( "time_to_tp", CPSDataModelConstants.PROP_TIME_TO_TP, "direct_seed, NULL, tp_time_in_gh",
null, false, true, false, false, true, true, false, "Time in GH (weeks)", "Weeks in GH" ));
// the order of these calculations, or at least the order in which they
// appear in the COALESCE statement, is important to ensure that values
// are calculated from the proper ... other values -- since the the other
// values might have to be filled in as we go
// l.add( new ColumnStruct( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, edit, pseudo, prettyName, shortName ));
l.add( new ColumnStruct( "date_plant", CPSDataModelConstants.PROP_DATE_PLANT, null, "COALESCE( date_plant_actual, date_plant_plan )",
false, true, true, true, true, false, true, "Planting Date (Effective)", "Plant" ));
l.add( new ColumnStruct( "date_plant_plan", CPSDataModelConstants.PROP_DATE_PLANT_PLAN, null, "\"CPS.Core.DB.HSQLCalc.plantFromTP\"( date_tp_plan, time_to_tp, direct_seed ), "
+ "\"CPS.Core.DB.HSQLCalc.plantFromHarvest\"( date_harvest_plan, maturity, mat_adjust, time_to_tp, direct_seed ) ",
false, true, true, true, true, true, false, "Planting Date (Planned)", "Plant" ));
l.add( new ColumnStruct( "date_plant_actual", CPSDataModelConstants.PROP_DATE_PLANT_ACTUAL, null, "\"CPS.Core.DB.HSQLCalc.plantFromTP\"( date_tp_actual, time_to_tp, direct_seed ), "
+ "\"CPS.Core.DB.HSQLCalc.plantFromHarvest\"( date_harvest_actual, maturity, mat_adjust, time_to_tp, direct_seed ) ",
false, true, true, false, true, true, false, "Planting Date (Actual)", "Plant" ));
l.add( new ColumnStruct( "done_plant", CPSDataModelConstants.PROP_DONE_PLANTING, null, null, false, true, false, true, true, true, false, "Planted?" ));
/* ** */
/* ** */
l.add( new ColumnStruct( "date_tp", CPSDataModelConstants.PROP_DATE_TP, null, "COALESCE( date_tp_actual, date_tp_plan )",
false, true, true, true, true, false, true, "Transplant Date (Effective)", "TP" ));
l.add( new ColumnStruct( "date_tp_plan", CPSDataModelConstants.PROP_DATE_TP_PLAN, null, "\"CPS.Core.DB.HSQLCalc.TPFromPlant\"( date_plant_plan, time_to_tp, direct_seed ), "
+ "\"CPS.Core.DB.HSQLCalc.TPFromHarvest\"( date_harvest_plan, maturity, mat_adjust, direct_seed ) ",
false, true, true, true, true, true, false, "Transplant Date (Planned)", "TP" ));
l.add( new ColumnStruct( "date_tp_actual", CPSDataModelConstants.PROP_DATE_TP_ACTUAL, null, "\"CPS.Core.DB.HSQLCalc.TPFromPlant\"( date_plant_actual, time_to_tp, direct_seed ), "
+ "\"CPS.Core.DB.HSQLCalc.TPFromHarvest\"( date_harvest_actual, maturity, mat_adjust, direct_seed ) ",
false, true, true, false, true, true, false, "Transplant Date (Actual)", "TP" ));
l.add( new ColumnStruct( "done_tp", CPSDataModelConstants.PROP_DONE_TP, null, null, false, true, false, true, true, true, false, "Transplanted?" ));
/* ** */
/* ** */
l.add( new ColumnStruct( "date_harvest", CPSDataModelConstants.PROP_DATE_HARVEST, null, "COALESCE( date_harvest_actual, date_harvest_plan )",
false, true, true, true, true, false, true, "Harvest Date (Effective)", "Pick" ));
l.add( new ColumnStruct( "date_harvest_plan", CPSDataModelConstants.PROP_DATE_HARVEST_PLAN, null, "\"CPS.Core.DB.HSQLCalc.harvestFromTP\"( date_tp_plan, maturity, mat_adjust, direct_seed ), "
+ "\"CPS.Core.DB.HSQLCalc.harvestFromPlant\"( date_plant_plan, maturity, mat_adjust, time_to_tp, direct_seed ) ",
false, true, true, true, true, true, false, "Harvest Date (Planned)", "Pick" ));
l.add( new ColumnStruct( "date_harvest_actual", CPSDataModelConstants.PROP_DATE_HARVEST_ACTUAL,null, "\"CPS.Core.DB.HSQLCalc.harvestFromTP\"( date_tp_actual, maturity, mat_adjust, direct_seed ), "
+ "\"CPS.Core.DB.HSQLCalc.harvestFromPlant\"( date_plant_actual, maturity, mat_adjust, time_to_tp, direct_seed ) ",
false, true, true, false, true, true, false, "Harvest Date (Actual)", "Pick" ));
l.add( new ColumnStruct( "done_harvest", CPSDataModelConstants.PROP_DONE_HARVEST, null, null, false, true, false, true, true, true, false, "Picked?" ));
// l.add( new ColumnStruct( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, edit, pseudo, prettyName, shortName ));
l.add( new ColumnStruct( "beds_to_plant", CPSDataModelConstants.PROP_BEDS_PLANT, null, "\"CPS.Core.DB.HSQLCalc.bedsFromRowFt\"( rowft_to_plant, rows_p_bed, \"CPS.Core.DB.HSQLCalc.bedLength\"( location ) ), "
+ "\"CPS.Core.DB.HSQLCalc.bedsFromPlants\"( plants_needed, inrow_space, rows_p_bed, \"CPS.Core.DB.HSQLCalc.bedLength\"( location ) )",
false, true, false, false, true, true, false, "Beds to Plant", "Beds" ));
// l.add( new ColumnStruct( "rows_p_bed", CPSDataModelConstants.PROP_ROWS_P_BED, "direct_seed, ds_rows_p_bed, tp_rows_p_bed",
// null, false, true, false, false, false, true, false, "Rows/Bed" ));
l.add( new ColumnStruct( "rows_p_bed", CPSDataModelConstants.PROP_ROWS_P_BED, null, "CASE WHEN direct_seed THEN ds_rows_p_bed ELSE tp_rows_p_bed END",
false, true, false, false, false, false, true, "Rows/Bed" ) );
l.add( new ColumnStruct( "ds_rows_p_bed", CPSDataModelConstants.PROP_DS_ROWS_P_BED, "ds_rows_p_bed", null, false, false, false, false, false, true, false, "Rows/Bed (DS)" ) );
l.add( new ColumnStruct( "tp_rows_p_bed", CPSDataModelConstants.PROP_TP_ROWS_P_BED, "tp_rows_p_bed", null, false, false, false, false, false, true, false, "Rows/Bed (TP)" ) );
l.add( new ColumnStruct( "plants_needed", CPSDataModelConstants.PROP_PLANTS_NEEDED, null, "\"CPS.Core.DB.HSQLCalc.plantsFromBeds\"( beds_to_plant, inrow_space, rows_p_bed, \"CPS.Core.DB.HSQLCalc.bedLength\"( location ) ), "
+ "\"CPS.Core.DB.HSQLCalc.plantsFromRowFt\"( rowft_to_plant, inrow_space )",
false, true, false, false, true, true, false, "Plants Needed", "Need" ));
l.add( new ColumnStruct( "plants_to_start", CPSDataModelConstants.PROP_PLANTS_START, null, "\"CPS.Core.DB.HSQLCalc.plantsToStart\"( plants_needed )",
false, true, false, false, true, true, false, "Plants to Start (Needed + Fudge)", "Start" ));
l.add( new ColumnStruct( "rowft_to_plant", CPSDataModelConstants.PROP_ROWFT_PLANT, null, "\"CPS.Core.DB.HSQLCalc.rowFtFromBeds\"( beds_to_plant, rows_p_bed, \"CPS.Core.DB.HSQLCalc.bedLength\"( location ) ), "
+ "\"CPS.Core.DB.HSQLCalc.rowFtFromPlants\"( plants_needed, inrow_space )",
false, true, false, false, true, true, false, "Row Feet to Plant", "Rowft" ));
l.add( new ColumnStruct( "inrow_space", CPSDataModelConstants.PROP_SPACE_INROW, "direct_seed, NULL, tp_inrow_space",
null, false, true, false, false, false, true, false, "Spacing between Plants", "Inrow Space" ));
// l.add( new ColumnStruct( "row_space", CPSDataModelConstants.PROP_SPACE_BETROW, "direct_seed, ds_row_space, tp_row_space",
// null, false, true, false, false, false, true, false, "Spacing between Rows", "Row Space" ));
l.add( new ColumnStruct( "row_space", CPSDataModelConstants.PROP_SPACE_BETROW, null, "CASE WHEN direct_seed THEN ds_row_space ELSE tp_row_space END",
false, true, false, false, false, false, true, "Spacing between Rows", "Row Space" ));
l.add( new ColumnStruct( "ds_row_space", CPSDataModelConstants.PROP_DS_SPACE_BETROW, "ds_row_space", null, false, false, false, false, false, true, false, "Spacing between Rows (DS)", "Row Space (DS)" ));
l.add( new ColumnStruct( "tp_row_space", CPSDataModelConstants.PROP_TP_SPACE_BETROW, "tp_row_space", null, false, false, false, false, false, true, false, "Spacing between Rows (TP)", "Row Space (TP)" ));
l.add( new ColumnStruct( "flat_size", CPSDataModelConstants.PROP_FLAT_SIZE, "direct_seed, NULL, tp_flat_size",
null, false, true, true, false, false, true, false, "GH Flat Size or Capacity", "Flat" ));
l.add( new ColumnStruct( "flats_needed", CPSDataModelConstants.PROP_FLATS_NEEDED, null, "\"CPS.Core.DB.HSQLCalc.flatsNeeded\"( plants_to_start, flat_size )",
false, true, false, false, true, true, false, "GH Flats Needed", "Flats" ));
// l.add( new ColumnStruct( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, edit, pseudo, prettyName ));
// l.add( new ColumnStruct( "plant_notes_inh", CPSDataModelConstants.PROP_PLANT_NOTES, "direct_seed, ds_plant_notes, tp_plant_notes",
// null, false, true, true, false, false, true, false, "Notes on Seeding (for crop)", "Notes" ));
l.add( new ColumnStruct( "planting_notes", CPSDataModelConstants.PROP_PLANT_NOTES, null, "CASE WHEN direct_seed THEN ds_crop_notes ELSE tp_crop_notes END",
false, true, true, false, false, false, true, "Notes on Seeding (for crop)", "Notes" ));
l.add( new ColumnStruct( "ds_crop_notes", CPSDataModelConstants.PROP_DS_PLANT_NOTES, "ds_plant_notes", null, false, false, false, false, false, true, false, "DS Notes on Seeding (for crop)", "DS Notes" ));
l.add( new ColumnStruct( "tp_crop_notes", CPSDataModelConstants.PROP_TP_PLANT_NOTES, "tp_plant_notes", null, false, false, false, false, false, true, false, "TP Notes on Seeding (for crop)", "TP Notes" ));
l.add( new ColumnStruct( "plant_notes_spec",CPSDataModelConstants.PROP_PLANT_NOTES_SPECIFIC, null, null, false, true, true, false, false, true, false, "Notes on Planting (for this planting)", "Notes" ));
l.add( new ColumnStruct( "pot_up", CPSDataModelConstants.PROP_TP_POT_UP, "direct_seed, NULL, tp_pot_up",
null, false, true, false, false, false, true, false, "Pot up? " ));
l.add( new ColumnStruct( "pot_up_notes", CPSDataModelConstants.PROP_TP_POT_UP_NOTES,"direct_seed, NULL, tp_pot_up_notes",
null, false, true, true, false, false, true, false, "Notes on Potting Up" ));
l.add( new ColumnStruct( "yield_p_foot", CPSDataModelConstants.PROP_YIELD_P_FOOT, "yield_p_foot", null, false, true, false, false, false, true, false, "Yield/Foot" ));
l.add( new ColumnStruct( "total_yield", CPSDataModelConstants.PROP_TOTAL_YIELD, null, "\"CPS.Core.DB.HSQLCalc.totalYieldFromRowFt\"( rowft_to_plant, yield_p_foot )",
false, true, false, false, true, true, false, "Total Yield" ));
l.add( new ColumnStruct( "yield_num_weeks", CPSDataModelConstants.PROP_YIELD_NUM_WEEKS,"yield_num_weeks", null, false, true, false, false, false, true, false, "Yields For (weeks)" ));
l.add( new ColumnStruct( "yield_p_week", CPSDataModelConstants.PROP_YIELD_P_WEEK, "yield_p_week", null, false, true, false, false, false, true, false, "Yield/Week" ));
l.add( new ColumnStruct( "crop_unit", CPSDataModelConstants.PROP_CROP_UNIT, "crop_unit", null, false, true, false, false, false, true, false, "Yield Unit" ));
l.add( new ColumnStruct( "crop_unit_value", CPSDataModelConstants.PROP_CROP_UNIT_VALUE,"crop_unit_value", null, false, true, false, false, false, true, false, "Unit Value" ));
l.add( new ColumnStruct( "custom1", CPSDataModelConstants.PROP_CUSTOM1, null, null, false, true, false, false, false, true, false, "Custom1" ));
l.add( new ColumnStruct( "custom2", CPSDataModelConstants.PROP_CUSTOM2, null, null, false, true, false, false, false, true, false, "Custom2" ));
l.add( new ColumnStruct( "custom3", CPSDataModelConstants.PROP_CUSTOM3, null, null, false, true, false, false, false, true, false, "Custom3" ));
l.add( new ColumnStruct( "custom4", CPSDataModelConstants.PROP_CUSTOM4, null, null, false, true, false, false, false, true, false, "Custom4" ));
l.add( new ColumnStruct( "custom5", CPSDataModelConstants.PROP_CUSTOM5, null, null, false, true, false, false, false, true, false, "Custom5" ));
plantingColumnMap = l;
}
public class ColumnStruct {
public String columnName;
public int propertyNum;
public String prettyColumnName;
public String shortColumnName;
public String columnDescription;
public String correlatedColumn;
public String calculation;
public boolean mandatory;
public boolean displayable;
public boolean filterable;
public boolean displayByDefault;
public boolean mostImportant;
public boolean editable;
public boolean pseudoColumn;
// w/o edit, pseudo or shortname
public ColumnStruct( String colName,
int propNum,
String mapsTo,
String calc,
boolean mand,
boolean disp,
boolean filt,
boolean def,
boolean imp,
String prettyName ) {
this( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, true, false, prettyName, null );
}
// w/o edit, pseudo but w/ shortname
public ColumnStruct( String colName,
int propNum,
String mapsTo,
String calc,
boolean mand,
boolean disp,
boolean filt,
boolean def,
boolean imp,
String prettyName,
String shortName ) {
this( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, true, false, prettyName, shortName );
}
// w/ edit and pseudo but w/o shortname
public ColumnStruct( String colName,
int propNum,
String mapsTo,
String calc,
boolean mand,
boolean disp,
boolean filt,
boolean def,
boolean imp,
boolean edit,
boolean pseudo,
String prettyName ) {
this( colName, propNum, mapsTo, calc, mand, disp, filt, def, imp, edit, pseudo, prettyName, null );
}
public ColumnStruct( String colName,
int propNum,
String mapsTo,
String calc,
boolean mand,
boolean disp,
boolean filt,
boolean def,
boolean imp,
boolean edit,
boolean pseudo,
String prettyName,
String shortName ) {
this.columnName = colName;
this.propertyNum = propNum;
this.prettyColumnName = prettyName;
this.columnDescription = "";
this.correlatedColumn = mapsTo;
this.calculation = calc;
this.mandatory = mand;
this.displayable = disp;
this.filterable = filt;
this.displayByDefault = def;
this.mostImportant = imp;
this.editable = edit;
this.pseudoColumn = pseudo;
this.shortColumnName = shortName;
}
}
}