/// <summary>
 /// Replace Date Components in a given MetaDataFormula formula
 /// </summary>
 /// <param name="formula">The formula which needs to have its date components replaced with text component</param>
 /// <returns>MetaDataFormula object after replacing all Date components with Text components</returns>
 public MetaDataFormula ReplaceDateCompWithTextComp(MetaDataFormula formula)
 {
     var builder = new FormulaBuilder();
     builder.SetFormulaComponentsFromSerialisedFormula(formula.Formula);
     List<FormulaComponentBase> componentsList = ReplaceDateCompWithTextComp(builder.FormulaComponents);
     builder.FormulaComponents.Clear();
     builder.FormulaComponents.AddRange(componentsList);
     formula.Formula = builder.Formula;
     return formula;
 }
 /// <summary>
 /// Retrieves all the LookupFormulaComponents contained within the specified FormulaComponentBase List.
 /// </summary>
 /// <param name="metaDataFormula">
 /// The Formula to search
 /// </param>
 /// <returns>
 /// All LookupFormulaComponents found.
 /// </returns>
 public List<LookupFormulaComponent> FindLookupFormulaComponents(MetaDataFormula metaDataFormula)
 {
     var formulaBuilder = new FormulaBuilder();
     formulaBuilder.SetFormulaComponentsFromSerialisedFormula(metaDataFormula.Formula);
     return FormulaComponentProcessor.FindLookupFormulaComponents(formulaBuilder.FormulaComponents);
 }
 /// <summary>
 /// Matches LookupFormulaComponents in the specified components and lookupValues Key
 /// and substitutes in the relevant primitive FormulaComponent
 /// </summary>
 /// <param name="metaDataFormula">
 /// The Formula to search
 /// </param>
 /// <param name="lookupValues">The dictionary containing the resolved values.</param>
 /// <returns>The altered formula.</returns>
 public MetaDataFormula ReplaceLookupFormulaComponents(MetaDataFormula metaDataFormula,
                                                       Dictionary<LookupFormulaComponent, object> lookupValues)
 {
     var formulabuilder = new FormulaBuilder();
     formulabuilder.SetFormulaComponentsFromSerialisedFormula(metaDataFormula.Formula);
     var amendedFormulaComponents = new List<FormulaComponentBase>();
     amendedFormulaComponents.AddRange(
         FormulaComponentProcessor.ReplaceLookupFormulaComponents(formulabuilder.FormulaComponents, lookupValues));
     formulabuilder.FormulaComponents.Clear();
     formulabuilder.FormulaComponents.AddRange(amendedFormulaComponents);
     metaDataFormula.Formula = formulabuilder.Formula;
     return metaDataFormula;
 }
 /// <summary>
 /// Given a list of FQNs and their values this will replace the fqn formula components
 /// with primitive components containing the values provided.
 /// </summary>
 /// <param name="formula">
 /// The Target Formula.
 /// </param>
 /// <param name="fqnValues">
 /// The dictionary containing the resolved values.
 /// </param>
 /// <returns>
 /// MetaDataFormula instance with the formula updated
 /// </returns>
 public MetaDataFormula ReplaceFqnFormulaComponents(
     MetaDataFormula formula, Dictionary<FqnFormulaComponent, object> fqnValues)
 {
     var fb = new FormulaBuilder();
     fb.SetFormulaComponentsFromSerialisedFormula(formula.Formula);
     var newCmpList = new List<FormulaComponentBase>();
     newCmpList.AddRange(FormulaComponentProcessor.ReplaceFqnFormulaComponents(fb.FormulaComponents, fqnValues));
     fb.FormulaComponents.Clear();
     fb.FormulaComponents.AddRange(newCmpList);
     formula.Formula = fb.Formula;
     return formula;
 }