diff --git a/Gemfile b/Gemfile index 13ca981..0e1ef9c 100644 --- a/Gemfile +++ b/Gemfile @@ -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 diff --git a/Gemfile.lock b/Gemfile.lock index 8ac5123..3738bb0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) @@ -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) diff --git a/lib/netsuite-rest-client.rb b/lib/netsuite-rest-client.rb index c7b39e8..8715aae 100644 --- a/lib/netsuite-rest-client.rb +++ b/lib/netsuite-rest-client.rb @@ -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), diff --git a/lib/restlets/rest.js b/lib/restlets/rest.js index ffa8c25..9377ef2 100644 --- a/lib/restlets/rest.js +++ b/lib/restlets/rest.js @@ -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 }, @@ -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 */ diff --git a/netsuite-rest-client.gemspec b/netsuite-rest-client.gemspec index f0a3009..8b85364 100644 --- a/netsuite-rest-client.gemspec +++ b/netsuite-rest-client.gemspec @@ -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"] @@ -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, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, ["~> 2.3.0"]) - s.add_development_dependency(%q, ["~> 1.0.0"]) + s.add_development_dependency(%q, ["~> 2.4"]) + s.add_development_dependency(%q, [">= 1.0.0"]) s.add_development_dependency(%q, ["~> 1.8.3"]) - s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, ["~> 2.3.0"]) - s.add_dependency(%q, ["~> 1.0.0"]) + s.add_dependency(%q, ["~> 2.4"]) + s.add_dependency(%q, [">= 1.0.0"]) s.add_dependency(%q, ["~> 1.8.3"]) - s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, ["~> 2.3.0"]) - s.add_dependency(%q, ["~> 1.0.0"]) + s.add_dependency(%q, ["~> 2.4"]) + s.add_dependency(%q, [">= 1.0.0"]) s.add_dependency(%q, ["~> 1.8.3"]) - s.add_dependency(%q, [">= 0"]) end end diff --git a/spec/netsuite-rest-client_spec.rb b/spec/netsuite-rest-client_spec.rb index 4817f9e..326a95a 100644 --- a/spec/netsuite-rest-client_spec.rb +++ b/spec/netsuite-rest-client_spec.rb @@ -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