public UAReturn RefreshNewDataset(ServerDataSource dataSource)//03Jan2014
{
UAReturn result = new UAReturn() { Success = false };
if (true)// (dispatcher.GetErrorText().Contains(BSky.Statistics.R.RService.RCommandReturn.Success))
{
//Get matrix columns
string subCommand = RCommandStrings.GetDataFrameColumnNames(dataSource);
object colnames = dispatcher.EvaluateToObject(subCommand, false);
//if colnames are null. Because we were unable to open the dataset because of any reason.
if (colnames == null)
{
CloseDataset(dataSource);
result.Success = false;
result.Error = "Error Opening Dataset.";
return result;
}
//if colnames are duplicate then we dont load the dataset and show error message. Also we clean R
if (isDuplicateColnames(colnames))
{
CloseDataset(dataSource);
result.Success = false;
result.Error = "Dulicate Column Names in Dataset";
return result;
}
if (colnames != null)
{
string[] columnNames = null;//var columnNames = new string[] { "aaa", "bbb" };
Type retType = colnames.GetType();
if (retType.Name == "String[]")//for multicols
{
columnNames = (String[])colnames;
}
else if (retType.Name == "String")//for single col
{
columnNames = new string[1];
columnNames[0] = (String)colnames;
}
else
{
return new UAReturn() { Success = false };
}
//maximum factors allowed
object maxf = (getMaxFactors(dataSource));
//sym = maxf as SymbolicExpression;
int mxf;//sym.AsInteger()[0];
bool parseSuccess = int.TryParse(maxf.ToString(), out mxf);
dataSource.MaxFactors = parseSuccess ? mxf : 40; //Hardcoded Default max factor count //int.Parse(maxf.ToString());
dataSource.Variables.Clear();
int rowcount = GetRowCount(dataSource);//get number of rows in dataset/dataframe
int columnindex = 1;
SymbolicExpression symex = null;
foreach (object s in columnNames)
{
symex = dispatcher.EvaluateToSymExp(string.Format("UAgetColProperties(dataSetNameOrIndex='{0}', colNameOrIndex={1}, asClass=FALSE)", dataSource.Name, columnindex));
GenericVector gv = symex.AsList();
string colclass = dispatcher.RawEvaluateGetstring(string.Format("class({0}[[{1}]])", dataSource.Name, columnindex));//,true);
if (colclass == null)
{
colclass = "";
}
string lab = (gv[2]!=null && gv[2].AsCharacter()!=null && gv[2].AsCharacter()[0]!=null) ?gv[2].AsCharacter()[0].ToString() :string.Empty;
DataColumnTypeEnum dtyp = (gv[1]!=null && gv[1].AsCharacter()!=null && gv[1].AsCharacter()[0]!=null) ?GetCovertedDataType(gv[1].AsCharacter()[0].ToString()) : DataColumnTypeEnum.Character;
string mistyp = (gv[5]!=null && gv[5].AsCharacter()!=null && gv[5].AsCharacter()[0]!=null) ?gv[5].AsCharacter()[0].ToString() :string.Empty;
DataSourceVariable var = new DataSourceVariable()
{
Name = s.ToString(),
Label = lab,
DataType = dtyp,
DataClass = colclass,
Measure = DataColumnMeasureEnum.Scale,
Width = 4,
Decimals = 0,
Columns = 8,
MissType = mistyp,
RowCount = rowcount //GetVectorLength(dataSource, s.ToString())
};
if (symex != null)
{
//if
{
////Set Measure
//logService.WriteToLogLevel("Set Measure start : " + s.ToString(), LogLevelEnum.Info);
switch (gv[7].AsCharacter()[0].ToString())
{
case "factor":
var.Measure = DataColumnMeasureEnum.Nominal;
break;
case "ordinal":
var.Measure = DataColumnMeasureEnum.Ordinal;
break;
default:
if (var.DataType == DataColumnTypeEnum.Character) //02Jun2015 treating "character" type as Nominal in UI. In R its not factor
{
var.Measure = DataColumnMeasureEnum.Nominal;
}
else
var.Measure = DataColumnMeasureEnum.Scale;
break;
}
CharacterVector cv = gv[3].AsCharacter();
string[] vals = cv.ToArray();
if (vals != null && vals.Length > 0)
{
if (vals.Length > 1)
{
var.Values.AddRange(vals);//more than 1 strings
}
else if (vals[0].Trim().Length > 0)
{
var.Values.Add(vals[0]);//1 string
}
}
if (!(var.MissType == "none"))
{
CharacterVector cvv = gv[3].AsCharacter();
string[] misvals = cvv.ToArray();
if (misvals != null && misvals.Length > 0)
{
if (misvals.Length > 1)
{
var.Missing.AddRange(misvals);//more than 1 strings
}
else if (misvals[0].Trim().Length > 0)
{
var.Missing.Add(misvals[0]);//1 string
}
}
}
else
{
string misval = "none";
var.Missing.Add(misval);
}
}
}
if (dataSource.Extension == "rdata")// if filetype is RDATA.
{
if (gv[9].AsCharacter() != null && gv[9].AsCharacter()[0].ToString() != "-2146826288")
var.Width = Int32.Parse(gv[9].AsCharacter()[0].ToString());
if (gv[10].AsCharacter() != null && gv[10].AsCharacter()[0].ToString() != "-2146826288")
var.Decimals = Int32.Parse(gv[10].AsCharacter()[0].ToString());
if (gv[11].AsCharacter() != null && gv[11].AsCharacter()[0].ToString() != "-2146826288")
var.Columns = UInt32.Parse(gv[11].AsCharacter()[0].ToString());
}
try
{
////////// Alignment ////////////
string align = gv[6].AsCharacter()[0].ToString();
if (align == "-2146826288") align = "Left";
DataColumnAlignmentEnum alignVal = (DataColumnAlignmentEnum)Enum.Parse(typeof(DataColumnAlignmentEnum), align);
if (Enum.IsDefined(typeof(DataColumnAlignmentEnum), alignVal))
var.Alignment = alignVal;
else
var.Alignment = DataColumnAlignmentEnum.Left;
var.Role = DataColumnRole.Input;// Role is not used, I guess, so 'if' is commented above
}
catch (ArgumentException ex)
{
logService.WriteToLogLevel("Not a member of enum(Alignment) ", LogLevelEnum.Error);
}
dataSource.Variables.Add(var);
columnindex++;
dataSource.RowCount = Math.Max(dataSource.RowCount, dataSource.Variables.Last().RowCount);
}
result.Datasource = dataSource;
result.Success = true;
this.DataSources.Add(dataSource);
}
}
else // no need of this 'else' unless you want to put custom error message in result
{
}
return result;
}