diff --git a/.forceignore b/.forceignore new file mode 100644 index 00000000..7b5b5a71 --- /dev/null +++ b/.forceignore @@ -0,0 +1,12 @@ +# List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:status +# More information: https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm +# + +package.xml + +# LWC configuration files +**/jsconfig.json +**/.eslintrc.json + +# LWC Jest +**/__tests__/** \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..140f4745 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Folders to exclude +.settings/ +.sfdx/ +.vscode/ +*/main/default/ + +# Files to exclude +*.log + diff --git a/.travis.yml b/.travis.yml index 22f74c66..7aa5a3f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,27 @@ -language: node_js -node_js: - - "7" -install: - - npm install -g jsforce-metadata-tools +sudo: true +os: trusty +cache: false + +env: +- URL=https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz + +before_install: + #- openssl aes-256-cbc -K $encrypted_b1fbf710b918_key -iv $encrypted_b1fbf710b918_iv + # -in assets/server.key.enc -out assets/server.key -d + - export SFDX_AUTOUPDATE_DISABLE=false + - export SFDX_USE_GENERIC_UNIX_KEYCHAIN=true + - export SFDX_DOMAIN_RETRY=300 + - export SFDX_DISABLE_APP_HUB=true + - export SFDX_LOG_LEVEL=DEBUG + - mkdir sfdx + - wget -qO- $URL | tar xJ -C sfdx --strip-components 1 + - "./sfdx/install" + - export PATH=./sfdx/$(pwd):$PATH + - sfdx --version + - sfdx plugins --core + - echo $SFDX_URL > sfdx_url_file + - sfdx force:auth:sfdxurl:store --sfdxurlfile sfdx_url_file --setalias nebula_ci + script: - - jsforce-deploy --checkOnly -u $DEPLOYMENT_USERNAME -p $DEPLOYMENT_PASSWORD$DEPLOYMENT_TOKEN -D $TRAVIS_BUILD_DIR/src -l $DEPLOYMENT_LOGIN_URL --rollbackOnError true --testLevel $DEPLOYMENT_TEST_LEVEL --pollTimeout $POLL_TIMEOUT --pollInterval $POLL_INTERVAL--verbose \ No newline at end of file + - sfdx force:config:set apiVersion=49.0 + - sfdx force:source:deploy --checkonly --manifest ./manifest/package.xml --testlevel RunLocalTests --targetusername nebula_ci --verbose diff --git a/README.md b/README.md index 0ce74eee..2fc9bcdd 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ A dynamic SOQL query & SOSL search library for for Salesforce Apex

## Overview There are 3 main builder classes -   | SObjectQueryBuilder | AggregateQueryBuilder | SearchBuilder +   | Query | AggregateQuery | RecordSearch ------- | --------------------|-----------------------|-------------- Super Class | Soql.cls (Queries) | Soql.cls (Queries) | Sosl.cls (Searches) | - Action | Queries an SObject | Queries an SObject | Searches 1 or more SObjects @@ -31,13 +31,13 @@ Returns | `SObject` or `List` | `AggregateResult` or `List accounts = new SObjectQueryBuilder(Schema.Account.SObjectType).getResults(); +List accounts = new Query(Schema.Account.SObjectType).getResults(); ``` **Advanced Usage:** Query an object & leverage the query builder methods. The order of the builder methods does not matter - you can arrange the calls to these methods in any order that you prefer. ``` -SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType) // Query the account object +Query accountQuery = new Query(Schema.Account.SObjectType) // Query the account object .addField(Schema.Account.ParentId) // Include the ParentId field, using SObjectField. The current user must have at least read access to the field .addField(Schema.Account.Type, Soql.FieldCategory.UPDATEABLE) // Include the Type field if the current user has access to update it .addFields(Soql.FieldCategory.CUSTOM) // Include all custom fields - only fields that are accessible to the user are included @@ -74,9 +74,9 @@ System.debug(accountQuery.getQuery()); **Basic Usage:** Search a single object ``` -SObjectQueryBuilder userQuery = new SObjectQueryBuilder(Schema.User.SObjectType); // Create an instance of SObjectQueryBuilder for an SObject - you can include additional fields, filters, etc -SearchBuilder userSearch = new SearchBuilder('my search term', userQuery); // Create a new SearchBuilder instance with a search term & instance of SObjectQueryBuilder -List userSearchResults = userSearch.getFirstResults(); // SearchBuilder returns a list of lists of sobjects - getFirstResults() returns the first list +Query userQuery = new Query(Schema.User.SObjectType); // Create an instance of Query for an SObject - you can include additional fields, filters, etc +RecordSearch userSearch = new RecordSearch('my search term', userQuery); // Create a new RecordSearch instance with a search term & instance of Query +List userSearchResults = userSearch.getFirstResults(); // RecordSearch returns a list of lists of sobjects - getFirstResults() returns the first list /****** Resulting output ******* FIND 'my search term' IN ALL FIELDS RETURNING User(Id, Name) @@ -88,12 +88,12 @@ System.debug(userSearch.getSearch()); **Advanced Usage:** Search several objects ``` -SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType); // Create an instance of SObjectQueryBuilder for the Account object -SObjectQueryBuilder contactQuery = new SObjectQueryBuilder(Schema.Contact.SObjectType); // Create an instance of SObjectQueryBuilder for the Contact object -SObjectQueryBuilder leadQuery = new SObjectQueryBuilder(Schema.Lead.SObjectType); // Create an instance of SObjectQueryBuilder for the Lead object -List queries = new List{contactQuery, accountQuery, leadQuery}; // Add the SObjectQueryBuilder queries to a list +Query accountQuery = new Query(Schema.Account.SObjectType); // Create an instance of Query for the Account object +Query contactQuery = new Query(Schema.Contact.SObjectType); // Create an instance of Query for the Contact object +Query leadQuery = new Query(Schema.Lead.SObjectType); // Create an instance of Query for the Lead object +List queries = new List{contactQuery, accountQuery, leadQuery}; // Add the Query queries to a list -SearchBuilder mySearch = new SearchBuilder('my search term', queries); // Create a new SearchBuilder instance with a search term & the list of SObjectQueryBuilder queries +RecordSearch mySearch = new RecordSearch('my search term', queries); // Create a new RecordSearch instance with a search term & the list of Query queries List> searchResults = mySearch.getResults(); // Returns all search results /****** Resulting output ******* diff --git a/manifest/package.xml b/manifest/package.xml new file mode 100644 index 00000000..282efc9d --- /dev/null +++ b/manifest/package.xml @@ -0,0 +1,16 @@ + + + NebulaQueryAndSearch + + AggregateQuery + AggregateQuery_Tests + Query + Query_Tests + RecordSearch + RecordSearch_Tests + Soql + Sosl + ApexClass + + 49.0 + diff --git a/src/classes/AggregateQueryBuilder.cls b/nebula-app-framework/main/query-and-search/classes/AggregateQuery.cls similarity index 69% rename from src/classes/AggregateQueryBuilder.cls rename to nebula-app-framework/main/query-and-search/classes/AggregateQuery.cls index 22df2be6..abd06e4f 100644 --- a/src/classes/AggregateQueryBuilder.cls +++ b/nebula-app-framework/main/query-and-search/classes/AggregateQuery.cls @@ -2,28 +2,28 @@ * This file is part of the Nebula Query & Search project, released under the MIT License. * * See LICENSE file or go to https://github.com/jongpie/NebulaQueryAndSearch for full license details. * ******************************************************************************************************/ -public class AggregateQueryBuilder extends Soql { +public class AggregateQuery extends Soql { private Soql.GroupingDimension groupingDimension; private List aggregateFields; private List havingConditions; - public AggregateQueryBuilder(Schema.SObjectType sobjectType) { + public AggregateQuery(Schema.SObjectType sobjectType) { super(sobjectType, false); this.aggregateFields = new List(); this.havingConditions = new List(); } - public AggregateQueryBuilder groupByField(Schema.SObjectField field) { + public AggregateQuery groupByField(Schema.SObjectField field) { return this.groupByFields(new List{field}); } - public AggregateQueryBuilder groupByField(Soql.QueryField queryField) { + public AggregateQuery groupByField(Soql.QueryField queryField) { return this.groupByFields(new List{queryField}); } - public AggregateQueryBuilder groupByFields(List fields) { + public AggregateQuery groupByFields(List fields) { List queryFields = new List(); for(Schema.SObjectField field : fields) { queryFields.add(new Soql.QueryField(field)); @@ -31,12 +31,12 @@ public class AggregateQueryBuilder extends Soql { return this.groupByFields(queryFields); } - public AggregateQueryBuilder groupByFields(List queryFields) { + public AggregateQuery groupByFields(List queryFields) { super.doAddFields(queryFields, null); return this.setHasChanged(); } - public AggregateQueryBuilder groupByFieldSet(Schema.FieldSet fieldSet) { + public AggregateQuery groupByFieldSet(Schema.FieldSet fieldSet) { List queryFields = new List(); for(Schema.FieldSetMember fieldSetMember : fieldSet.getFields()) { queryFields.add(new Soql.QueryField(this.sobjectType, fieldSetMember.getFieldPath())); @@ -44,120 +44,120 @@ public class AggregateQueryBuilder extends Soql { return this.groupByFields(queryFields); } - public AggregateQueryBuilder usingGroupingDimension(Soql.GroupingDimension groupingDimension) { + public AggregateQuery usingGroupingDimension(Soql.GroupingDimension groupingDimension) { this.groupingDimension = groupingDimension; return this.setHasChanged(); } - public AggregateQueryBuilder addAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field) { + public AggregateQuery addAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field) { return this.addAggregate(aggregateFunction, field, null); } - public AggregateQueryBuilder addAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, String fieldAlias) { + public AggregateQuery addAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, String fieldAlias) { return this.addAggregate(aggregateFunction, new Soql.QueryField(field), fieldAlias); } - public AggregateQueryBuilder addAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField) { + public AggregateQuery addAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField) { return this.addAggregate(aggregateFunction, queryField, null); } - public AggregateQueryBuilder addAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, String fieldAlias) { + public AggregateQuery addAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, String fieldAlias) { this.aggregateFields.add(new AggregateField(this.getSObjectType(), aggregateFunction, queryField, fieldAlias)); return this.setHasChanged(); } - public AggregateQueryBuilder havingAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, Soql.Operator operator, Object value) { + public AggregateQuery havingAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, Soql.Operator operator, Object value) { return this.havingAggregate(aggregateFunction, new Soql.QueryField(field), operator, value); } - public AggregateQueryBuilder havingAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, Soql.Operator operator, Object value) { + public AggregateQuery havingAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, Soql.Operator operator, Object value) { this.havingConditions.add(aggregateFunction.name() + '(' + queryField + ') ' + Soql.getOperatorValue(operator) + ' ' + value); return this.setHasChanged(); } - public AggregateQueryBuilder filterWhere(Schema.SObjectField field, Soql.Operator operator, Object value) { + public AggregateQuery filterWhere(Schema.SObjectField field, Soql.Operator operator, Object value) { return this.filterWhere(new Soql.QueryField(field), operator, value); } - public AggregateQueryBuilder filterWhere(Soql.QueryField queryField, Soql.Operator operator, Object value) { + public AggregateQuery filterWhere(Soql.QueryField queryField, Soql.Operator operator, Object value) { return this.filterWhere(new Soql.QueryFilter(queryField, operator, value)); } - public AggregateQueryBuilder filterWhere(Soql.QueryFilter filter) { + public AggregateQuery filterWhere(Soql.QueryFilter filter) { return this.filterWhere(new List{filter}); } - public AggregateQueryBuilder filterWhere(List filters) { + public AggregateQuery filterWhere(List filters) { super.doFilterWhere(filters); return this.setHasChanged(); } - public AggregateQueryBuilder orFilterWhere(List filters) { + public AggregateQuery orFilterWhere(List filters) { super.doOrFilterWhere(filters); return this.setHasChanged(); } - public AggregateQueryBuilder orderByField(Schema.SObjectField field) { + public AggregateQuery orderByField(Schema.SObjectField field) { return this.orderByField(field, null); } - public AggregateQueryBuilder orderByField(Soql.QueryField queryField) { + public AggregateQuery orderByField(Soql.QueryField queryField) { return this.orderByField(queryField, null); } - public AggregateQueryBuilder orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder) { + public AggregateQuery orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder) { return this.orderByField(field, sortOrder, null); } - public AggregateQueryBuilder orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder) { + public AggregateQuery orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder) { return this.orderByField(queryField, sortOrder, null); } - public AggregateQueryBuilder orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { + public AggregateQuery orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { return this.orderByField(new Soql.QueryField(field), sortOrder, sortNullsFirst); } - public AggregateQueryBuilder orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { + public AggregateQuery orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { super.doOrderBy(queryField, sortOrder, sortNullsFirst); return this.setHasChanged(); } - public AggregateQueryBuilder orderByAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field) { + public AggregateQuery orderByAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field) { return this.orderByAggregate(aggregateFunction, field, null); } - public AggregateQueryBuilder orderByAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, Soql.SortOrder sortOrder) { + public AggregateQuery orderByAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, Soql.SortOrder sortOrder) { return this.orderByAggregate(aggregateFunction, field, sortOrder, null); } - public AggregateQueryBuilder orderByAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { + public AggregateQuery orderByAggregate(Soql.Aggregate aggregateFunction, Schema.SObjectField field, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { return this.orderByAggregate(aggregateFunction, new Soql.QueryField(field), sortOrder, sortNullsFirst); } - public AggregateQueryBuilder orderByAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField) { + public AggregateQuery orderByAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField) { return this.orderByAggregate(aggregateFunction, queryField, null); } - public AggregateQueryBuilder orderByAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, Soql.SortOrder sortOrder) { + public AggregateQuery orderByAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, Soql.SortOrder sortOrder) { return this.orderByAggregate(aggregateFunction, queryField, sortOrder, null); } - public AggregateQueryBuilder orderByAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { + public AggregateQuery orderByAggregate(Soql.Aggregate aggregateFunction, Soql.QueryField queryField, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { super.doOrderBy(aggregateFunction.name() + '(' + queryField + ')', sortOrder, sortNullsFirst); return this.setHasChanged(); } - public AggregateQueryBuilder limitTo(Integer numberOfRecords) { + public AggregateQuery limitTo(Integer numberOfRecords) { super.doLimitTo(numberOfRecords); return this.setHasChanged(); } - public AggregateQueryBuilder offsetBy(Integer offset) { + public AggregateQuery offsetBy(Integer offset) { super.doOffsetBy(offset); return this.setHasChanged(); } - public AggregateQueryBuilder cacheResults() { + public AggregateQuery cacheResults() { super.doCacheResults(); return this; } @@ -210,7 +210,7 @@ public class AggregateQueryBuilder extends Soql { return (List)super.doGetResults(); } - private AggregateQueryBuilder setHasChanged() { + private AggregateQuery setHasChanged() { this.hasChanged = true; return this; } @@ -219,7 +219,7 @@ public class AggregateQueryBuilder extends Soql { if(this.aggregateFields.isEmpty()) return ''; List aggregateFieldStrings = new List(); - for(AggregateQueryBuilder.AggregateField aggregatedField : this.aggregateFields) { + for(AggregateQuery.AggregateField aggregatedField : this.aggregateFields) { aggregateFieldStrings.add(aggregatedField.toString()); } aggregateFieldStrings.sort(); diff --git a/src/classes/SObjectQueryBuilder.cls-meta.xml b/nebula-app-framework/main/query-and-search/classes/AggregateQuery.cls-meta.xml similarity index 80% rename from src/classes/SObjectQueryBuilder.cls-meta.xml rename to nebula-app-framework/main/query-and-search/classes/AggregateQuery.cls-meta.xml index 91b23b86..8e4d11f8 100644 --- a/src/classes/SObjectQueryBuilder.cls-meta.xml +++ b/nebula-app-framework/main/query-and-search/classes/AggregateQuery.cls-meta.xml @@ -1,5 +1,5 @@ - 46.0 + 49.0 Active diff --git a/src/classes/SObjectQueryBuilder.cls b/nebula-app-framework/main/query-and-search/classes/Query.cls similarity index 80% rename from src/classes/SObjectQueryBuilder.cls rename to nebula-app-framework/main/query-and-search/classes/Query.cls index 9813ac37..eb90bd61 100644 --- a/src/classes/SObjectQueryBuilder.cls +++ b/nebula-app-framework/main/query-and-search/classes/Query.cls @@ -2,14 +2,14 @@ * This file is part of the Nebula Query & Search project, released under the MIT License. * * See LICENSE file or go to https://github.com/jongpie/NebulaQueryAndSearch for full license details. * ******************************************************************************************************/ -public class SObjectQueryBuilder extends Soql { +public class Query extends Soql { private String displayFieldApiName; private List polymorphicFieldStatements; private List childRelationshipQueries; private Boolean forReference, forUpdate, forView, includeLabels, includeFormattedValues; - public SObjectQueryBuilder(Schema.SObjectType sobjectType) { + public Query(Schema.SObjectType sobjectType) { super(sobjectType, true); this.displayFieldApiName = this.getDisplayFieldApiName(this.sobjectType); @@ -24,27 +24,27 @@ public class SObjectQueryBuilder extends Soql { this.addDefaultFields(); } - public SObjectQueryBuilder addField(Schema.SObjectField field) { + public Query addField(Schema.SObjectField field) { return this.addField(field, null); } - public SObjectQueryBuilder addField(Schema.SObjectField field, Soql.FieldCategory fieldCategory) { + public Query addField(Schema.SObjectField field, Soql.FieldCategory fieldCategory) { return this.addFields(new List{field}, fieldCategory); } - public SObjectQueryBuilder addField(Soql.QueryField queryField) { + public Query addField(Soql.QueryField queryField) { return this.addField(queryField, null); } - public SObjectQueryBuilder addField(Soql.QueryField queryField, Soql.FieldCategory fieldCategory) { + public Query addField(Soql.QueryField queryField, Soql.FieldCategory fieldCategory) { return this.addFields(new List{queryField}, fieldCategory); } - public SObjectQueryBuilder addFields(List fields) { + public Query addFields(List fields) { return this.addFields(fields, null); } - public SObjectQueryBuilder addFields(List fields, Soql.FieldCategory fieldCategory) { + public Query addFields(List fields, Soql.FieldCategory fieldCategory) { List queryFields = new List(); for(Schema.SObjectField field : fields) { queryFields.add(new Soql.QueryField(field)); @@ -52,11 +52,11 @@ public class SObjectQueryBuilder extends Soql { return this.addFields(queryFields, fieldCategory); } - public SObjectQueryBuilder addFields(List queryFields) { + public Query addFields(List queryFields) { return this.addFields(queryFields, null); } - public SObjectQueryBuilder addFields(Soql.FieldCategory fieldCategory) { + public Query addFields(Soql.FieldCategory fieldCategory) { List queryFields = new List(); for(Schema.SObjectField field : this.sobjectDescribe.fields.getMap().values()) { queryFields.add(new Soql.QueryField(field)); @@ -64,16 +64,16 @@ public class SObjectQueryBuilder extends Soql { return this.addFields(queryFields, fieldCategory); } - public SObjectQueryBuilder addFields(List queryFields, Soql.FieldCategory fieldCategory) { + public Query addFields(List queryFields, Soql.FieldCategory fieldCategory) { super.doAddFields(queryFields, fieldCategory); return this.setHasChanged(); } - public SObjectQueryBuilder addFieldSet(Schema.FieldSet fieldSet) { + public Query addFieldSet(Schema.FieldSet fieldSet) { return this.addFieldSet(fieldSet, null); } - public SObjectQueryBuilder addFieldSet(Schema.FieldSet fieldSet, Soql.FieldCategory fieldCategory) { + public Query addFieldSet(Schema.FieldSet fieldSet, Soql.FieldCategory fieldCategory) { List queryFields = new List(); for(Schema.FieldSetMember fieldSetMember : fieldSet.getFields()) { queryFields.add(new Soql.QueryField(this.sobjectType, fieldSetMember.getFieldPath())); @@ -81,11 +81,11 @@ public class SObjectQueryBuilder extends Soql { return this.addFields(queryFields, fieldCategory); } - public SObjectQueryBuilder addPolymorphicFields(Schema.SObjectField polymorphicRelationshipField) { + public Query addPolymorphicFields(Schema.SObjectField polymorphicRelationshipField) { return addPolymorphicFields(polymorphicRelationshipField, new Map>()); } - public SObjectQueryBuilder addPolymorphicFields(Schema.SObjectField polymorphicRelationshipField, Map> fieldsBySObjectType) { + public Query addPolymorphicFields(Schema.SObjectField polymorphicRelationshipField, Map> fieldsBySObjectType) { Map> queryFieldsBySObjectType = new Map>(); for(Schema.SObjectType sobjectType : fieldsBySObjectType.keySet()) { List queryFields = new List(); @@ -97,7 +97,7 @@ public class SObjectQueryBuilder extends Soql { return this.addPolymorphicFields(polymorphicRelationshipField, queryFieldsBySObjectType); } - public SObjectQueryBuilder addPolymorphicFields(Schema.SObjectField polymorphicRelationshipField, Map> queryFieldsBySObjectType) { + public Query addPolymorphicFields(Schema.SObjectField polymorphicRelationshipField, Map> queryFieldsBySObjectType) { String polymorphicFieldStatement = queryFieldsBySObjectType.isEmpty() ? '' : 'TYPEOF ' + polymorphicRelationshipField.getDescribe().getRelationshipName(); for(Schema.SObjectType sobjectType : queryFieldsBySObjectType.keySet()) { List fieldNames = new List(); @@ -128,25 +128,25 @@ public class SObjectQueryBuilder extends Soql { return this.setHasChanged(); } - public SObjectQueryBuilder includeLabels() { + public Query includeLabels() { this.includeLabels = true; return this.setHasChanged(); } - public SObjectQueryBuilder includeFormattedValues() { + public Query includeFormattedValues() { this.includeFormattedValues = true; return this.setHasChanged(); } - public SObjectQueryBuilder removeField(Schema.SObjectField field) { + public Query removeField(Schema.SObjectField field) { return this.removeFields(new List{field}); } - public SObjectQueryBuilder removeField(Soql.QueryField queryField) { + public Query removeField(Soql.QueryField queryField) { return this.removeFields(new List{queryField}); } - public SObjectQueryBuilder removeFields(Schema.FieldSet fieldSet) { + public Query removeFields(Schema.FieldSet fieldSet) { List queryFields = new List(); for(Schema.FieldSetMember fieldSetMember : fieldSet.getFields()) { queryFields.add(new Soql.QueryField(this.getSObjectType(), fieldSetMember.getFieldPath())); @@ -154,7 +154,7 @@ public class SObjectQueryBuilder extends Soql { return this.removeFields(queryFields); } - public SObjectQueryBuilder removeFields(List fields) { + public Query removeFields(List fields) { List queryFields = new List(); for(Schema.SObjectField field : fields) { queryFields.add(new Soql.QueryField(field)); @@ -162,116 +162,116 @@ public class SObjectQueryBuilder extends Soql { return this.removeFields(queryFields); } - public SObjectQueryBuilder removeFields(List queryFields) { + public Query removeFields(List queryFields) { super.doRemoveFields(queryFields); return this.setHasChanged(); } - public SObjectQueryBuilder includeRelatedRecords(Schema.SObjectField childToParentRelationshipField, SObjectQueryBuilder relatedSObjectQuery) { + public Query includeRelatedRecords(Schema.SObjectField childToParentRelationshipField, Query relatedSObjectQuery) { this.childRelationshipQueries.add(relatedSObjectQuery.getRelatedRecordsQuery(childToParentRelationshipField)); return this.setHasChanged(); } - public SObjectQueryBuilder usingScope(Scope scope) { + public Query usingScope(Scope scope) { super.doUsingScope(scope); return this.setHasChanged(); } - public SObjectQueryBuilder filterWhere(Schema.SObjectField field, Soql.Operator operator, Object value) { + public Query filterWhere(Schema.SObjectField field, Soql.Operator operator, Object value) { return this.filterWhere(new Soql.QueryField(field), operator, value); } - public SObjectQueryBuilder filterWhere(Soql.QueryField queryField, Soql.Operator operator, Object value) { + public Query filterWhere(Soql.QueryField queryField, Soql.Operator operator, Object value) { return this.filterWhere(new Soql.QueryFilter(queryField, operator, value)); } - public SObjectQueryBuilder filterWhere(Soql.QueryFilter filter) { + public Query filterWhere(Soql.QueryFilter filter) { return this.filterWhere(new List{filter}); } - public SObjectQueryBuilder filterWhere(List filters) { + public Query filterWhere(List filters) { super.doFilterWhere(filters); return this.setHasChanged(); } - public SObjectQueryBuilder orFilterWhere(List filters) { + public Query orFilterWhere(List filters) { super.doOrFilterWhere(filters); return this.setHasChanged(); } - //public SObjectQueryBuilder filterWhereInSubquery(Schema.SObjectType childSObjectType, Schema.SObjectField lookupFieldOnChildSObject) { + //public Query filterWhereInSubquery(Schema.SObjectType childSObjectType, Schema.SObjectField lookupFieldOnChildSObject) { //this.whereFilters.add('Id IN (SELECT ' + lookupFieldOnChildSObject + ' FROM ' + childSObjectType + ')'); //return this.setHasChanged(); //} // - //public SObjectQueryBuilder filterWhereInSubquery(SObjectQueryBuilder childSObjectQueryBuilder, Schema.SObjectField lookupFieldOnChildSObject) { - //String subqueryString = childSObjectQueryBuilder.getSubquery(lookupFieldOnChildSObject); + //public Query filterWhereInSubquery(Query childQuery, Schema.SObjectField lookupFieldOnChildSObject) { + //String subqueryString = childQuery.getSubquery(lookupFieldOnChildSObject); //this.whereFilters.add('Id IN ' + subqueryString); //return this.setHasChanged(); //} // - //public SObjectQueryBuilder filterWhereNotInSubquery(Schema.SObjectType childSObjectType, Schema.SObjectField lookupFieldOnChildSObject) { + //public Query filterWhereNotInSubquery(Schema.SObjectType childSObjectType, Schema.SObjectField lookupFieldOnChildSObject) { //this.whereFilters.add('Id NOT IN (SELECT ' + lookupFieldOnChildSObject + ' FROM ' + childSObjectType + ')'); //return this.setHasChanged(); //} // - //public SObjectQueryBuilder filterWhereNotInSubquery(SObjectQueryBuilder childSObjectQueryBuilder, Schema.SObjectField lookupFieldOnChildSObject) { - //String subqueryString = childSObjectQueryBuilder.getSubquery(lookupFieldOnChildSObject); + //public Query filterWhereNotInSubquery(Query childQuery, Schema.SObjectField lookupFieldOnChildSObject) { + //String subqueryString = childQuery.getSubquery(lookupFieldOnChildSObject); //this.whereFilters.add('Id NOT IN ' + subqueryString); //return this.setHasChanged(); //} - public SObjectQueryBuilder orderByField(Schema.SObjectField field) { + public Query orderByField(Schema.SObjectField field) { return this.orderByField(new Soql.QueryField(field)); } - public SObjectQueryBuilder orderByField(Soql.QueryField queryField) { + public Query orderByField(Soql.QueryField queryField) { return this.orderByField(queryField, null); } - public SObjectQueryBuilder orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder) { + public Query orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder) { return this.orderByField(field, sortOrder, null); } - public SObjectQueryBuilder orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder) { + public Query orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder) { return this.orderByField(queryField, sortOrder, null); } - public SObjectQueryBuilder orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { + public Query orderByField(Schema.SObjectField field, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { return this.orderByField(new Soql.QueryField(field), sortOrder, sortNullsFirst); } - public SObjectQueryBuilder orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { + public Query orderByField(Soql.QueryField queryField, Soql.SortOrder sortOrder, Boolean sortNullsFirst) { super.doOrderBy(queryField, sortOrder, sortNullsFirst); return this.setHasChanged(); } - public SObjectQueryBuilder limitTo(Integer numberOfRecords) { + public Query limitTo(Integer numberOfRecords) { super.doLimitTo(numberOfRecords); return this.setHasChanged(); } - public SObjectQueryBuilder offsetBy(Integer offset) { + public Query offsetBy(Integer offset) { super.doOffsetBy(offset); return this.setHasChanged(); } - public SObjectQueryBuilder forReference() { + public Query forReference() { this.forReference = true; return this.setHasChanged(); } - public SObjectQueryBuilder forUpdate() { + public Query forUpdate() { this.forUpdate = true; return this.setHasChanged(); } - public SObjectQueryBuilder forView() { + public Query forView() { this.forView = true; return this.setHasChanged(); } - public SObjectQueryBuilder cacheResults() { + public Query cacheResults() { super.doCacheResults(); return this; } @@ -373,7 +373,7 @@ public class SObjectQueryBuilder extends Soql { if(!String.isBlank(this.displayFieldApiName)) this.addField(fieldMap.get(this.displayFieldApiName)); } - private SObjectQueryBuilder setHasChanged() { + private Query setHasChanged() { this.hasChanged = true; return this; } diff --git a/src/classes/AggregateQueryBuilder.cls-meta.xml b/nebula-app-framework/main/query-and-search/classes/Query.cls-meta.xml similarity index 80% rename from src/classes/AggregateQueryBuilder.cls-meta.xml rename to nebula-app-framework/main/query-and-search/classes/Query.cls-meta.xml index 91b23b86..8e4d11f8 100644 --- a/src/classes/AggregateQueryBuilder.cls-meta.xml +++ b/nebula-app-framework/main/query-and-search/classes/Query.cls-meta.xml @@ -1,5 +1,5 @@ - 46.0 + 49.0 Active diff --git a/src/classes/SearchBuilder.cls b/nebula-app-framework/main/query-and-search/classes/RecordSearch.cls similarity index 74% rename from src/classes/SearchBuilder.cls rename to nebula-app-framework/main/query-and-search/classes/RecordSearch.cls index 646b3696..9b23b3d1 100644 --- a/src/classes/SearchBuilder.cls +++ b/nebula-app-framework/main/query-and-search/classes/RecordSearch.cls @@ -2,28 +2,28 @@ * This file is part of the Nebula Query & Search project, released under the MIT License. * * See LICENSE file or go to https://github.com/jongpie/NebulaQueryAndSearch for full license details. * ******************************************************************************************************/ -public class SearchBuilder extends Sosl { +public class RecordSearch extends Sosl { - public SearchBuilder(String searchTerm, SObjectQueryBuilder sobjectQuery) { + public RecordSearch(String searchTerm, Query sobjectQuery) { super(searchTerm, sobjectQuery); } - public SearchBuilder(String searchTerm, List sobjectQueries) { + public RecordSearch(String searchTerm, List sobjectQueries) { super(searchTerm, sobjectQueries); } - public SearchBuilder inSearchGroup(Sosl.SearchGroup searchGroup) { + public RecordSearch inSearchGroup(Sosl.SearchGroup searchGroup) { if(searchGroup == null) return this; this.searchGroup = searchGroup; return this.setHasChanged(); } - public SearchBuilder withDataCategory(Schema.DataCategory dataCategory, Sosl.DataCategoryLocation dataCategoryLocation, Schema.DataCategory childDataCategory) { + public RecordSearch withDataCategory(Schema.DataCategory dataCategory, Sosl.DataCategoryLocation dataCategoryLocation, Schema.DataCategory childDataCategory) { return this.withDataCategory(dataCategory, dataCategoryLocation, new List{childDataCategory}); } - public SearchBuilder withDataCategory(Schema.DataCategory dataCategory, Sosl.DataCategoryLocation dataCategoryLocation, List childDataCategories) { + public RecordSearch withDataCategory(Schema.DataCategory dataCategory, Sosl.DataCategoryLocation dataCategoryLocation, List childDataCategories) { List childDataCategoryApiNames = new List(); for(Schema.DataCategory childDataCategory : childDataCategories) { childDataCategoryApiNames.add(childDataCategory.getName()); @@ -32,27 +32,27 @@ public class SearchBuilder extends Sosl { return this.setHasChanged(); } - public SearchBuilder withHighlight() { + public RecordSearch withHighlight() { this.withClauses.add('HIGHLIGHT'); return this.setHasChanged(); } - public SearchBuilder withSnippet(Integer targetLength) { + public RecordSearch withSnippet(Integer targetLength) { this.withClauses.add('SNIPPET (target_length=' + targetLength + ')'); return this.setHasChanged(); } - public SearchBuilder withSpellCorrection() { + public RecordSearch withSpellCorrection() { this.withClauses.add('SPELL_CORRECTION = true'); return this.setHasChanged(); } - public SearchBuilder updateArticleReporting(Sosl.ArticleReporting articleReporting) { + public RecordSearch updateArticleReporting(Sosl.ArticleReporting articleReporting) { this.articleReporting = articleReporting; return this.setHasChanged(); } - public SearchBuilder cacheResults() { + public RecordSearch cacheResults() { this.cacheResults = true; return this.setHasChanged(); } @@ -86,7 +86,7 @@ public class SearchBuilder extends Sosl { return super.doGetResults(); } - private SearchBuilder setHasChanged() { + private RecordSearch setHasChanged() { this.hasChanged = true; return this; } diff --git a/src/classes/SObjectQueryBuilder_Tests.cls-meta.xml b/nebula-app-framework/main/query-and-search/classes/RecordSearch.cls-meta.xml similarity index 80% rename from src/classes/SObjectQueryBuilder_Tests.cls-meta.xml rename to nebula-app-framework/main/query-and-search/classes/RecordSearch.cls-meta.xml index 91b23b86..8e4d11f8 100644 --- a/src/classes/SObjectQueryBuilder_Tests.cls-meta.xml +++ b/nebula-app-framework/main/query-and-search/classes/RecordSearch.cls-meta.xml @@ -1,5 +1,5 @@ - 46.0 + 49.0 Active diff --git a/src/classes/Soql.cls b/nebula-app-framework/main/query-and-search/classes/Soql.cls similarity index 98% rename from src/classes/Soql.cls rename to nebula-app-framework/main/query-and-search/classes/Soql.cls index 93bbd90a..6d7b6efa 100644 --- a/src/classes/Soql.cls +++ b/nebula-app-framework/main/query-and-search/classes/Soql.cls @@ -411,9 +411,9 @@ public abstract class Soql implements Comparable { this.filterString = 'Id ' + Soql.getOperatorValue(this.operator) + ' (SELECT ' + lookupFieldOnChildSObject + ' FROM ' + childSObjectType + ')'; } - public QueryFilter(SObjectQueryBuilder childSObjectQueryBuilder, Boolean inOrNotIn, Schema.SObjectField lookupFieldOnChildSObject) { + public QueryFilter(Query childQuery, Boolean inOrNotIn, Schema.SObjectField lookupFieldOnChildSObject) { this.operator = inOrNotIn ? Soql.Operator.IS_IN : Soql.Operator.IS_NOT_IN; - this.filterString = 'Id ' + Soql.getOperatorValue(this.operator) + ' ' + childSObjectQueryBuilder.getSubquery(lookupFieldOnChildSObject); + this.filterString = 'Id ' + Soql.getOperatorValue(this.operator) + ' ' + childQuery.getSubquery(lookupFieldOnChildSObject); } public Integer compareTo(Object compareTo) { diff --git a/src/classes/Soql.cls-meta.xml b/nebula-app-framework/main/query-and-search/classes/Soql.cls-meta.xml similarity index 80% rename from src/classes/Soql.cls-meta.xml rename to nebula-app-framework/main/query-and-search/classes/Soql.cls-meta.xml index 91b23b86..8e4d11f8 100644 --- a/src/classes/Soql.cls-meta.xml +++ b/nebula-app-framework/main/query-and-search/classes/Soql.cls-meta.xml @@ -1,5 +1,5 @@ - 46.0 + 49.0 Active diff --git a/src/classes/Sosl.cls b/nebula-app-framework/main/query-and-search/classes/Sosl.cls similarity index 91% rename from src/classes/Sosl.cls rename to nebula-app-framework/main/query-and-search/classes/Sosl.cls index fb2eb2be..48bac0d6 100644 --- a/src/classes/Sosl.cls +++ b/nebula-app-framework/main/query-and-search/classes/Sosl.cls @@ -11,18 +11,18 @@ public abstract class Sosl { private static Map>> cachedSearchResultsByHashCode = new Map>>(); protected String searchQuery, searchTerm; - protected List sobjectQueries; + protected List sobjectQueries; protected Set sobjectTypes; protected Boolean cacheResults, hasChanged; protected Sosl.ArticleReporting articleReporting; protected List withClauses, withDataCategoryClauses; protected Sosl.SearchGroup searchGroup; - protected Sosl(String searchTerm, SObjectQueryBuilder sobjectQuery) { - this(searchTerm, new List{sobjectQuery}); + protected Sosl(String searchTerm, Query sobjectQuery) { + this(searchTerm, new List{sobjectQuery}); } - protected Sosl(String searchTerm, List sobjectQueries) { + protected Sosl(String searchTerm, List sobjectQueries) { this.searchTerm = String.escapeSingleQuotes(searchTerm); this.sobjectQueries = sobjectQueries; @@ -37,7 +37,7 @@ public abstract class Sosl { if(this.sobjectTypes != null) return this.sobjectTypes; this.sobjectTypes = new Set(); - for(SObjectQueryBuilder query : this.sobjectQueries) { + for(Query query : this.sobjectQueries) { this.sobjectTypes.add(query.getSObjectType()); } return this.sobjectTypes; @@ -69,7 +69,7 @@ public abstract class Sosl { List queryStrings = new List(); this.sobjectQueries.sort(); - for(SObjectQueryBuilder query : this.sobjectQueries) { + for(Query query : this.sobjectQueries) { queryStrings.add(query.getSearchQuery()); } return ' RETURNING ' + String.join(queryStrings, ', '); diff --git a/src/classes/Sosl.cls-meta.xml b/nebula-app-framework/main/query-and-search/classes/Sosl.cls-meta.xml similarity index 80% rename from src/classes/Sosl.cls-meta.xml rename to nebula-app-framework/main/query-and-search/classes/Sosl.cls-meta.xml index 91b23b86..8e4d11f8 100644 --- a/src/classes/Sosl.cls-meta.xml +++ b/nebula-app-framework/main/query-and-search/classes/Sosl.cls-meta.xml @@ -1,5 +1,5 @@ - 46.0 + 49.0 Active diff --git a/src/classes/AggregateQueryBuilder_Tests.cls b/nebula-app-framework/tests/query-and-search/classes/AggregateQuery_Tests.cls similarity index 75% rename from src/classes/AggregateQueryBuilder_Tests.cls rename to nebula-app-framework/tests/query-and-search/classes/AggregateQuery_Tests.cls index 02213137..2a90c6e0 100644 --- a/src/classes/AggregateQueryBuilder_Tests.cls +++ b/nebula-app-framework/tests/query-and-search/classes/AggregateQuery_Tests.cls @@ -3,16 +3,16 @@ * See LICENSE file or go to https://github.com/jongpie/NebulaQueryAndSearch for full license details. * ******************************************************************************************************/ @isTest -private class AggregateQueryBuilder_Tests { +private class AggregateQuery_Tests { @isTest static void it_should_be_usable_after_construction() { // Query builders should be usable as soon as it's constructed - it should be able to execute a query with some default values - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType); + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType); Test.startTest(); - AggregateResult result = (AggregateResult)aggregateQueryBuilder.getFirstResult(); + AggregateResult result = (AggregateResult)AggregateQuery.getFirstResult(); Test.stopTest(); } @@ -21,14 +21,14 @@ private class AggregateQueryBuilder_Tests { static void it_should_return_results_when_filtering() { String expectedQueryString = 'SELECT Type FROM Opportunity WHERE AccountId != null GROUP BY Type'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType) .groupByField(Schema.Opportunity.Type) .filterWhere(new Soql.QueryFilter(Schema.Opportunity.AccountId, Soql.Operator.NOT_EQUAL_TO, null)); Test.startTest(); - System.assertEquals(expectedQueryString, aggregateQueryBuilder.getQuery()); - List results = aggregateQueryBuilder.getResults(); + System.assertEquals(expectedQueryString, AggregateQuery.getQuery()); + List results = AggregateQuery.getResults(); Test.stopTest(); } @@ -37,7 +37,7 @@ private class AggregateQueryBuilder_Tests { static void it_should_return_results_when_filtering_with_an_or_statement() { String expectedQueryString = 'SELECT Type, COUNT(Id) COUNT__Id FROM Account WHERE (AccountNumber = null OR Type = null) AND ParentId != null GROUP BY Type'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Account.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Account.SObjectType) .groupByField(Schema.Account.Type) .filterWhere(new Soql.QueryFilter(Schema.Account.ParentId, Soql.Operator.NOT_EQUAL_TO, null)) .orFilterWhere(new List{ @@ -46,20 +46,20 @@ private class AggregateQueryBuilder_Tests { }) .addAggregate(Soql.Aggregate.COUNT, Schema.Account.Id); - System.assertEquals(expectedQueryString, aggregateQueryBuilder.getQuery()); - List results = aggregateQueryBuilder.getResults(); + System.assertEquals(expectedQueryString, AggregateQuery.getQuery()); + List results = AggregateQuery.getResults(); } @isTest static void it_should_cache_results() { - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType); - aggregateQueryBuilder.cacheResults(); + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType); + AggregateQuery.cacheResults(); Test.startTest(); System.assertEquals(0, Limits.getQueries()); for(Integer i = 0; i < 3; i++) { - aggregateQueryBuilder.getResults(); + AggregateQuery.getResults(); } System.assertEquals(1, Limits.getQueries()); @@ -71,7 +71,7 @@ private class AggregateQueryBuilder_Tests { static void it_should_group_by_cube() { String expectedQueryString = 'SELECT Type, StageName, SUM(Amount) SUM__Amount FROM Opportunity GROUP BY CUBE(Type, StageName)'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType) .groupByField(Schema.Opportunity.Type) .groupByField(Schema.Opportunity.StageName) .addAggregate(Soql.Aggregate.SUM, Schema.Opportunity.Amount) @@ -79,8 +79,8 @@ private class AggregateQueryBuilder_Tests { Test.startTest(); - System.assertEquals(expectedQueryString, aggregateQueryBuilder.getQuery()); - List results = aggregateQueryBuilder.getResults(); + System.assertEquals(expectedQueryString, AggregateQuery.getQuery()); + List results = AggregateQuery.getResults(); Test.stopTest(); } @@ -89,7 +89,7 @@ private class AggregateQueryBuilder_Tests { static void it_should_group_by_rollup() { String expectedQueryString = 'SELECT Type, StageName, SUM(Amount) SUM__Amount FROM Opportunity GROUP BY ROLLUP(Type, StageName)'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType) .groupByField(Schema.Opportunity.Type) .groupByField(Schema.Opportunity.StageName) .addAggregate(Soql.Aggregate.SUM, Schema.Opportunity.Amount) @@ -97,8 +97,8 @@ private class AggregateQueryBuilder_Tests { Test.startTest(); - System.assertEquals(expectedQueryString, aggregateQueryBuilder.getQuery()); - List results = aggregateQueryBuilder.getResults(); + System.assertEquals(expectedQueryString, AggregateQuery.getQuery()); + List results = AggregateQuery.getResults(); Test.stopTest(); } @@ -107,15 +107,15 @@ private class AggregateQueryBuilder_Tests { static void it_should_group_by_having_aggregate() { String expectedQueryString = 'SELECT Name, COUNT(Id) COUNT__Id FROM Account GROUP BY Name HAVING COUNT(Id) > 2'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Account.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Account.SObjectType) .groupByField(Account.Name) .addAggregate(Soql.Aggregate.COUNT, Account.Id) .havingAggregate(Soql.Aggregate.COUNT, Account.Id, Soql.Operator.GREATER_THAN, 2); Test.startTest(); - System.assertEquals(expectedQueryString, aggregateQueryBuilder.getQuery()); - List results = aggregateQueryBuilder.getResults(); + System.assertEquals(expectedQueryString, AggregateQuery.getQuery()); + List results = AggregateQuery.getResults(); Test.stopTest(); } @@ -124,14 +124,14 @@ private class AggregateQueryBuilder_Tests { static void it_should_group_by_a_date_function() { String expectedQueryString = 'SELECT CALENDAR_MONTH(CloseDate), COUNT(Id) COUNT__Id FROM Opportunity GROUP BY CALENDAR_MONTH(CloseDate)'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType) .groupByField(new Soql.QueryField(Soql.DateFunction.CALENDAR_MONTH, Schema.Opportunity.CloseDate)) .addAggregate(Soql.Aggregate.COUNT, Opportunity.Id); Test.startTest(); - System.assertEquals(expectedQueryString, aggregateQueryBuilder.getQuery()); - List results = aggregateQueryBuilder.getResults(); + System.assertEquals(expectedQueryString, AggregateQuery.getQuery()); + List results = AggregateQuery.getResults(); Test.stopTest(); } @@ -149,7 +149,7 @@ private class AggregateQueryBuilder_Tests { + ' LIMIT 100' + ' OFFSET 0'; - AggregateQueryBuilder aggregateQueryBuilder = new AggregateQueryBuilder(Schema.Opportunity.SObjectType) + AggregateQuery AggregateQuery = new AggregateQuery(Schema.Opportunity.SObjectType) .addAggregate(Soql.Aggregate.MAX, Schema.Opportunity.CreatedDate) .addAggregate(Soql.Aggregate.AVG, Schema.Opportunity.Amount) .addAggregate(Soql.Aggregate.COUNT_DISTINCT, Schema.Opportunity.OwnerId) @@ -180,7 +180,7 @@ private class AggregateQueryBuilder_Tests { Test.startTest(); - String returnedQueryString = aggregateQueryBuilder.getQuery(); + String returnedQueryString = AggregateQuery.getQuery(); Test.stopTest(); diff --git a/src/classes/AggregateQueryBuilder_Tests.cls-meta.xml b/nebula-app-framework/tests/query-and-search/classes/AggregateQuery_Tests.cls-meta.xml similarity index 80% rename from src/classes/AggregateQueryBuilder_Tests.cls-meta.xml rename to nebula-app-framework/tests/query-and-search/classes/AggregateQuery_Tests.cls-meta.xml index 91b23b86..8e4d11f8 100644 --- a/src/classes/AggregateQueryBuilder_Tests.cls-meta.xml +++ b/nebula-app-framework/tests/query-and-search/classes/AggregateQuery_Tests.cls-meta.xml @@ -1,5 +1,5 @@ - 46.0 + 49.0 Active diff --git a/src/classes/SObjectQueryBuilder_Tests.cls b/nebula-app-framework/tests/query-and-search/classes/Query_Tests.cls similarity index 89% rename from src/classes/SObjectQueryBuilder_Tests.cls rename to nebula-app-framework/tests/query-and-search/classes/Query_Tests.cls index 328a1ef5..636ca863 100644 --- a/src/classes/SObjectQueryBuilder_Tests.cls +++ b/nebula-app-framework/tests/query-and-search/classes/Query_Tests.cls @@ -3,13 +3,13 @@ * See LICENSE file or go to https://github.com/jongpie/NebulaQueryAndSearch for full license details. * ******************************************************************************************************/ @isTest -private class SObjectQueryBuilder_Tests { +private class Query_Tests { @isTest static void it_should_return_results_for_a_simple_query() { String expectedQueryString = 'SELECT Id, Name FROM Account'; - SObjectQueryBuilder simpleAccountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType); + Query simpleAccountQuery = new Query(Schema.Account.SObjectType); System.assertEquals(expectedQueryString, simpleAccountQuery.getQuery()); List accounts = simpleAccountQuery.getResults(); @@ -32,7 +32,7 @@ private class SObjectQueryBuilder_Tests { List fieldsToQuery = new List{Schema.User.IsActive, Schema.User.Alias}; - SObjectQueryBuilder userQuery = new SObjectQueryBuilder(Schema.User.SObjectType) + Query userQuery = new Query(Schema.User.SObjectType) .addFields(fieldsToQuery) .addField(Schema.User.ProfileId) .addField(Schema.User.Email, Soql.FieldCategory.UPDATEABLE) @@ -67,7 +67,7 @@ private class SObjectQueryBuilder_Tests { }; Soql.QueryField queryField = new Soql.QueryField(fieldChain); - SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType); + Query accountQuery = new Query(Schema.Account.SObjectType); accountQuery.addField(queryField); System.assertEquals(expectedQueryString, accountQuery.getQuery()); @@ -78,7 +78,7 @@ private class SObjectQueryBuilder_Tests { static void it_should_return_results_and_not_include_sobject_type_for_monomorphic_field() { String expectedQueryString = 'SELECT Id, Name, Owner.Name, OwnerId FROM Account'; - SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType) + Query accountQuery = new Query(Schema.Account.SObjectType) .addField(new Soql.QueryField(Schema.Account.OwnerId)); System.assertEquals(expectedQueryString, accountQuery.getQuery()); @@ -120,7 +120,7 @@ private class SObjectQueryBuilder_Tests { fieldsBySObjectType.put(Schema.Lead.SObjectType, leadFields ); // Query the task object - SObjectQueryBuilder taskQuery = new SObjectQueryBuilder(Schema.Task.SObjectType) + Query taskQuery = new Query(Schema.Task.SObjectType) .addPolymorphicFields(Schema.Task.WhoId, fieldsBySObjectType); Test.stopTest(); @@ -133,7 +133,7 @@ private class SObjectQueryBuilder_Tests { static void it_should_return_results_and_include_sobject_type_for_polymorphic_field() { String expectedQueryString = 'SELECT Id, Name, Owner.Name, Owner.Type, OwnerId FROM Lead'; - SObjectQueryBuilder leadQuery = new SObjectQueryBuilder(Schema.Lead.SObjectType) + Query leadQuery = new Query(Schema.Lead.SObjectType) .addField(new Soql.QueryField(Schema.Lead.OwnerId)); System.assertEquals(expectedQueryString, leadQuery.getQuery()); @@ -144,10 +144,10 @@ private class SObjectQueryBuilder_Tests { static void it_should_return_results_and_include_related_records() { String expectedQueryString = 'SELECT Id, Name, Type, (SELECT Email, Id, Name FROM Contacts) FROM Account'; - SObjectQueryBuilder contactQuery = new SObjectQueryBuilder(Schema.Contact.SObjectType) + Query contactQuery = new Query(Schema.Contact.SObjectType) .addField(Schema.Contact.Email); - SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType) + Query accountQuery = new Query(Schema.Account.SObjectType) .includeRelatedRecords(Schema.Contact.AccountId, contactQuery) .addField(new Soql.QueryField(Schema.Account.Type)); @@ -159,7 +159,7 @@ private class SObjectQueryBuilder_Tests { static void it_should_return_results_when_filtering_with_an_or_statement() { String expectedQueryString = 'SELECT Id, Name FROM Account WHERE ParentId != null AND (AccountNumber = null OR Type = null)'; - SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType) + Query accountQuery = new Query(Schema.Account.SObjectType) .addField(Schema.Account.AnnualRevenue) .orFilterWhere(new List{ new Soql.QueryFilter(Schema.Account.Type, Soql.Operator.EQUALS, null), @@ -175,7 +175,7 @@ private class SObjectQueryBuilder_Tests { if(!UserInfo.isMultiCurrencyOrganization()) return; // If multi-currency is enabled, then execute the test - SObjectQueryBuilder accountQuery = new SObjectQueryBuilder(Schema.Account.SObjectType) + Query accountQuery = new Query(Schema.Account.SObjectType) .addField(Schema.Account.AnnualRevenue) .filterWhere(Schema.Account.AnnualRevenue, Soql.Operator.LESS_THAN, new Soql.IsoCurrency('USD', 100)); List accounts = accountQuery.getResults(); @@ -184,7 +184,7 @@ private class SObjectQueryBuilder_Tests { @isTest static void it_should_cache_query_results_when_enabled() { Integer loops = 4; - SObjectQueryBuilder userQuery = new SObjectQueryBuilder(Schema.User.SObjectType).limitTo(1); + Query userQuery = new Query(Schema.User.SObjectType).limitTo(1); // First, verify that caching is not enabled by default System.assertEquals(0, Limits.getQueries()); diff --git a/nebula-app-framework/tests/query-and-search/classes/Query_Tests.cls-meta.xml b/nebula-app-framework/tests/query-and-search/classes/Query_Tests.cls-meta.xml new file mode 100644 index 00000000..8e4d11f8 --- /dev/null +++ b/nebula-app-framework/tests/query-and-search/classes/Query_Tests.cls-meta.xml @@ -0,0 +1,5 @@ + + + 49.0 + Active + diff --git a/src/classes/SearchBuilder_Tests.cls b/nebula-app-framework/tests/query-and-search/classes/RecordSearch_Tests.cls similarity index 77% rename from src/classes/SearchBuilder_Tests.cls rename to nebula-app-framework/tests/query-and-search/classes/RecordSearch_Tests.cls index 47498de5..01671b6d 100644 --- a/src/classes/SearchBuilder_Tests.cls +++ b/nebula-app-framework/tests/query-and-search/classes/RecordSearch_Tests.cls @@ -3,14 +3,14 @@ * See LICENSE file or go to https://github.com/jongpie/NebulaQueryAndSearch for full license details. * ******************************************************************************************************/ @isTest -private class SearchBuilder_Tests { +private class RecordSearch_Tests { @isTest static void it_should_return_first_result_for_a_single_sobject_type() { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name)'; - SObjectQueryBuilder userQuery = new SObjectQueryBuilder(Schema.User.SObjectType); - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), userQuery); + Query userQuery = new Query(Schema.User.SObjectType); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), userQuery); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); User userSearchResult = (User)userSearch.getFirstResult(); @@ -20,8 +20,8 @@ private class SearchBuilder_Tests { static void it_should_return_results_for_a_single_sobject_type() { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name)'; - SObjectQueryBuilder userQuery = new SObjectQueryBuilder(Schema.User.SObjectType); - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), userQuery); + Query userQuery = new Query(Schema.User.SObjectType); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), userQuery); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); List userSearchResults = userSearch.getFirstResults(); @@ -31,11 +31,11 @@ private class SearchBuilder_Tests { static void it_should_return_results_for_multiple_sobject_types() { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING Account(Id, Name), User(Id, Name)'; - List queries = new List{ - new SObjectQueryBuilder(Schema.User.SObjectType), - new SObjectQueryBuilder(Schema.Account.SObjectType) + List queries = new List{ + new Query(Schema.User.SObjectType), + new Query(Schema.Account.SObjectType) }; - SearchBuilder search = new SearchBuilder(UserInfo.getUserEmail(), queries); + RecordSearch search = new RecordSearch(UserInfo.getUserEmail(), queries); System.assertEquals(expectedSearchQueryString, search.getSearch()); List> searchResults = search.getResults(); @@ -45,7 +45,7 @@ private class SearchBuilder_Tests { static void it_should_return_results_with_highlight_enabled() { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name) WITH HIGHLIGHT'; - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), new SObjectQueryBuilder(Schema.User.SObjectType)); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), new Query(Schema.User.SObjectType)); userSearch.withHighlight(); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); @@ -58,7 +58,7 @@ private class SearchBuilder_Tests { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name)' + ' WITH SNIPPET (target_length=' + snippetTargetLength + ')'; - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), new SObjectQueryBuilder(Schema.User.SObjectType)); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), new Query(Schema.User.SObjectType)); userSearch.withSnippet(snippetTargetLength); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); @@ -70,7 +70,7 @@ private class SearchBuilder_Tests { Integer snippetTargetLength = 10; String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN EMAIL FIELDS RETURNING User(Id, Name)'; - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), new SObjectQueryBuilder(Schema.User.SObjectType)); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), new Query(Schema.User.SObjectType)); userSearch.inSearchGroup(Sosl.SearchGroup.EMAIL_FIELDS); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); @@ -82,7 +82,7 @@ private class SearchBuilder_Tests { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name)' + ' WITH SPELL_CORRECTION = true'; - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), new SObjectQueryBuilder(Schema.User.SObjectType)); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), new Query(Schema.User.SObjectType)); userSearch.withSpellCorrection(); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); @@ -98,7 +98,7 @@ private class SearchBuilder_Tests { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name)' + ' UPDATE TRACKING'; - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), new SObjectQueryBuilder(Schema.User.SObjectType)); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), new Query(Schema.User.SObjectType)); userSearch.updateArticleReporting(Sosl.ArticleReporting.TRACKING); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); @@ -114,7 +114,7 @@ private class SearchBuilder_Tests { String expectedSearchQueryString = 'FIND \'' + UserInfo.getUserEmail() + '\' IN ALL FIELDS RETURNING User(Id, Name)' + ' UPDATE VIEWSTAT'; - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), new SObjectQueryBuilder(Schema.User.SObjectType)); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), new Query(Schema.User.SObjectType)); userSearch.updateArticleReporting(Sosl.ArticleReporting.VIEWSTAT); System.assertEquals(expectedSearchQueryString, userSearch.getSearch()); @@ -124,8 +124,8 @@ private class SearchBuilder_Tests { @isTest static void it_should_cache_search_results_when_enabled() { Integer loops = 4; - SObjectQueryBuilder userQuery = new SObjectQueryBuilder(Schema.User.SObjectType); - SearchBuilder userSearch = new SearchBuilder(UserInfo.getUserEmail(), userQuery); + Query userQuery = new Query(Schema.User.SObjectType); + RecordSearch userSearch = new RecordSearch(UserInfo.getUserEmail(), userQuery); // First, verify that caching is not enabled by default System.assertEquals(0, Limits.getSoslQueries()); diff --git a/nebula-app-framework/tests/query-and-search/classes/RecordSearch_Tests.cls-meta.xml b/nebula-app-framework/tests/query-and-search/classes/RecordSearch_Tests.cls-meta.xml new file mode 100644 index 00000000..8e4d11f8 --- /dev/null +++ b/nebula-app-framework/tests/query-and-search/classes/RecordSearch_Tests.cls-meta.xml @@ -0,0 +1,5 @@ + + + 49.0 + Active + diff --git a/sfdx-project.json b/sfdx-project.json new file mode 100644 index 00000000..30cc68b0 --- /dev/null +++ b/sfdx-project.json @@ -0,0 +1,11 @@ +{ + "packageDirectories": [ + { + "path": "nebula-app-framework", + "default": true + } + ], + "namespace": "Nebula", + "sfdcLoginUrl": "https://nebulaframework-dev.my.salesforce.com", + "sourceApiVersion": "49.0" +} \ No newline at end of file diff --git a/src/classes/SearchBuilder.cls-meta.xml b/src/classes/SearchBuilder.cls-meta.xml deleted file mode 100644 index 91b23b86..00000000 --- a/src/classes/SearchBuilder.cls-meta.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - 46.0 - Active - diff --git a/src/classes/SearchBuilder_Tests.cls-meta.xml b/src/classes/SearchBuilder_Tests.cls-meta.xml deleted file mode 100644 index 91b23b86..00000000 --- a/src/classes/SearchBuilder_Tests.cls-meta.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - 46.0 - Active - diff --git a/src/package.xml b/src/package.xml deleted file mode 100644 index 1ec2ef4b..00000000 --- a/src/package.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - NebulaQueryAndSearch - - AggregateQueryBuilder - AggregateQueryBuilder_Tests - SObjectQueryBuilder - SObjectQueryBuilder_Tests - SearchBuilder - SearchBuilder_Tests - Soql - Sosl - ApexClass - - 46.0 -