Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions force-app/main/default/classes/SOQL.cls
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ public virtual inherited sharing class SOQL implements Queryable {
Map<String, List<SObject>> toAggregatedMap(SObjectField keyField);
Map<String, List<String>> toAggregatedMap(SObjectField keyField, SObjectField valueField);
Database.QueryLocator toQueryLocator();
Database.Cursor toCursor();
}

public interface SubQuery {
Expand Down Expand Up @@ -852,6 +853,10 @@ public virtual inherited sharing class SOQL implements Queryable {
return executor.toQueryLocator();
}

public Database.Cursor toCursor() {
return executor.toCursor();
}

public SOQL byId(SObject record) {
return byId(record.Id);
}
Expand Down Expand Up @@ -2272,12 +2277,17 @@ public virtual inherited sharing class SOQL implements Queryable {
public Database.QueryLocator toQueryLocator() {
return sharingExecutor.toQueryLocator(builder.toString(), binder.getBindingMap(), accessMode);
}

public Database.Cursor toCursor() {
return sharingExecutor.toCursor(builder.toString(), binder.getBindingMap(), accessMode);
}
}

private interface DatabaseQuery {
List<SObject> toSObjects(String query, Map<String, Object> binding, AccessLevel accessLevel);
Integer toInteger(String query, Map<String, Object> binding, AccessLevel accessLevel);
Database.QueryLocator toQueryLocator(String query, Map<String, Object> binding, AccessLevel accessLevel);
Database.Cursor toCursor(String query, Map<String, Object> binding, AccessLevel accessLevel);
}

private inherited sharing class InheritedSharing implements DatabaseQuery {
Expand All @@ -2292,6 +2302,10 @@ public virtual inherited sharing class SOQL implements Queryable {
public Database.QueryLocator toQueryLocator(String query, Map<String, Object> binding, AccessLevel accessLevel) {
return Database.getQueryLocatorWithBinds(query, binding, accessLevel);
}

public Database.Cursor toCursor(String query, Map<String, Object> binding, AccessLevel accessLevel) {
return Database.getCursorWithBinds(query, binding, accessLevel);
}
}

private without sharing class WithoutSharing implements DatabaseQuery {
Expand All @@ -2306,6 +2320,10 @@ public virtual inherited sharing class SOQL implements Queryable {
public Database.QueryLocator toQueryLocator(String query, Map<String, Object> binding, AccessLevel accessLevel) {
return Database.getQueryLocatorWithBinds(query, binding, accessLevel);
}

public Database.Cursor toCursor(String query, Map<String, Object> binding, AccessLevel accessLevel) {
return Database.getCursorWithBinds(query, binding, accessLevel);
}
}

private with sharing class WithSharing implements DatabaseQuery {
Expand All @@ -2320,5 +2338,9 @@ public virtual inherited sharing class SOQL implements Queryable {
public Database.QueryLocator toQueryLocator(String query, Map<String, Object> binding, AccessLevel accessLevel) {
return Database.getQueryLocatorWithBinds(query, binding, accessLevel);
}

public Database.Cursor toCursor(String query, Map<String, Object> binding, AccessLevel accessLevel) {
return Database.getCursorWithBinds(query, binding, accessLevel);
}
}
}
45 changes: 45 additions & 0 deletions force-app/main/default/classes/SOQL_Test.cls
Original file line number Diff line number Diff line change
Expand Up @@ -3335,6 +3335,51 @@ private class SOQL_Test {
}
}

@IsTest
static void toCursor() {
// Setup
insertAccounts();

// Test
Database.Cursor queryCursor = SOQL.of(Account.SObjectType)
.with(Account.Id)
.with(Account.Name)
.toCursor();

// Verify
Assert.areEqual(2, queryCursor.getNumRecords());
}

@IsTest
static void toCursorWithSharing() {
// Setup
insertTasks();

System.runAs(minimumAccessUser()) {
insert new Task(Subject = 'Test', Type = 'Other');

// Test
Database.Cursor queryCursor = SOQL.of(Task.SObjectType).systemMode().withSharing().toCursor();

// Verify
Assert.areEqual(1, queryCursor.getNumRecords());
}
}

@IsTest
static void toCursorWithoutSharing() {
// Setup
insertTasks();

System.runAs(minimumAccessUser()) {
// Test
Database.Cursor queryCursor = SOQL.of(Task.SObjectType).systemMode().withoutSharing().toCursor();

// Verify
Assert.areEqual(2, queryCursor.getNumRecords());
}
}

static List<Account> insertAccounts() {
List<Account> accounts = new List<Account>{
new Account(Name = 'Test 1'),
Expand Down
Loading