PageRenderTime 21ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 1ms

/node_modules/rethinkdbdash/test/transform-stream.js

https://gitlab.com/Sxw1212/questions
JavaScript | 279 lines | 254 code | 22 blank | 3 comment | 30 complexity | ad3fbf39be8fec4236b8f48a332be5bc MD5 | raw file
  1. var config = require('./config.js');
  2. var r = require('../lib')(config);
  3. var util = require(__dirname+'/util/common.js');
  4. var assert = require('assert');
  5. var Readable = require('stream').Readable;
  6. var Stream = require('stream')
  7. var _util = require('util');
  8. var devnull = require('dev-null');
  9. var uuid = util.uuid;
  10. var It = util.It
  11. var dbName, tableName, tableName2, stream, result, pks, feed;
  12. var numDocs = 100; // Number of documents in the "big table" used to test the SUCCESS_PARTIAL
  13. It('Init for `transform-stream.js`', function* (done) {
  14. try {
  15. dbName = uuid();
  16. tableName = uuid(); // Big table to test partial sequence
  17. dumpTable = uuid(); // dump table
  18. result = yield r.dbCreate(dbName).run()
  19. assert.equal(result.dbs_created, 1);
  20. //yield r.db(dbName).wait().run()
  21. result = yield [
  22. r.db(dbName).tableCreate(tableName)('tables_created').run(),
  23. r.db(dbName).tableCreate(dumpTable)('tables_created').run()]
  24. assert.deepEqual(result, [1, 1]);
  25. done();
  26. }
  27. catch(e) {
  28. console.log(e);
  29. done(e);
  30. }
  31. })
  32. It('Inserting batch - table 1', function* (done) {
  33. try {
  34. result = yield r.db(dbName).table(tableName).insert(eval('['+new Array(numDocs).join('{}, ')+'{}]')).run();
  35. assert.equal(result.inserted, numDocs);
  36. done();
  37. }
  38. catch(e) {
  39. done(e);
  40. }
  41. })
  42. It('test pipe transform - fast input', function* (done) {
  43. var stream = new Readable({objectMode: true});
  44. var size = 35;
  45. var value = uuid();
  46. for(var i=0; i<size; i++) {
  47. stream.push({field: value});
  48. }
  49. stream.push(null);
  50. var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 10});
  51. stream.pipe(table)
  52. .on('error', done)
  53. .on('end', function() {
  54. r.db(dbName).table(dumpTable).filter({field: stream._value}).count().run().then(function(result) {
  55. assert.deepEqual(result, size);
  56. assert.deepEqual(table._sequence, [10, 10, 10, 5])
  57. done();
  58. });
  59. }).pipe(devnull({objectMode: true}));
  60. })
  61. It('test pipe transform - slow input - 1', function* (done) {
  62. var stream = new Readable({objectMode: true});
  63. var size = 10;
  64. var values = [uuid(), uuid()];
  65. var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 5});
  66. var i = 0;
  67. stream._read = function() {
  68. var self = this;
  69. i++;
  70. if (i <= 3) {
  71. self.push({field: values[0]});
  72. }
  73. else if (i === 4) {
  74. setTimeout(function() {
  75. self.push({field: values[1]});
  76. }, 3000)
  77. }
  78. else if (i <= 10) {
  79. self.push({field: values[1]});
  80. }
  81. else {
  82. self.push(null);
  83. }
  84. }
  85. stream.pipe(table)
  86. .on('error', done)
  87. .on('end', function() {
  88. r.expr([
  89. r.db(dbName).table(dumpTable).filter({field: values[0]}).count(),
  90. r.db(dbName).table(dumpTable).filter({field: values[1]}).count()
  91. ]).run().then(function(result) {
  92. assert.deepEqual(result, [3, 7]);
  93. assert.deepEqual(table._sequence, [3, 5, 2])
  94. done();
  95. });
  96. }).pipe(devnull({objectMode: true}));
  97. })
  98. It('test pipe transform - slow input - 2', function* (done) {
  99. var stream = new Readable({objectMode: true});
  100. var size = 10;
  101. var values = [uuid(), uuid()];
  102. var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 5});
  103. var i = 0;
  104. stream._read = function() {
  105. var self = this;
  106. i++;
  107. if (i <= 5) {
  108. self.push({field: values[0]});
  109. }
  110. else if (i === 6) {
  111. setTimeout(function() {
  112. self.push({field: values[1]});
  113. }, 3000)
  114. }
  115. else if (i <= 10) {
  116. self.push({field: values[1]});
  117. }
  118. else {
  119. self.push(null);
  120. }
  121. }
  122. stream.pipe(table)
  123. .on('error', done)
  124. .on('end', function() {
  125. r.expr([
  126. r.db(dbName).table(dumpTable).filter({field: values[0]}).count(),
  127. r.db(dbName).table(dumpTable).filter({field: values[1]}).count()
  128. ]).run().then(function(result) {
  129. assert.deepEqual(result, [5, 5]);
  130. assert.deepEqual(table._sequence, [5, 5])
  131. done();
  132. });
  133. }).pipe(devnull({objectMode: true}));
  134. })
  135. It('test pipe transform - single insert', function* (done) {
  136. // Create a transform stream that will convert data to a string
  137. //var stream = new Input();
  138. var stream = new Readable({objectMode: true});
  139. var size = 10;
  140. var value = uuid();
  141. var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 5});
  142. var i = 0;
  143. stream._read = function() {
  144. i++;
  145. if (i > 10) {
  146. this.push(null);
  147. }
  148. else {
  149. var self = this;
  150. setTimeout(function() {
  151. self.push({field: value});
  152. }, 100); // suppose that each insert take less than 100 ms
  153. }
  154. }
  155. stream.pipe(table)
  156. .on('error', done)
  157. .on('end', function() {
  158. r.expr(r.db(dbName).table(dumpTable).filter({field: value}).count()).run().then(function(result) {
  159. assert.deepEqual(result, 10);
  160. assert.deepEqual(table._sequence, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
  161. done();
  162. });
  163. }).pipe(devnull({objectMode: true}));
  164. })
  165. It('test transform output - object', function* (done) {
  166. var stream = new Readable({objectMode: true});
  167. var i = 0;
  168. var values = [uuid(), uuid()];
  169. stream._read = function() {
  170. var self = this;
  171. i++;
  172. if (i <= 3) {
  173. self.push({field: values[0]});
  174. }
  175. else if (i === 4) {
  176. setTimeout(function() {
  177. self.push({field: values[1]});
  178. }, 300)
  179. }
  180. else if (i <= 10) {
  181. self.push({field: values[1]});
  182. }
  183. else {
  184. self.push(null);
  185. }
  186. }
  187. var table = r.db(dbName).table(dumpTable).toStream({
  188. transform: true
  189. });
  190. var result = [];
  191. var endStream = new Stream.Transform();
  192. endStream._writableState.objectMode = true;
  193. endStream._readableState.objectMode = true;
  194. endStream._transform = function (data, encoding, done) {
  195. result.push(data);
  196. this.push(data);
  197. done();
  198. }
  199. stream.pipe(table)
  200. .on('error', done)
  201. .pipe(endStream)
  202. .on('error', done)
  203. .on('finish', function() {
  204. assert(result.length, 10);
  205. for(var i=0; i<result.length; i++) {
  206. assert(Object.prototype.toString.call(result[i]), '[object Object]');
  207. }
  208. done();
  209. });
  210. })
  211. It('test transform output - string', function* (done) {
  212. var stream = new Readable({objectMode: true});
  213. var i = 0;
  214. var values = [uuid(), uuid()];
  215. stream._read = function() {
  216. var self = this;
  217. i++;
  218. if (i <= 3) {
  219. self.push({field: values[0]});
  220. }
  221. else if (i === 4) {
  222. setTimeout(function() {
  223. self.push({field: values[1]});
  224. }, 300)
  225. }
  226. else if (i <= 10) {
  227. self.push({field: values[1]});
  228. }
  229. else {
  230. self.push(null);
  231. }
  232. }
  233. var table = r.db(dbName).table(dumpTable).toStream({
  234. transform: true,
  235. format: 'primaryKey'
  236. });
  237. var result = [];
  238. var endStream = new Stream.Transform();
  239. endStream._writableState.objectMode = true;
  240. endStream._readableState.objectMode = true;
  241. endStream._transform = function (data, encoding, done) {
  242. result.push(data);
  243. this.push(data);
  244. done();
  245. }
  246. stream.pipe(table)
  247. .on('error', done)
  248. .pipe(endStream)
  249. .on('error', done)
  250. .on('finish', function() {
  251. assert(result.length, 10);
  252. for(var i=0; i<result.length; i++) {
  253. assert(typeof result[i], 'string');
  254. }
  255. done();
  256. });
  257. })