Skip to content
This repository has been archived by the owner on May 2, 2023. It is now read-only.

Commit

Permalink
Use new method for handling large saved searches
Browse files Browse the repository at this point in the history
The method we have used up til now is deficient when handling a large
saved search containing a large number of rows with the same internal ID
(!). The new method needs testing before it's used everywhere.
  • Loading branch information
fastjames committed Jun 16, 2015
1 parent 8534dab commit b66bc33
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 36 deletions.
5 changes: 2 additions & 3 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ gem 'json'
# Add dependencies to develop your gem here.
# Include everything needed to run rake, tests, features, etc.
group :development do
gem "rspec", "~> 2.3.0"
gem "bundler", "~> 1.0.0"
gem "rspec", "~> 2.4"
gem "bundler", ">= 1.0.0"
gem "jeweler", "~> 1.8.3"
gem "rcov", ">= 0"
end
24 changes: 11 additions & 13 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
GEM
remote: http://rubygems.org/
specs:
diff-lcs (1.1.3)
diff-lcs (1.2.5)
git (1.2.5)
jeweler (1.8.3)
bundler (~> 1.0)
Expand All @@ -11,27 +11,25 @@ GEM
json (1.6.3)
mime-types (1.17.2)
rake (0.9.2.2)
rcov (0.9.11)
rdoc (3.12)
json (~> 1.4)
rest-client (1.6.7)
mime-types (>= 1.16)
rspec (2.3.0)
rspec-core (~> 2.3.0)
rspec-expectations (~> 2.3.0)
rspec-mocks (~> 2.3.0)
rspec-core (2.3.1)
rspec-expectations (2.3.0)
diff-lcs (~> 1.1.2)
rspec-mocks (2.3.0)
rspec (2.14.1)
rspec-core (~> 2.14.0)
rspec-expectations (~> 2.14.0)
rspec-mocks (~> 2.14.0)
rspec-core (2.14.8)
rspec-expectations (2.14.5)
diff-lcs (>= 1.1.3, < 2.0)
rspec-mocks (2.14.6)

PLATFORMS
ruby

DEPENDENCIES
bundler (~> 1.0.0)
bundler (>= 1.0.0)
jeweler (~> 1.8.3)
json
rcov
rest-client
rspec (~> 2.3.0)
rspec (~> 2.4)
14 changes: 14 additions & 0 deletions lib/netsuite-rest-client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,20 @@ def get_saved_search(record_type, search_id, options={})
results
end

def get_large_saved_search(record_type, search_id, options={})
results = Array.new
params = { 'script' => @script_id,
'deploy' => @deploy_id,
'operation' => 'LSAVED',
'record_type' => record_type,
'search_id' => search_id }

results_segment = *parse_json_result_from_rest(:get, params)
results_segment.class == Array ? results += results_segment : raise("Search error: #{results_segment}")

results
end

def parse_json_result_from_rest(method, params, options={})
rest_params = { :method => method,
:url => create_url(params),
Expand Down
34 changes: 34 additions & 0 deletions lib/restlets/rest.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ var OPERATIONS = { 'CREATE': { 'function': 'initializeRecord',
'SAVED': { 'function': 'getSavedSearch',
'access': 'GET',
'baseGovernance': 10 },
'LSAVED': { 'function': 'getLargeSavedSearch',
'access': 'GET',
'baseGovernance': 10 },
'SEARCH': { 'function': 'searchRecords',
'access': 'POST',
'baseGovernance': 10 },
Expand Down Expand Up @@ -391,6 +394,37 @@ function getSavedSearch(request) {
return([accumulatedResults, lowerBound]);
}

function getLargeSavedSearch(request) {
/*
* Description: Retrieves results from a given saved search of the defined batch size rounded up to the next
* one thousand records
* Params:
* request.search_id: Id of the saved search to run
* request.record_type: String of the record type to fetch
*
* Return: List of result rows with internal ids from the given start_id up through a count of the given
* batch size or next highest multiple of one thousand from the given batch size if the given size
* is not a multiple of one thousand
*/
var searchId = request.search_id;
var recordType = request.record_type;
var accumulatedResults = [];

var savedSearch = nlapiLoadSearch(recordType, searchId);
var resultSet = savedSearch.runSearch();
var searchIndex = 0;

do {
var resultSlice = resultSet.getResults(searchIndex, searchIndex+1000);
for (var rs in resultSlice) {
accumulatedResults.push(resultSlice[rs]);
searchIndex++;
}
} while(resultSlice.length >= 1000);

return(accumulatedResults);
}

/*
* Handler Functions
*/
Expand Down
17 changes: 7 additions & 10 deletions netsuite-rest-client.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

Gem::Specification.new do |s|
s.name = "netsuite-rest-client"
s.version = "1.0.1"
s.version = "1.0.2"

s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Jim Kane"]
Expand Down Expand Up @@ -43,25 +43,22 @@ Gem::Specification.new do |s|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rest-client>, [">= 0"])
s.add_runtime_dependency(%q<json>, [">= 0"])
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
s.add_development_dependency(%q<rspec>, ["~> 2.4"])
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
s.add_development_dependency(%q<rcov>, [">= 0"])
else
s.add_dependency(%q<rest-client>, [">= 0"])
s.add_dependency(%q<json>, [">= 0"])
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
s.add_dependency(%q<rspec>, ["~> 2.4"])
s.add_dependency(%q<bundler>, [">= 1.0.0"])
s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
s.add_dependency(%q<rcov>, [">= 0"])
end
else
s.add_dependency(%q<rest-client>, [">= 0"])
s.add_dependency(%q<json>, [">= 0"])
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
s.add_dependency(%q<rspec>, ["~> 2.4"])
s.add_dependency(%q<bundler>, [">= 1.0.0"])
s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
s.add_dependency(%q<rcov>, [">= 0"])
end
end

38 changes: 28 additions & 10 deletions spec/netsuite-rest-client_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')

describe "NetsuiteRestClient" do
it "should get a saved search" do
nsc = Netsuite::Client.new(ENV['NETSUITE_ACCOUNT_ID'],
ENV['NETSUITE_LOGIN'],
ENV['NETSUITE_PASSWORD'],
ENV['NETSUITE_ROLE_ID'])
res = nsc.get_saved_search('InventoryItem', '678')
res.should_not be_empty
res.should be_kind_of(Array)
res.first.should be_kind_of(Hash)
puts "returned result of #{res.count} rows"

describe '#get_saved_search' do
it "should get a saved search" do
nsc = Netsuite::Client.new(ENV['NETSUITE_ACCOUNT_ID'],
ENV['NETSUITE_LOGIN'],
ENV['NETSUITE_PASSWORD'],
ENV['NETSUITE_ROLE_ID'])
res = nsc.get_saved_search('InventoryItem', '678')
res.should_not be_empty
res.should be_kind_of(Array)
res.first.should be_kind_of(Hash)
puts "returned result of #{res.count} rows"
end
end

describe '#get_large_saved_search' do
it "should get a saved search" do
nsc = Netsuite::Client.new(ENV['NETSUITE_ACCOUNT_ID'],
ENV['NETSUITE_LOGIN'],
ENV['NETSUITE_PASSWORD'],
ENV['NETSUITE_ROLE_ID'])
res = nsc.get_large_saved_search('InventoryItem', '678')
res.should_not be_empty
res.should be_kind_of(Array)
res.first.should be_kind_of(Hash)
puts "returned result of #{res.count} rows"
end
end

end

0 comments on commit b66bc33

Please sign in to comment.