From f617761b36daaf2876620121df446a4889217009 Mon Sep 17 00:00:00 2001 From: Alex K Date: Wed, 11 Jun 2025 23:16:22 +0200 Subject: [PATCH 1/2] Fix: function name mismatch in registerDataFrameIndexing --- src/methods/dataframe/indexing/register.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/methods/dataframe/indexing/register.js b/src/methods/dataframe/indexing/register.js index 3ffe90a..cbe6b72 100644 --- a/src/methods/dataframe/indexing/register.js +++ b/src/methods/dataframe/indexing/register.js @@ -13,7 +13,7 @@ import { register as registerSample } from './sample.js'; * Register all indexing methods on DataFrame prototype * @param {object} DataFrame - DataFrame constructor */ -export function register(DataFrame) { +export function registerDataFrameIndexing(DataFrame) { registerAt(DataFrame); registerHead(DataFrame); registerTail(DataFrame); From 02cabd4f9b39d09c53bfaddddce506f63886ca17 Mon Sep 17 00:00:00 2001 From: Alex K Date: Thu, 12 Jun 2025 00:54:52 +0200 Subject: [PATCH 2/2] fix: restore DataFrame indexing methods and tests - Created storageTestUtils.js for testing with different storage types - Fixed missing indexing methods (head, tail, iloc, loc, at, sample) - Created indexing/index.js to register all indexing methods - Updated DataFrame methods index.js to import indexing methods - Fixed filtering/index.js to only include actual filtering methods - Updated filtering/index.test.js to properly test filtering methods - All DataFrame method tests now pass successfully --- src/methods/dataframe/filtering/index.js | 8 +- src/methods/dataframe/index.js | 1 + src/methods/dataframe/indexing/index.js | 13 +++ .../methods/dataframe/filtering/index.test.js | 73 ++++++++------ test/methods/dataframe/indexing/at.test.js | 2 +- test/methods/dataframe/indexing/head.test.js | 2 +- test/methods/dataframe/indexing/iloc.test.js | 2 +- test/methods/dataframe/indexing/loc.test.js | 2 +- .../methods/dataframe/indexing/sample.test.js | 2 +- test/methods/dataframe/indexing/tail.test.js | 6 +- test/utils/storageTestUtils.js | 94 +++++-------------- 11 files changed, 89 insertions(+), 116 deletions(-) create mode 100644 src/methods/dataframe/indexing/index.js diff --git a/src/methods/dataframe/filtering/index.js b/src/methods/dataframe/filtering/index.js index 27c013c..e8c0223 100644 --- a/src/methods/dataframe/filtering/index.js +++ b/src/methods/dataframe/filtering/index.js @@ -18,12 +18,6 @@ export { where } from './where.js'; export { expr$ } from './expr$.js'; export { select } from './select.js'; export { drop } from './drop.js'; -export { at } from './at.js'; -export { iloc } from './iloc.js'; -export { stratifiedSample } from './stratifiedSample.js'; -export { head } from './head.js'; -export { tail } from './tail.js'; -export { sample } from './sample.js'; export { selectByPattern } from './selectByPattern.js'; -export { loc } from './loc.js'; export { query } from './query.js'; +export { stratifiedSample } from './stratifiedSample.js'; diff --git a/src/methods/dataframe/index.js b/src/methods/dataframe/index.js index 2b711de..776061c 100644 --- a/src/methods/dataframe/index.js +++ b/src/methods/dataframe/index.js @@ -7,6 +7,7 @@ import './filtering/index.js'; import './display/index.js'; import './transform/index.js'; +import './indexing/index.js'; // Import other method groups as needed // Export nothing as methods are attached to DataFrame prototype diff --git a/src/methods/dataframe/indexing/index.js b/src/methods/dataframe/indexing/index.js new file mode 100644 index 0000000..950f424 --- /dev/null +++ b/src/methods/dataframe/indexing/index.js @@ -0,0 +1,13 @@ +/** + * DataFrame indexing methods + * @module methods/dataframe/indexing + */ + +import { DataFrame } from '../../../core/dataframe/DataFrame.js'; +import { registerDataFrameIndexing } from './register.js'; + +// Register all indexing methods on DataFrame +registerDataFrameIndexing(DataFrame); + +// Export nothing as methods are attached to DataFrame prototype +export {}; diff --git a/test/methods/dataframe/filtering/index.test.js b/test/methods/dataframe/filtering/index.test.js index 448678d..4c79c76 100644 --- a/test/methods/dataframe/filtering/index.test.js +++ b/test/methods/dataframe/filtering/index.test.js @@ -5,8 +5,15 @@ import { describe, test, expect } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; import * as filteringMethods from '../../../../src/methods/dataframe/filtering/index.js'; -import registerDataFrameFiltering from '../../../../src/methods/dataframe/filtering/register.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; + +import { + testWithBothStorageTypes, + createDataFrameWithStorage, +} from '../../../utils/storageTestUtils.js'; + +// Регистрируем методы индексирования на DataFrame +registerDataFrameIndexing(DataFrame); // Test data for use in all tests const testData = [ @@ -18,34 +25,42 @@ const testData = [ ]; describe('Filtering Methods Index', () => { - // Register filtering and indexing methods for DataFrame - registerDataFrameFiltering(DataFrame); - registerDataFrameIndexing(DataFrame); - - describe('with standard storage', () => { - // Create DataFrame using fromRows - const df = DataFrame.fromRows(testData); - - test('should export all filtering methods', () => { - // Check that all expected methods are exported - expect(filteringMethods).toHaveProperty('select'); - expect(filteringMethods).toHaveProperty('drop'); - expect(filteringMethods).toHaveProperty('selectByPattern'); - expect(filteringMethods).toHaveProperty('filter'); - expect(filteringMethods).toHaveProperty('query'); - expect(filteringMethods).toHaveProperty('where'); - expect(filteringMethods).toHaveProperty('stratifiedSample'); - }); + // Run tests with both storage types + testWithBothStorageTypes((storageType) => { + describe(`with ${storageType} storage`, () => { + // Create DataFrame with the specified storage type + const df = createDataFrameWithStorage(DataFrame, testData, storageType); + + test('should export all filtering methods', () => { + // Check that all expected methods are exported + expect(filteringMethods).toHaveProperty('select'); + expect(filteringMethods).toHaveProperty('drop'); + expect(filteringMethods).toHaveProperty('selectByPattern'); + expect(filteringMethods).toHaveProperty('filter'); + expect(filteringMethods).toHaveProperty('query'); + expect(filteringMethods).toHaveProperty('where'); + expect(filteringMethods).toHaveProperty('stratifiedSample'); + }); + + test('should successfully extend DataFrame with filtering methods', () => { + // Create a sample DataFrame + // df was created above using createDataFrameWithStorage + + // Check that all filtering methods are available on the DataFrame instance + expect(typeof df.select).toBe('function'); + expect(typeof df.drop).toBe('function'); + expect(typeof df.selectByPattern).toBe('function'); + expect(typeof df.filter).toBe('function'); + expect(typeof df.query).toBe('function'); + expect(typeof df.where).toBe('function'); + expect(typeof df.stratifiedSample).toBe('function'); - test('should successfully extend DataFrame with filtering methods', () => { - // Check that all filtering methods are available on the DataFrame instance - expect(typeof df.select).toBe('function'); - expect(typeof df.drop).toBe('function'); - expect(typeof df.selectByPattern).toBe('function'); - expect(typeof df.filter).toBe('function'); - expect(typeof df.query).toBe('function'); - expect(typeof df.where).toBe('function'); - expect(typeof df.stratifiedSample).toBe('function'); + // Проверяем, что методы индексирования также доступны (они регистрируются отдельно) + expect(typeof df.at).toBe('function'); + expect(typeof df.iloc).toBe('function'); + expect(typeof df.loc).toBe('function'); + expect(typeof df.sample).toBe('function'); + }); }); }); }); diff --git a/test/methods/dataframe/indexing/at.test.js b/test/methods/dataframe/indexing/at.test.js index c3a9841..f71a3b2 100644 --- a/test/methods/dataframe/indexing/at.test.js +++ b/test/methods/dataframe/indexing/at.test.js @@ -4,7 +4,7 @@ import { describe, test, expect } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; // Test data for use in all tests const testData = [ diff --git a/test/methods/dataframe/indexing/head.test.js b/test/methods/dataframe/indexing/head.test.js index dfada90..5e018c5 100644 --- a/test/methods/dataframe/indexing/head.test.js +++ b/test/methods/dataframe/indexing/head.test.js @@ -4,7 +4,7 @@ import { describe, it, expect, vi } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; // Test data for use in all tests const testData = [ diff --git a/test/methods/dataframe/indexing/iloc.test.js b/test/methods/dataframe/indexing/iloc.test.js index 5b9e4c7..0d366d4 100644 --- a/test/methods/dataframe/indexing/iloc.test.js +++ b/test/methods/dataframe/indexing/iloc.test.js @@ -4,7 +4,7 @@ import { describe, test, expect } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; // Test data for use in all tests const testData = [ diff --git a/test/methods/dataframe/indexing/loc.test.js b/test/methods/dataframe/indexing/loc.test.js index 44d7a6e..b0fe584 100644 --- a/test/methods/dataframe/indexing/loc.test.js +++ b/test/methods/dataframe/indexing/loc.test.js @@ -4,7 +4,7 @@ import { describe, test, expect } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; // Test data for use in all tests const testData = [ diff --git a/test/methods/dataframe/indexing/sample.test.js b/test/methods/dataframe/indexing/sample.test.js index 7a853a5..0d2bcba 100644 --- a/test/methods/dataframe/indexing/sample.test.js +++ b/test/methods/dataframe/indexing/sample.test.js @@ -4,7 +4,7 @@ import { describe, test, expect } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; // Register indexing methods on DataFrame registerDataFrameIndexing(DataFrame); diff --git a/test/methods/dataframe/indexing/tail.test.js b/test/methods/dataframe/indexing/tail.test.js index 750b490..77de6e3 100644 --- a/test/methods/dataframe/indexing/tail.test.js +++ b/test/methods/dataframe/indexing/tail.test.js @@ -1,7 +1,7 @@ -// test/methods/dataframe/indexing/tail.test.js -import { describe, it, expect } from 'vitest'; +// test/methods/filtering/tail.test.js +import { describe, it, expect, vi } from 'vitest'; import { DataFrame } from '../../../../src/core/dataframe/DataFrame.js'; -import { register as registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; +import { registerDataFrameIndexing } from '../../../../src/methods/dataframe/indexing/register.js'; // Test data for use in all tests const testData = [ diff --git a/test/utils/storageTestUtils.js b/test/utils/storageTestUtils.js index 69ec86f..136e62b 100644 --- a/test/utils/storageTestUtils.js +++ b/test/utils/storageTestUtils.js @@ -1,86 +1,36 @@ /** - * Utilities for testing with different storage types (TypedArray and Arrow) + * Utilities for testing DataFrame with different storage types */ -import { VectorFactory } from '../../src/core/storage/VectorFactory.js'; +/** + * List of storage types to test with + * @type {string[]} + */ +export const storageTypes = ['standard', 'arrow']; /** - * Runs tests with both storage types (TypedArray and Arrow) - * - * @param {Function} testFn - Test function that accepts storage type ('TypedArray' or 'Arrow') + * Run a test suite with both storage types + * @param {Function} testFn - Function to run tests with each storage type */ export function testWithBothStorageTypes(testFn) { - // Save the original shouldUseArrow function - const originalShouldUseArrow = VectorFactory.shouldUseArrow; - - try { - // Test with TypedArray - VectorFactory.shouldUseArrow = () => false; - testFn('TypedArray'); - - // Test with Arrow - VectorFactory.shouldUseArrow = () => true; - testFn('Arrow'); - } finally { - // Restore the original function - VectorFactory.shouldUseArrow = originalShouldUseArrow; - } + storageTypes.forEach((storageType) => { + testFn(storageType); + }); } /** - * Creates DataFrame with the specified storage type - * - * @param {Function} DataFrameClass - DataFrame class - * @param {Object|Array} data - Data for creating DataFrame - * @param {string} storageType - Storage type ('TypedArray' or 'Arrow') - * @returns {DataFrame} - Created DataFrame with the specified storage type + * Create a DataFrame with the specified storage type + * @param {Class} DataFrame - DataFrame class constructor + * @param {Array} data - Data to create DataFrame from + * @param {string} storageType - Storage type ('standard' or 'arrow') + * @returns {DataFrame} - DataFrame instance with the specified storage type */ -export function createDataFrameWithStorage(DataFrameClass, data, storageType) { - // Напрямую регистрируем методы фильтрации для тестов - try { - // Импортируем регистратор методов фильтрации - const { - registerDataFrameFiltering, - } = require('../../src/methods/dataframe/filtering/register.js'); - registerDataFrameFiltering(DataFrameClass); - } catch (e) { - console.warn('Warning: Error registering filtering methods:', e.message); - } - - // Save the original shouldUseArrow function - const originalShouldUseArrow = VectorFactory.shouldUseArrow; +export function createDataFrameWithStorage(DataFrame, data, storageType) { + const options = {}; - try { - // Set the shouldUseArrow function based on the storage type - VectorFactory.shouldUseArrow = () => storageType === 'Arrow'; - - // Convert data to a format suitable for DataFrame - let columns = {}; - - if (Array.isArray(data)) { - // If data is presented as an array of objects - if (data.length > 0) { - // Get a list of all keys from the first object - const keys = Object.keys(data[0]); - - // Create columns for each key - for (const key of keys) { - columns[key] = data.map((row) => row[key]); - } - } - } else if (typeof data === 'object') { - // If data is already presented as columns - columns = data; - } - - // Create DataFrame - const df = new DataFrameClass(columns); - - // В новом коре frame это геттер, не нужно устанавливать его вручную - // Просто возвращаем DataFrame - return df; - } finally { - // Restore the original function - VectorFactory.shouldUseArrow = originalShouldUseArrow; + if (storageType === 'arrow') { + options.preferArrow = true; } + + return DataFrame.fromRows(data, options); }