- 
                Notifications
    
You must be signed in to change notification settings  - Fork 1
 
Docs: Transform
- Introduction
 - Installation
 - Overview
 - 
Core Components
TransformSelectComponentTransformMergeComponentSelectSourceFormComponent
 - 
Core Models
SelectTransform
 - 
Factories
selectDatasourcePluginFactorymergeDatasourcePluginFactory
 - 
Key Services
- DatasourcePluginManager
 
 - 
Usage
- Registering Plugins
 - Fetching Data through Transformations
 
 - API Reference
 - Examples
 - Testing
 
The Transform Angular Library provides developers with tools to create, manage, and apply transformations to data sources using dynamic queries and merging. It offers a modular approach to apply lightweight data manipulation through custom plugins and dynamic forms.
Install the library along with its required dependencies:
npm install transform @rollthecloudinc/datasource @rollthecloudinc/attributesThe Transform library enables the creation and management of data transformations through pre-defined plugins (Select, Merge) and is extensible for additional transformations. It integrates seamlessly with Angular Forms while leveraging DatasourcePluginManager.
- Dynamic Select Transformations: Apply JSONPath queries to select subsets of data dynamically.
 - Merge Transformations: Combine datasets dynamically through customizable plugins.
 - Custom Forms for Settings: Use dynamic forms for user inputs to configure transformations.
 - Plugin Registration: Easily manage and register transformation plugins via factories.
 
The TransformSelectComponent provides a form-based interface to configure and apply filtering transformations through JSONPath queries.
Selector: classifieds-ui-transform-select
Dependencies:
- Angular's 
ControlContainer - 
AttributeValuefor serialized attribute settings 
Usage:
<classifieds-ui-transform-select
  [settings]="transformSettings">
</classifieds-ui-transform-select>The TransformMergeComponent serves as a placeholder for implementing merging functionality between multiple datasets. While currently minimally scoped, it sets up the structure for advanced merging implementations.
Selector: classifieds-ui-transform-merge
Usage:
<classifieds-ui-transform-merge></classifieds-ui-transform-merge>The SelectSourceFormComponent is a dynamic form component for defining and managing JSONPath queries in the Select transformation.
Selector: classifieds-ui-select-source-form
Form Control Elements:
- 
query(required): The JSONPath query string to define the data subset. 
Example:
<classifieds-ui-select-source-form
  [settings]="attributeSettings">
</classifieds-ui-select-source-form>The SelectTransform model encapsulates the structure for making a JSONPath query to filter or transform a dataset dynamically.
Properties:
- 
query(string): The JSONPath query used for selecting data from the source dataset. 
Example:
const selectTransform = new SelectTransform({
  query: '$.store.books[?(@.price < 10)]'
});The selectDatasourcePluginFactory creates a DatasourcePlugin for performing selection transformations using JSONPath queries. This plugin processes input datasets and applies a query defined within its settings.
Key Plugin Configuration:
- 
id:select - 
title:Select - 
editor:TransformSelectComponent - 
fetch: Applies the JSONPath filtering logic. 
Example:
const plugin = selectDatasourcePluginFactory(attributeSerializerService);
plugin.fetch({
  settings: transformSettings,
  dataset: dataSourceDataset
});The mergeDatasourcePluginFactory creates a DatasourcePlugin for combining datasets. (Currently returns an empty dataset as the merging logic is to be extended.)
Key Plugin Configuration:
- 
id:merge - 
title:Merge - 
editor:TransformMergeComponent 
Example:
const plugin = mergeDatasourcePluginFactory();
plugin.fetch({ settings: mergeSettings });The DatasourcePluginManager is responsible for managing, registering, and applying transformations via plugins.
Responsibilities:
- Register plugins.
 - Manage their lifecycle.
 - Apply transformations dynamically at runtime.
 
Example:
constructor(private pluginManager: DatasourcePluginManager) {}
pluginManager.register(selectDatasourcePluginFactory(attributeSerializerService));
pluginManager.register(mergeDatasourcePluginFactory());Plugins are registered within the TransformModule constructor using the DatasourcePluginManager.
Example:
@NgModule({
  ...
})
export class TransformModule { 
  constructor(dpm: DatasourcePluginManager, attributeSerializer: AttributeSerializerService) {
    dpm.register(selectDatasourcePluginFactory(attributeSerializer));
    dpm.register(mergeDatasourcePluginFactory());
  }
}To fetch data using a transformation:
- Attach appropriate settings to the plugin.
 - Use the 
fetchmethod to process the dataset. 
Example:
const result$ = plugin.fetch({
  settings: transformSettings,
  dataset: inputDataset
});
result$.subscribe(dataset => {
  console.log('Transformed Dataset:', dataset);
});- 
SelectTransform- Properties:
- 
query(string) 
 - 
 - Constructor: 
SelectTransform(data?: SelectTransform) 
 - Properties:
 - 
DatasourcePlugin- Methods:
fetch(config): Observable<Dataset>
 
 - Methods:
 
- 
TransformSelectComponent- Inputs:
- 
settings: Array of serialized key-value pairs for transform configuration. 
 - 
 
 - Inputs:
 - 
TransformMergeComponent - 
SelectSourceFormComponent- Inputs:
- 
settings: Array of serialized attributes. 
 - 
 - Form Controls:
- 
query(required): JSONPath query string. 
 - 
 
 - Inputs:
 
import { DatasourcePluginManager } from '@rollthecloudinc/datasource';
constructor(private dpm: DatasourcePluginManager, private attributeSerializer: AttributeSerializerService) {}
ngOnInit() {
  this.dpm.register(selectDatasourcePluginFactory(this.attributeSerializer));
  const plugin = this.dpm.get('select');
  const result$ = plugin.fetch({
    settings: transformSettings,
    dataset: inputDataset
  });
}<form [formGroup]="formGroup">
  <classifieds-ui-select-source-form
    formControlName="query"
    [settings]="settings">
  </classifieds-ui-select-source-form>
</form>describe('TransformSelectComponent', () => {
  let component: TransformSelectComponent;
  beforeEach(() => {
    component = new TransformSelectComponent(/* init */);
  });
  it('should initialize with default settings', () => {
    expect(component.settings).toEqual([]);
  });
});it('should filter dataset based on JSONPath query', (done) => {
  const plugin = selectDatasourcePluginFactory(mockSerializer);
  const settings = [new AttributeValue({ key: 'query', value: '$.items[?(@.price < 50)]' })];
  const dataset = new Dataset({ results: exampleData });
  plugin.fetch({ settings, dataset }).subscribe(results => {
    expect(results).toBeDefined();
    done();
  });
});The Transform Angular Library is a robust tool for creating reusable and dynamic data transformations. By combining dynamic forms and plugins, it provides developers with powerful utilities for handling complex datasets efficiently. The library can be extended for a wide range of transformation use cases, making it suitable for modern data-driven applications.
For issues and contributions, please feel free to reach out!