diff --git a/df12/src/classes/QueryMemoizer b/df12/src/classes/QueryMemoizer new file mode 100644 index 0000000..1682017 --- /dev/null +++ b/df12/src/classes/QueryMemoizer @@ -0,0 +1,14 @@ +public static class QueryMemoizer +{ + private static map> memoizeMap = new map>(); + + public static list getQueryResult(string query) + { + if(!QueryMemoizer.memoizeMap.containskey(query)) + { + list lSobject = Database.query(query); + QueryMemoizer.memoizeMap.put(query,lSobject); + } + return QueryMemoizer.memoizeMap.get(query); + } +} \ No newline at end of file diff --git a/df12/src/classes/SObjectSelector.cls b/df12/src/classes/SObjectSelector.cls index be82fa9..538c026 100644 --- a/df12/src/classes/SObjectSelector.cls +++ b/df12/src/classes/SObjectSelector.cls @@ -70,7 +70,7 @@ public abstract with sharing class SObjectSelector public List selectSObjectsById(Set idSet) { assertIsAccessible(); - return Database.query(String.format('SELECT {0} FROM {1} WHERE id in :idSet ORDER BY {2}', new List{getFieldListString(),getSObjectName(),getOrderBy()})); + return QueryMemoizer.getQueryResult(String.format('SELECT {0} FROM {1} WHERE id in :idSet ORDER BY {2}', new List{getFieldListString(),getSObjectName(),getOrderBy()})); } public void assertIsAccessible() diff --git a/df12/src/classes/StringBuilder.cls b/df12/src/classes/StringBuilder.cls index b605c33..524224a 100644 --- a/df12/src/classes/StringBuilder.cls +++ b/df12/src/classes/StringBuilder.cls @@ -26,76 +26,101 @@ public virtual with sharing class StringBuilder { - protected String m_stringValue; - - public StringBuilder() {} - - public StringBuilder(List values) - { - add(values); - } - - public virtual void add(List values) - { - for(String value : values) - add(value); - } + protected list m_stringValue; + public StringBuilder() + { + m_stringValue = new list(); + } + public StringBuilder(List values) + { + m_stringValue = new list(values); + } + + public virtual void add(List values) + { + m_stringValue.addall(values); + } - public virtual void add(String value) - { - m_stringValue = ( m_stringValue==null ? value : m_stringValue + value ); - } + public virtual void add(String value) + { + m_stringValue.add(value); + } - public virtual String getStringValue() - { - return m_stringValue; - } + public virtual String getStringValue() + { + return string.join(m_stringValue,''); + } - /** Subclasses **/ + /** Subclasses **/ - public virtual with sharing class CSVBuilder extends StringBuilder - { - public CSVBuilder() {} + public virtual with sharing class CSVBuilder extends StringBuilder + { + private transient string formatter = '{0}'; + public CSVBuilder() {} - public CSVBuilder(List values) - { - super(values); - } - - public virtual override void add(String value) - { - m_stringValue = ( m_stringValue==null ? '{0}' + value : m_stringValue + ',{0}' + value ); - } - - public override String getStringValue() - { - return getStringValue(''); - } - - public String getStringValue(String itemPrefix) - { - return m_stringValue==null ? null : String.format(m_stringValue,new List{itemPrefix}); - } - } + public CSVBuilder(List values) + { + this.add(values); + } + + public virtual override void add(String value) + { + list values = new list{value}; + this.add(values); + } + + public virtual override void add(list values) + { + if(values == null || values.isempty()) + { + return; + } + list lvalues = new list(); + if(m_stringValue != null ) + { + lvalues .add(this.formatter); + } + for(string aValue : values) + { + lvalues .add(aValue); + lvalues .add(this.formatter); + } + if(!lvalues.isempty()) + { + lvalues.remove(lvalues.size()-1); + } + super.add(lvalues); + } + + public override String getStringValue() + { + return this.getStringValue(','); + } + + public String getStringValue(String itemPrefix) + { + return m_stringValue.isempty() ? null : String.format(super.getStringValue(),new List{itemPrefix}); + } + } - public virtual with sharing class FieldListBuilder extends CSVBuilder - { - public FieldListBuilder(List values) - { - for(Schema.SObjectField value : values) - add(value.getDescribe().getName()); - } - } - - public with sharing class MultiCurrencyFieldListBuilder extends FieldListBuilder - { - public MultiCurrencyFieldListBuilder(List values) - { - super(values); - - if(Userinfo.isMultiCurrencyOrganization()) - add('CurrencyIsoCode'); - } - } -} \ No newline at end of file + public virtual with sharing class FieldListBuilder extends CSVBuilder + { + public FieldListBuilder(List values) + { + for(Schema.SObjectField value : values) + add(value.getDescribe().getName()); + } + } + + public with sharing class MultiCurrencyFieldListBuilder extends FieldListBuilder + { + public MultiCurrencyFieldListBuilder(List values) + { + super(values); + + if(Userinfo.isMultiCurrencyOrganization()) + add('CurrencyIsoCode'); + } + } +}