diff --git a/dist/mjoin.js b/dist/mjoin.js index cba3668..c477e56 100644 --- a/dist/mjoin.js +++ b/dist/mjoin.js @@ -275,7 +275,7 @@ var Mjoin = /** @class */ (function (_super) { query.innerJoin(mJoinTable + ' as ' + mJoinTableAlias, mJoinTableAlias + '.' + join.child[0], '=', join.table + '.' + join.child[1]); } else { - query.innerJoin(mJoinTable + ' as ' + mJoinTableAlias, mJoinTableAlias + '.' + join.parent, '=', dteTableAlias + '.' + join.child); + query.innerJoin(mJoinTable + ' as ' + mJoinTableAlias, mJoinTableAlias + '.' + join.child, '=', dteTableAlias + '.' + join.parent); } readField = ''; if (this._propExists(dteTableAlias + '.' + joinField, response.data[0])) { diff --git a/dist/mjoin.js.map b/dist/mjoin.js.map index 1d87daf..8de872b 100644 --- a/dist/mjoin.js.map +++ b/dist/mjoin.js.map @@ -1 +1 @@ -{"version":3,"sources":["mjoin.ts"],"names":[],"mappings":"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","file":"mjoin.js","sourcesContent":["import * as knex from 'knex';\n\nimport Editor, {IDtRequest, IDtResponse} from './editor';\nimport Field from './field';\nimport NestedData from './nestedData';\n\ninterface IJoinTable {\n\ttable?: string;\n\tparent: string|string[];\n\tchild: string|string[];\n}\n\n/**\n * Grouped validation\n */\nexport type IMjoinValidator =\n\t( editor: Editor, action: string, data: IDtRequest ) => Promise;\n\n\n/**\n * The MJoin class provides a one-to-many join link for Editor. This can\n * be useful in cases were an attribute can take multiple values at the\n * same time - for example cumulative security access levels.\n *\n * Typically the MJoin class should be used with a link table, but this is\n * optional. Please note that if you don't use a link table you should be\n * aware that on edit the linked rows are deleted and then reinserted, thus\n * if any values should be retained they should also be submitted.\n *\n * Please refer to the Editor Node documentation for further information\n * https://editor.datatables.net/manual/node\n *\n * @export\n * @class Mjoin\n * @extends {NestedData}\n */\nexport default class Mjoin extends NestedData {\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t* Private parameters\n\t*/\n\n\tprivate _table: string;\n\tprivate _editor: Editor;\n\tprivate _name: string;\n\tprivate _get: boolean = true;\n\tprivate _set: boolean = true;\n\tprivate _where: any[] = [];\n\tprivate _fields: Field[] = [];\n\tprivate _links: string[] = [];\n\tprivate _order: string;\n\tprivate _join: IJoinTable = {\n\t\tchild: '',\n\t\tparent: ''\n\t};\n\tprivate _validators: Array<{\n\t\tfieldName: string,\n\t\tfn: IMjoinValidator\n\t}> = [];\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Constructor\n\t */\n\n\t/**\n\t * Creates an instance of Mjoin.\n\t *\n\t * @param {string} table Table name being joined to\n\t */\n\tconstructor( table: string ) {\n\t\tsuper();\n\n\t\tthis.table( table );\n\t\tthis.name( table );\n\t}\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Public methods\n\t */\n\n\t/**\n\t * Get or field by name, or add a field instance.\n\t *\n\t * @param {(Field|string)} nameOrField Field instance to add, or field name to get\n\t * @returns Mjoin instance if adding a field, Field instance if getting a field.\n\t */\n\tpublic field( nameOrField: string );\n\tpublic field( nameOrField: Field );\n\tpublic field( nameOrField: Field|string ) {\n\t\tif ( typeof nameOrField === 'string' ) {\n\t\t\tfor ( let i = 0, ien = this._fields.length ; i < ien ; i++ ) {\n\t\t\t\tif ( this._fields[i].name() === nameOrField ) {\n\t\t\t\t\treturn this._fields[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new Error( 'Unknown field: ' + nameOrField );\n\t\t}\n\n\t\tthis._fields.push( nameOrField );\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the fields assigned to this instance.\n\t * @returns {Field[]} Array of fields\n\t */\n\tpublic fields(): Field[];\n\t/**\n\t * Add one or more fields to the instance.\n\t * @param {...Field[]} fields Fields to add\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic fields(...fields: Field[]): Mjoin;\n\tpublic fields(...fields: Field[]): any {\n\t\tif ( fields === undefined || fields.length === 0 ) {\n\t\t\treturn this._fields;\n\t\t}\n\n\t\tthis._fields.push.apply( this._fields, fields );\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the `get` flag for all fields in the Mjoin instance.\n\t *\n\t * @returns {boolean} True if gettable, false otherwise.\n\t */\n\tpublic get(): boolean;\n\t/**\n\t * Set the `get` flag for all fields in the Mjoin instance.\n\t * When set to false no read operations will occur on the join tables.\n\t *\n\t * @param {boolean} flag `true` to mark as readable, false otherwise\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic get(flag: boolean): Mjoin;\n\tpublic get(flag?: boolean): any {\n\t\tif ( flag === undefined ) {\n\t\t\treturn this._get;\n\t\t}\n\n\t\tthis._get = flag;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Create a join link between two tables. The order of the fields does not\n\t * matter, but each field must contain the table name as well as the field\n\t * name.\n\t *\n\t * This method can be called a maximum of two times for an Mjoin instance:\n\t *\n\t * * First time, creates a link between the Editor host table and a join\n\t * table\n\t * * Second time creates the links required for a link table.\n\t *\n\t * Please refer to the Editor Mjoin documentation for further details:\n\t * https://editor.datatables.net/manual/php\n\t *\n\t * @param {string} field1 Table and field name\n\t * @param {string} field2 Table and field name\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic link( field1: string, field2: string ): Mjoin {\n\t\tif ( field1.indexOf('.') === -1 || field2.indexOf('.') === -1 ) {\n\t\t\tthrow new Error( 'Mjoin fields must contain both the table name and the column name' );\n\t\t}\n\n\t\tif ( this._links.length === 4 ) {\n\t\t\tthrow new Error( 'Mjoin link method cannot be called more than twice for a single instance' );\n\t\t}\n\n\t\t// Add to list - it is resolved later on\n\t\tthis._links.push( field1 );\n\t\tthis._links.push( field2 );\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the instance's configured name.\n\t *\n\t * The `name` of the Join is the JSON property key that is used when\n\t * 'getting' the data, and the HTTP property key (in a JSON style) when\n\t * 'setting' data. Typically the name of the db table will be used here,\n\t * but this method allows that to be overridden.\n\t *\n\t * @returns {string} Current name.\n\t */\n\tpublic name(): string;\n\t/**\n\t * Set the instance's name\n\t *\n\t * @param {string} name Name to set\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic name(name: string): Mjoin;\n\tpublic name(name?: string): any {\n\t\tif ( name === undefined ) {\n\t\t\treturn this._name;\n\t\t}\n\n\t\tthis._name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the column name to order the data by\n\t *\n\t * @returns {string} SQL column name\n\t */\n\tpublic order(): string;\n\t/**\n\t * Specify the property that the data will be sorted by.\n\t *\n\t * @param {string} order SQL column name to order the data by\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic order(order: string): Mjoin;\n\tpublic order(order?: string): any {\n\t\tif ( order === undefined ) {\n\t\t\treturn this._order;\n\t\t}\n\n\t\tthis._order = order;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the current `set` property for the instance.\n\t *\n\t * When set to false no write operations will occur on the join tables.\n\t * This can be useful when you want to display information which is joined,\n\t * but want to only perform write operations on the parent table.\n\t *\n\t * @returns {boolean} Set configuration\n\t */\n\tpublic set(): boolean;\n\t/**\n\t * Set the instance's set property\n\t *\n\t * @param {(boolean)} flag Set flag.\n\t * @returns {Mjoin} Self for chaining.\n\t */\n\tpublic set(flag: boolean): Mjoin;\n\tpublic set(flag?: boolean): any {\n\t\tif ( flag === undefined ) {\n\t\t\treturn this._set;\n\t\t}\n\n\t\tthis._set = flag;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get join table name.\n\t *\n\t * Please note that this will also set the {@link name} used by the Join\n\t * as well. This is for convenience as the JSON output / HTTP input will\n\t * typically use the same name as the database name. If you want to set a\n\t * custom name, the {@link name} method must be called ***after*** this one.\n\t *\n\t * @returns {string} Join table name\n\t */\n\tpublic table(): string;\n\t/**\n\t * Set column join name\n\t *\n\t * @param {string} table Join table name\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic table(table: string): Mjoin;\n\tpublic table(table?: string): any {\n\t\tif ( table === undefined ) {\n\t\t\treturn this._table;\n\t\t}\n\n\t\tthis._table = table;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set a validator for the array of data (not on a field basis)\n\t *\n\t * @param fieldName Name of the field that any error should be shown\n\t * against on the client-side\n\t * @param fn Callback function for validation\n\t */\n\tpublic validator( fieldName: string, fn: IMjoinValidator ): this {\n\t\tthis._validators.push( {\n\t\t\tfieldName,\n\t\t\tfn\n\t\t} );\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the array of conditions applied to the method.\n\t *\n\t * @returns {any[]} Knex where conditions.\n\t */\n\tpublic where(): any[];\n\t/**\n\t * Where condition to add to the query used to get data from the database.\n\t * Note that this is applied to the child table.\n\t *\n\t * @param {*} cond Knex query condition\n\t * @returns {Mjoin} Self for chaining.\n\t */\n\tpublic where(cond: any): Mjoin;\n\tpublic where(cond?: any): any {\n\t\tif ( cond === undefined ) {\n\t\t\treturn this._where;\n\t\t}\n\n\t\tthis._where.push( cond );\n\n\t\treturn this;\n\t}\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Internal methods\n\t */\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async data( editor: Editor, response: IDtResponse ): Promise {\n\t\tif ( ! this._get ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet fields = this.fields();\n\t\tlet join = this._join;\n\n\t\t// This is something that will likely come in a future version, but it\n\t\t// is a relatively low use feature. Please get in touch if this is\n\t\t// something you require.\n\t\tif ( editor.pkey().length > 1 ) {\n\t\t\tthrow new Error( 'Mjoin is not currently supported with a compound primary key for the main table' );\n\t\t}\n\n\t\tif ( response.data.length ) {\n\t\t\t// If the Editor primary key is join key, then it is read automatically\n\t\t\t// and into Editor's primary key store\n\t\t\tlet dteTable = editor.table()[0];\n\t\t\tlet joinField = join.table ?\n\t\t\t\tjoin.parent[0] :\n\t\t\t\tjoin.parent;\n\t\t\tlet dteTableAlias = dteTable.indexOf(' ') !== -1\n\t\t\t\t? dteTable.split(/ (as )?/i)[2]\n\t\t\t\t: dteTable;\n\t\t\tlet mJoinTable = this._table.indexOf(' ') !== -1\n\t\t\t\t? this._table.split(/ (as )?/i)[0]\n\t\t\t\t: this._table;\n\t\t\tlet mJoinTableAlias = this._table.indexOf(' ') !== -1\n\t\t\t\t? this._table.split(/ (as )?/i)[2]\n\t\t\t\t: this._table;\n\n\t\t\tlet pkeyIsJoin = joinField === editor.pkey()[0] ||\n\t\t\tdteTableAlias + '.' + joinField === editor.pkey()[0];\n\n\t\t\t// Build the basic query\n\t\t\tlet query = editor.db().table( dteTable )\n\t\t\t\t.distinct( dteTableAlias + '.' + joinField + ' as dteditor_pkey' );\n\n\t\t\tlet order = this.order();\n\t\t\tif ( order ) {\n\t\t\t\tlet a = order.split( ' ' );\n\n\t\t\t\tif ( a.length > 1 ) {\n\t\t\t\t\tquery.orderBy( a[0], a[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tquery.orderBy( a );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._applyWhere( query );\n\n\t\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\t\tlet field = fields[i];\n\n\t\t\t\tif ( field.apply('get') && field.getValue() === undefined ) {\n\t\t\t\t\tlet dbField = field.dbField();\n\n\t\t\t\t\tif (dbField.indexOf('(') !== -1 ) {\n\t\t\t\t\t\tquery.select( editor.db().raw( dbField + ' as \"' + dbField + '\"' ) );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( dbField.indexOf('.') === -1 ) {\n\t\t\t\t\t\tquery.select( mJoinTableAlias + '.' + dbField + ' as ' + dbField );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tquery.select( dbField );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create the joins\n\t\t\tif ( join.table ) {\n\t\t\t\tquery.innerJoin( join.table, dteTableAlias + '.' + join.parent[0], '=', join.table + '.' + join.parent[1] );\n\t\t\t\tquery.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.child[0], '=', join.table + '.' + join.child[1] );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tquery.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.parent, '=', dteTableAlias + '.' + join.child );\n\t\t\t}\n\n\t\t\tlet readField = '';\n\t\t\tif ( this._propExists( dteTableAlias + '.' + joinField, response.data[0] ) ) {\n\t\t\t\treadField = dteTableAlias + '.' + joinField;\n\t\t\t}\n\t\t\telse if ( this._propExists( joinField.toString(), response.data[0] ) ) {\n\t\t\t\treadField = joinField.toString();\n\t\t\t}\n\t\t\telse if ( !pkeyIsJoin ) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Join was performed on the field \"' + readField + '\" which was not ' +\n\t\t\t\t\t'included in the Editor field list. The join field must be ' +\n\t\t\t\t\t'included as a regular field in the Editor instance.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Get list of pkey values and apply as a WHERE IN condition\n\t\t\t// This is primarily useful in server-side processing mode and when filtering\n\t\t\t// the table as it means only a sub-set will be selected\n\t\t\t// This is only applied for \"sensible\" data sets.172 It will just complicate\n\t\t\t// matters for really large data sets:\n\t\t\t// https://stackoverflow.com/questions/21178390/in-clause-limitation-in-sql-server\n\t\t\tif ( response.data.length < 1000 ) {\n\t\t\t\tlet whereIn = [];\n\t\t\t\tlet data = response.data;\n\n\t\t\t\tfor ( let i = 0, ien = data.length; i < ien; i++ ) {\n\t\t\t\t\tlet linkValue = pkeyIsJoin ?\n\t\t\t\t\t\t(data[i] as any).DT_RowId.replace( editor.idPrefix(), '' ) :\n\t\t\t\t\t\tthis._readProp( readField, data[i] );\n\n\t\t\t\t\twhereIn.push( linkValue );\n\t\t\t\t}\n\n\t\t\t\tquery.whereIn( dteTableAlias + '.' + joinField, whereIn );\n\t\t\t}\n\n\t\t\tlet res = await query;\n\n\t\t\t// Map the data to the primary key for fast loop up\n\t\t\tlet joinMap = {};\n\n\t\t\tfor ( let i = 0, ien = res.length ; i < ien ; i++ ) {\n\t\t\t\tlet inner = {};\n\n\t\t\t\tfor ( let j = 0, jen = fields.length ; j < jen ; j++ ) {\n\t\t\t\t\tfields[j].write( inner, res[i] );\n\t\t\t\t}\n\n\t\t\t\tlet lookup = res[i].dteditor_pkey;\n\n\t\t\t\tif ( ! joinMap[ lookup ] ) {\n\t\t\t\t\tjoinMap[ lookup ] = [];\n\t\t\t\t}\n\n\t\t\t\tjoinMap[ lookup ].push( inner );\n\t\t\t}\n\n\t\t\t// Loop over the data in the original response and do a join based on\n\t\t\t// the mapped data\n\t\t\tfor ( let i = 0, ien = response.data.length ; i < ien ; i++ ) {\n\t\t\t\tlet data = response.data[i];\n\t\t\t\tlet linkField = pkeyIsJoin ?\n\t\t\t\t\t(data as any).DT_RowId.replace( editor.idPrefix(), '' ) :\n\t\t\t\t\tthis._readProp( readField, data );\n\n\t\t\t\tif ( joinMap[ linkField ] ) {\n\t\t\t\t\tdata[ this._name ] = joinMap[ linkField ];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdata[ this._name ] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Field options\n\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\tlet opts = await fields[i].optionsExec( editor.db() );\n\n\t\t\tif ( opts ) {\n\t\t\t\tlet name = this.name() + '[].' + fields[i].name();\n\n\t\t\t\tresponse.options[ name ] = opts;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async create( editor: Editor, parentId: string, data: object ): Promise {\n\t\t// If not settable, or the many count for the join was not submitted\n\t\t// then we do nothing\n\t\tif (\n\t\t\t! this._set ||\n\t\t\t! data[ this._name ] ||\n\t\t\t! data[ this._name + '-many-count']\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet db = editor.db();\n\n\t\tfor ( let i = 0, ien = data[ this._name ].length ; i < ien ; i++ ) {\n\t\t\tawait this._insert( db, parentId, data[ this._name ][i] );\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async update( editor: Editor, parentId: string, data: object ): Promise {\n\t\tif ( ! this._set || ! data[ this._name + '-many-count'] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// WARNING - this will remove rows and then readd them. Any\n\t\t// data not in the field list WILL BE LOST\n\t\tawait this.remove( editor, [parentId] );\n\t\tawait this.create( editor, parentId, data );\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async remove( editor: Editor, ids: string[] ): Promise {\n\t\tif ( ! this._set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet db = editor.db();\n\t\tlet join = this._join;\n\n\t\tif ( join.table ) {\n\t\t\tlet query = db\n\t\t\t\t.del()\n\t\t\t\t.from( join.table );\n\n\t\t\tfor ( let i = 0, ien = ids.length ; i < ien ; i++ ) {\n\t\t\t\tquery.orWhere( { [join.parent[1]]: ids[i] } );\n\t\t\t}\n\n\t\t\tawait query;\n\t\t}\n\t\telse {\n\t\t\tlet query = db\n\t\t\t\t.del()\n\t\t\t\t.from( this._table );\n\n\t\t\tquery.where( function() {\n\t\t\t\tfor ( let i = 0, ien = ids.length ; i < ien ; i++ ) {\n\t\t\t\t\tquery.orWhere( { [join.child.toString()]: ids[i] } );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis._applyWhere( query );\n\n\t\t\tawait query;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async validate( errors, editor: Editor, data: object, action: string ): Promise {\n\t\tif ( ! this._set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet joinData = data[ this._name ] || [];\n\n\t\tfor ( let j = 0, jen=this._validators.length ; j < jen ; j++ ) {\n\t\t\tlet validator = this._validators[j];\n\t\t\tlet res = await validator.fn( editor, action, joinData );\n\n\t\t\tif ( typeof res === 'string' ) {\n\t\t\t\terrors.push( {\n\t\t\t\t\tname: validator.fieldName,\n\t\t\t\t\tstatus: res\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfor ( let i = 0, ien = joinData.length ; i < ien ; i++ ) {\n\t\t\tawait this._validateFields( errors, editor, joinData[i], this._name + '[].' );\n\t\t}\n\t}\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Private methods\n\t */\n\tprivate _applyWhere( query: knex ): void {\n\t\tlet where = this._where;\n\n\t\tfor ( let i = 0, ien = where.length ; i < ien ; i++ ) {\n\t\t\tquery.where( where[i] );\n\t\t}\n\t}\n\n\tprivate async _insert( db: knex, parentId: string, data: object ): Promise {\n\t\tlet join = this._join;\n\t\tlet fields = this.fields();\n\n\t\tif ( join.table ) {\n\t\t\t// Insert keys into the join table\n\t\t\tawait db\n\t\t\t\t.insert( {\n\t\t\t\t\t[join.parent[1]]: parentId,\n\t\t\t\t\t[join.child[1]]: data[ join.child[0] ]\n\t\t\t\t} )\n\t\t\t\t.from( join.table );\n\t\t}\n\t\telse {\n\t\t\t// Insert values into the target table\n\t\t\tlet set = {\n\t\t\t\t[join.child.toString()]: parentId\n\t\t\t};\n\n\t\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\t\tlet field = fields[i];\n\n\t\t\t\tif ( field.apply('create', data) ) {\n\t\t\t\t\tset[ field.dbField() ] = field.val( 'set', data );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db\n\t\t\t\t.insert( set )\n\t\t\t\t.from( this._table );\n\t\t}\n\t}\n\n\tprivate _prepare( editor: Editor ): void {\n\t\tthis._editor = editor;\n\n\t\tlet links = this._links;\n\t\tlet editorTable = editor.table()[0];\n\t\tlet joinTable = this.table();\n\t\tlet dteTableAlias = editorTable.indexOf(' ') !== -1\n\t\t\t? editorTable.split(/ (as )?/i)[2]\n\t\t\t: editorTable;\n\n\t\tif ( links.length === 2 ) {\n\t\t\t// No link table\n\t\t\tlet f1 = links[0].split('.');\n\t\t\tlet f2 = links[1].split('.');\n\n\t\t\tif ( f1[0] === dteTableAlias ) {\n\t\t\t\tthis._join.parent = f1[1];\n\t\t\t\tthis._join.child = f2[1];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._join.parent = f2[1];\n\t\t\t\tthis._join.child = f1[1];\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Link table\n\t\t\tlet f1 = links[0].split('.');\n\t\t\tlet f2 = links[1].split('.');\n\t\t\tlet f3 = links[2].split('.');\n\t\t\tlet f4 = links[3].split('.');\n\n\t\t\t// Discover the name of the link table\n\t\t\tif ( f1[0] !== dteTableAlias && f1[0] !== joinTable ) {\n\t\t\t\tthis._join.table = f1[0];\n\t\t\t}\n\t\t\telse if ( f2[0] !== dteTableAlias && f2[0] !== joinTable ) {\n\t\t\t\tthis._join.table = f2[0];\n\t\t\t}\n\t\t\telse if ( f3[0] !== dteTableAlias && f3[0] !== joinTable ) {\n\t\t\t\tthis._join.table = f3[0];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._join.table = f4[0];\n\t\t\t}\n\n\t\t\tthis._join.parent = [ f1[1], f2[1] ];\n\t\t\tthis._join.child = [ f3[1], f4[1] ];\n\t\t}\n\t}\n\n\tprivate async _validateFields( errors, editor: Editor, data: object, prefix: string ): Promise {\n\t\tlet fields = this.fields();\n\n\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\tlet field = fields[i];\n\t\t\tlet validation = await field.validate( data, editor );\n\n\t\t\tif ( validation !== true ) {\n\t\t\t\terrors.push( {\n\t\t\t\t\tname: prefix + field.name(),\n\t\t\t\t\tstatus: validation\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n}\n"]} \ No newline at end of file +{"version":3,"sources":["mjoin.ts"],"names":[],"mappings":"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","file":"mjoin.js","sourcesContent":["import * as knex from 'knex';\n\nimport Editor, {IDtRequest, IDtResponse} from './editor';\nimport Field from './field';\nimport NestedData from './nestedData';\n\ninterface IJoinTable {\n\ttable?: string;\n\tparent: string|string[];\n\tchild: string|string[];\n}\n\n/**\n * Grouped validation\n */\nexport type IMjoinValidator =\n\t( editor: Editor, action: string, data: IDtRequest ) => Promise;\n\n\n/**\n * The MJoin class provides a one-to-many join link for Editor. This can\n * be useful in cases were an attribute can take multiple values at the\n * same time - for example cumulative security access levels.\n *\n * Typically the MJoin class should be used with a link table, but this is\n * optional. Please note that if you don't use a link table you should be\n * aware that on edit the linked rows are deleted and then reinserted, thus\n * if any values should be retained they should also be submitted.\n *\n * Please refer to the Editor Node documentation for further information\n * https://editor.datatables.net/manual/node\n *\n * @export\n * @class Mjoin\n * @extends {NestedData}\n */\nexport default class Mjoin extends NestedData {\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t* Private parameters\n\t*/\n\n\tprivate _table: string;\n\tprivate _editor: Editor;\n\tprivate _name: string;\n\tprivate _get: boolean = true;\n\tprivate _set: boolean = true;\n\tprivate _where: any[] = [];\n\tprivate _fields: Field[] = [];\n\tprivate _links: string[] = [];\n\tprivate _order: string;\n\tprivate _join: IJoinTable = {\n\t\tchild: '',\n\t\tparent: ''\n\t};\n\tprivate _validators: Array<{\n\t\tfieldName: string,\n\t\tfn: IMjoinValidator\n\t}> = [];\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Constructor\n\t */\n\n\t/**\n\t * Creates an instance of Mjoin.\n\t *\n\t * @param {string} table Table name being joined to\n\t */\n\tconstructor( table: string ) {\n\t\tsuper();\n\n\t\tthis.table( table );\n\t\tthis.name( table );\n\t}\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Public methods\n\t */\n\n\t/**\n\t * Get or field by name, or add a field instance.\n\t *\n\t * @param {(Field|string)} nameOrField Field instance to add, or field name to get\n\t * @returns Mjoin instance if adding a field, Field instance if getting a field.\n\t */\n\tpublic field( nameOrField: string );\n\tpublic field( nameOrField: Field );\n\tpublic field( nameOrField: Field|string ) {\n\t\tif ( typeof nameOrField === 'string' ) {\n\t\t\tfor ( let i = 0, ien = this._fields.length ; i < ien ; i++ ) {\n\t\t\t\tif ( this._fields[i].name() === nameOrField ) {\n\t\t\t\t\treturn this._fields[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new Error( 'Unknown field: ' + nameOrField );\n\t\t}\n\n\t\tthis._fields.push( nameOrField );\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the fields assigned to this instance.\n\t * @returns {Field[]} Array of fields\n\t */\n\tpublic fields(): Field[];\n\t/**\n\t * Add one or more fields to the instance.\n\t * @param {...Field[]} fields Fields to add\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic fields(...fields: Field[]): Mjoin;\n\tpublic fields(...fields: Field[]): any {\n\t\tif ( fields === undefined || fields.length === 0 ) {\n\t\t\treturn this._fields;\n\t\t}\n\n\t\tthis._fields.push.apply( this._fields, fields );\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the `get` flag for all fields in the Mjoin instance.\n\t *\n\t * @returns {boolean} True if gettable, false otherwise.\n\t */\n\tpublic get(): boolean;\n\t/**\n\t * Set the `get` flag for all fields in the Mjoin instance.\n\t * When set to false no read operations will occur on the join tables.\n\t *\n\t * @param {boolean} flag `true` to mark as readable, false otherwise\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic get(flag: boolean): Mjoin;\n\tpublic get(flag?: boolean): any {\n\t\tif ( flag === undefined ) {\n\t\t\treturn this._get;\n\t\t}\n\n\t\tthis._get = flag;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Create a join link between two tables. The order of the fields does not\n\t * matter, but each field must contain the table name as well as the field\n\t * name.\n\t *\n\t * This method can be called a maximum of two times for an Mjoin instance:\n\t *\n\t * * First time, creates a link between the Editor host table and a join\n\t * table\n\t * * Second time creates the links required for a link table.\n\t *\n\t * Please refer to the Editor Mjoin documentation for further details:\n\t * https://editor.datatables.net/manual/php\n\t *\n\t * @param {string} field1 Table and field name\n\t * @param {string} field2 Table and field name\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic link( field1: string, field2: string ): Mjoin {\n\t\tif ( field1.indexOf('.') === -1 || field2.indexOf('.') === -1 ) {\n\t\t\tthrow new Error( 'Mjoin fields must contain both the table name and the column name' );\n\t\t}\n\n\t\tif ( this._links.length === 4 ) {\n\t\t\tthrow new Error( 'Mjoin link method cannot be called more than twice for a single instance' );\n\t\t}\n\n\t\t// Add to list - it is resolved later on\n\t\tthis._links.push( field1 );\n\t\tthis._links.push( field2 );\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the instance's configured name.\n\t *\n\t * The `name` of the Join is the JSON property key that is used when\n\t * 'getting' the data, and the HTTP property key (in a JSON style) when\n\t * 'setting' data. Typically the name of the db table will be used here,\n\t * but this method allows that to be overridden.\n\t *\n\t * @returns {string} Current name.\n\t */\n\tpublic name(): string;\n\t/**\n\t * Set the instance's name\n\t *\n\t * @param {string} name Name to set\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic name(name: string): Mjoin;\n\tpublic name(name?: string): any {\n\t\tif ( name === undefined ) {\n\t\t\treturn this._name;\n\t\t}\n\n\t\tthis._name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the column name to order the data by\n\t *\n\t * @returns {string} SQL column name\n\t */\n\tpublic order(): string;\n\t/**\n\t * Specify the property that the data will be sorted by.\n\t *\n\t * @param {string} order SQL column name to order the data by\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic order(order: string): Mjoin;\n\tpublic order(order?: string): any {\n\t\tif ( order === undefined ) {\n\t\t\treturn this._order;\n\t\t}\n\n\t\tthis._order = order;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the current `set` property for the instance.\n\t *\n\t * When set to false no write operations will occur on the join tables.\n\t * This can be useful when you want to display information which is joined,\n\t * but want to only perform write operations on the parent table.\n\t *\n\t * @returns {boolean} Set configuration\n\t */\n\tpublic set(): boolean;\n\t/**\n\t * Set the instance's set property\n\t *\n\t * @param {(boolean)} flag Set flag.\n\t * @returns {Mjoin} Self for chaining.\n\t */\n\tpublic set(flag: boolean): Mjoin;\n\tpublic set(flag?: boolean): any {\n\t\tif ( flag === undefined ) {\n\t\t\treturn this._set;\n\t\t}\n\n\t\tthis._set = flag;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get join table name.\n\t *\n\t * Please note that this will also set the {@link name} used by the Join\n\t * as well. This is for convenience as the JSON output / HTTP input will\n\t * typically use the same name as the database name. If you want to set a\n\t * custom name, the {@link name} method must be called ***after*** this one.\n\t *\n\t * @returns {string} Join table name\n\t */\n\tpublic table(): string;\n\t/**\n\t * Set column join name\n\t *\n\t * @param {string} table Join table name\n\t * @returns {Mjoin} Self for chaining\n\t */\n\tpublic table(table: string): Mjoin;\n\tpublic table(table?: string): any {\n\t\tif ( table === undefined ) {\n\t\t\treturn this._table;\n\t\t}\n\n\t\tthis._table = table;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set a validator for the array of data (not on a field basis)\n\t *\n\t * @param fieldName Name of the field that any error should be shown\n\t * against on the client-side\n\t * @param fn Callback function for validation\n\t */\n\tpublic validator( fieldName: string, fn: IMjoinValidator ): this {\n\t\tthis._validators.push( {\n\t\t\tfieldName,\n\t\t\tfn\n\t\t} );\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the array of conditions applied to the method.\n\t *\n\t * @returns {any[]} Knex where conditions.\n\t */\n\tpublic where(): any[];\n\t/**\n\t * Where condition to add to the query used to get data from the database.\n\t * Note that this is applied to the child table.\n\t *\n\t * @param {*} cond Knex query condition\n\t * @returns {Mjoin} Self for chaining.\n\t */\n\tpublic where(cond: any): Mjoin;\n\tpublic where(cond?: any): any {\n\t\tif ( cond === undefined ) {\n\t\t\treturn this._where;\n\t\t}\n\n\t\tthis._where.push( cond );\n\n\t\treturn this;\n\t}\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Internal methods\n\t */\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async data( editor: Editor, response: IDtResponse ): Promise {\n\t\tif ( ! this._get ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet fields = this.fields();\n\t\tlet join = this._join;\n\n\t\t// This is something that will likely come in a future version, but it\n\t\t// is a relatively low use feature. Please get in touch if this is\n\t\t// something you require.\n\t\tif ( editor.pkey().length > 1 ) {\n\t\t\tthrow new Error( 'Mjoin is not currently supported with a compound primary key for the main table' );\n\t\t}\n\n\t\tif ( response.data.length ) {\n\t\t\t// If the Editor primary key is join key, then it is read automatically\n\t\t\t// and into Editor's primary key store\n\t\t\tlet dteTable = editor.table()[0];\n\t\t\tlet joinField = join.table ?\n\t\t\t\tjoin.parent[0] :\n\t\t\t\tjoin.parent;\n\t\t\tlet dteTableAlias = dteTable.indexOf(' ') !== -1\n\t\t\t\t? dteTable.split(/ (as )?/i)[2]\n\t\t\t\t: dteTable;\n\t\t\tlet mJoinTable = this._table.indexOf(' ') !== -1\n\t\t\t\t? this._table.split(/ (as )?/i)[0]\n\t\t\t\t: this._table;\n\t\t\tlet mJoinTableAlias = this._table.indexOf(' ') !== -1\n\t\t\t\t? this._table.split(/ (as )?/i)[2]\n\t\t\t\t: this._table;\n\n\t\t\tlet pkeyIsJoin = joinField === editor.pkey()[0] ||\n\t\t\tdteTableAlias + '.' + joinField === editor.pkey()[0];\n\n\t\t\t// Build the basic query\n\t\t\tlet query = editor.db().table( dteTable )\n\t\t\t\t.distinct( dteTableAlias + '.' + joinField + ' as dteditor_pkey' );\n\n\t\t\tlet order = this.order();\n\t\t\tif ( order ) {\n\t\t\t\tlet a = order.split( ' ' );\n\n\t\t\t\tif ( a.length > 1 ) {\n\t\t\t\t\tquery.orderBy( a[0], a[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tquery.orderBy( a );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._applyWhere( query );\n\n\t\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\t\tlet field = fields[i];\n\n\t\t\t\tif ( field.apply('get') && field.getValue() === undefined ) {\n\t\t\t\t\tlet dbField = field.dbField();\n\n\t\t\t\t\tif (dbField.indexOf('(') !== -1 ) {\n\t\t\t\t\t\tquery.select( editor.db().raw( dbField + ' as \"' + dbField + '\"' ) );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( dbField.indexOf('.') === -1 ) {\n\t\t\t\t\t\tquery.select( mJoinTableAlias + '.' + dbField + ' as ' + dbField );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tquery.select( dbField );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create the joins\n\t\t\tif ( join.table ) {\n\t\t\t\tquery.innerJoin( join.table, dteTableAlias + '.' + join.parent[0], '=', join.table + '.' + join.parent[1] );\n\t\t\t\tquery.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.child[0], '=', join.table + '.' + join.child[1] );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tquery.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.child, '=', dteTableAlias + '.' + join.parent );\n\t\t\t}\n\n\t\t\tlet readField = '';\n\t\t\tif ( this._propExists( dteTableAlias + '.' + joinField, response.data[0] ) ) {\n\t\t\t\treadField = dteTableAlias + '.' + joinField;\n\t\t\t}\n\t\t\telse if ( this._propExists( joinField.toString(), response.data[0] ) ) {\n\t\t\t\treadField = joinField.toString();\n\t\t\t}\n\t\t\telse if ( !pkeyIsJoin ) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Join was performed on the field \"' + readField + '\" which was not ' +\n\t\t\t\t\t'included in the Editor field list. The join field must be ' +\n\t\t\t\t\t'included as a regular field in the Editor instance.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Get list of pkey values and apply as a WHERE IN condition\n\t\t\t// This is primarily useful in server-side processing mode and when filtering\n\t\t\t// the table as it means only a sub-set will be selected\n\t\t\t// This is only applied for \"sensible\" data sets.172 It will just complicate\n\t\t\t// matters for really large data sets:\n\t\t\t// https://stackoverflow.com/questions/21178390/in-clause-limitation-in-sql-server\n\t\t\tif ( response.data.length < 1000 ) {\n\t\t\t\tlet whereIn = [];\n\t\t\t\tlet data = response.data;\n\n\t\t\t\tfor ( let i = 0, ien = data.length; i < ien; i++ ) {\n\t\t\t\t\tlet linkValue = pkeyIsJoin ?\n\t\t\t\t\t\t(data[i] as any).DT_RowId.replace( editor.idPrefix(), '' ) :\n\t\t\t\t\t\tthis._readProp( readField, data[i] );\n\n\t\t\t\t\twhereIn.push( linkValue );\n\t\t\t\t}\n\n\t\t\t\tquery.whereIn( dteTableAlias + '.' + joinField, whereIn );\n\t\t\t}\n\n\t\t\tlet res = await query;\n\n\t\t\t// Map the data to the primary key for fast loop up\n\t\t\tlet joinMap = {};\n\n\t\t\tfor ( let i = 0, ien = res.length ; i < ien ; i++ ) {\n\t\t\t\tlet inner = {};\n\n\t\t\t\tfor ( let j = 0, jen = fields.length ; j < jen ; j++ ) {\n\t\t\t\t\tfields[j].write( inner, res[i] );\n\t\t\t\t}\n\n\t\t\t\tlet lookup = res[i].dteditor_pkey;\n\n\t\t\t\tif ( ! joinMap[ lookup ] ) {\n\t\t\t\t\tjoinMap[ lookup ] = [];\n\t\t\t\t}\n\n\t\t\t\tjoinMap[ lookup ].push( inner );\n\t\t\t}\n\n\t\t\t// Loop over the data in the original response and do a join based on\n\t\t\t// the mapped data\n\t\t\tfor ( let i = 0, ien = response.data.length ; i < ien ; i++ ) {\n\t\t\t\tlet data = response.data[i];\n\t\t\t\tlet linkField = pkeyIsJoin ?\n\t\t\t\t\t(data as any).DT_RowId.replace( editor.idPrefix(), '' ) :\n\t\t\t\t\tthis._readProp( readField, data );\n\n\t\t\t\tif ( joinMap[ linkField ] ) {\n\t\t\t\t\tdata[ this._name ] = joinMap[ linkField ];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdata[ this._name ] = [];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Field options\n\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\tlet opts = await fields[i].optionsExec( editor.db() );\n\n\t\t\tif ( opts ) {\n\t\t\t\tlet name = this.name() + '[].' + fields[i].name();\n\n\t\t\t\tresponse.options[ name ] = opts;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async create( editor: Editor, parentId: string, data: object ): Promise {\n\t\t// If not settable, or the many count for the join was not submitted\n\t\t// then we do nothing\n\t\tif (\n\t\t\t! this._set ||\n\t\t\t! data[ this._name ] ||\n\t\t\t! data[ this._name + '-many-count']\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet db = editor.db();\n\n\t\tfor ( let i = 0, ien = data[ this._name ].length ; i < ien ; i++ ) {\n\t\t\tawait this._insert( db, parentId, data[ this._name ][i] );\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async update( editor: Editor, parentId: string, data: object ): Promise {\n\t\tif ( ! this._set || ! data[ this._name + '-many-count'] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// WARNING - this will remove rows and then readd them. Any\n\t\t// data not in the field list WILL BE LOST\n\t\tawait this.remove( editor, [parentId] );\n\t\tawait this.create( editor, parentId, data );\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async remove( editor: Editor, ids: string[] ): Promise {\n\t\tif ( ! this._set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet db = editor.db();\n\t\tlet join = this._join;\n\n\t\tif ( join.table ) {\n\t\t\tlet query = db\n\t\t\t\t.del()\n\t\t\t\t.from( join.table );\n\n\t\t\tfor ( let i = 0, ien = ids.length ; i < ien ; i++ ) {\n\t\t\t\tquery.orWhere( { [join.parent[1]]: ids[i] } );\n\t\t\t}\n\n\t\t\tawait query;\n\t\t}\n\t\telse {\n\t\t\tlet query = db\n\t\t\t\t.del()\n\t\t\t\t.from( this._table );\n\n\t\t\tquery.where( function() {\n\t\t\t\tfor ( let i = 0, ien = ids.length ; i < ien ; i++ ) {\n\t\t\t\t\tquery.orWhere( { [join.child.toString()]: ids[i] } );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis._applyWhere( query );\n\n\t\t\tawait query;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tpublic async validate( errors, editor: Editor, data: object, action: string ): Promise {\n\t\tif ( ! this._set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._prepare( editor );\n\t\tlet joinData = data[ this._name ] || [];\n\n\t\tfor ( let j = 0, jen=this._validators.length ; j < jen ; j++ ) {\n\t\t\tlet validator = this._validators[j];\n\t\t\tlet res = await validator.fn( editor, action, joinData );\n\n\t\t\tif ( typeof res === 'string' ) {\n\t\t\t\terrors.push( {\n\t\t\t\t\tname: validator.fieldName,\n\t\t\t\t\tstatus: res\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfor ( let i = 0, ien = joinData.length ; i < ien ; i++ ) {\n\t\t\tawait this._validateFields( errors, editor, joinData[i], this._name + '[].' );\n\t\t}\n\t}\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Private methods\n\t */\n\tprivate _applyWhere( query: knex ): void {\n\t\tlet where = this._where;\n\n\t\tfor ( let i = 0, ien = where.length ; i < ien ; i++ ) {\n\t\t\tquery.where( where[i] );\n\t\t}\n\t}\n\n\tprivate async _insert( db: knex, parentId: string, data: object ): Promise {\n\t\tlet join = this._join;\n\t\tlet fields = this.fields();\n\n\t\tif ( join.table ) {\n\t\t\t// Insert keys into the join table\n\t\t\tawait db\n\t\t\t\t.insert( {\n\t\t\t\t\t[join.parent[1]]: parentId,\n\t\t\t\t\t[join.child[1]]: data[ join.child[0] ]\n\t\t\t\t} )\n\t\t\t\t.from( join.table );\n\t\t}\n\t\telse {\n\t\t\t// Insert values into the target table\n\t\t\tlet set = {\n\t\t\t\t[join.child.toString()]: parentId\n\t\t\t};\n\n\t\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\t\tlet field = fields[i];\n\n\t\t\t\tif ( field.apply('create', data) ) {\n\t\t\t\t\tset[ field.dbField() ] = field.val( 'set', data );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db\n\t\t\t\t.insert( set )\n\t\t\t\t.from( this._table );\n\t\t}\n\t}\n\n\tprivate _prepare( editor: Editor ): void {\n\t\tthis._editor = editor;\n\n\t\tlet links = this._links;\n\t\tlet editorTable = editor.table()[0];\n\t\tlet joinTable = this.table();\n\t\tlet dteTableAlias = editorTable.indexOf(' ') !== -1\n\t\t\t? editorTable.split(/ (as )?/i)[2]\n\t\t\t: editorTable;\n\n\t\tif ( links.length === 2 ) {\n\t\t\t// No link table\n\t\t\tlet f1 = links[0].split('.');\n\t\t\tlet f2 = links[1].split('.');\n\n\t\t\tif ( f1[0] === dteTableAlias ) {\n\t\t\t\tthis._join.parent = f1[1];\n\t\t\t\tthis._join.child = f2[1];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._join.parent = f2[1];\n\t\t\t\tthis._join.child = f1[1];\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Link table\n\t\t\tlet f1 = links[0].split('.');\n\t\t\tlet f2 = links[1].split('.');\n\t\t\tlet f3 = links[2].split('.');\n\t\t\tlet f4 = links[3].split('.');\n\n\t\t\t// Discover the name of the link table\n\t\t\tif ( f1[0] !== dteTableAlias && f1[0] !== joinTable ) {\n\t\t\t\tthis._join.table = f1[0];\n\t\t\t}\n\t\t\telse if ( f2[0] !== dteTableAlias && f2[0] !== joinTable ) {\n\t\t\t\tthis._join.table = f2[0];\n\t\t\t}\n\t\t\telse if ( f3[0] !== dteTableAlias && f3[0] !== joinTable ) {\n\t\t\t\tthis._join.table = f3[0];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._join.table = f4[0];\n\t\t\t}\n\n\t\t\tthis._join.parent = [ f1[1], f2[1] ];\n\t\t\tthis._join.child = [ f3[1], f4[1] ];\n\t\t}\n\t}\n\n\tprivate async _validateFields( errors, editor: Editor, data: object, prefix: string ): Promise {\n\t\tlet fields = this.fields();\n\n\t\tfor ( let i = 0, ien = fields.length ; i < ien ; i++ ) {\n\t\t\tlet field = fields[i];\n\t\t\tlet validation = await field.validate( data, editor );\n\n\t\t\tif ( validation !== true ) {\n\t\t\t\terrors.push( {\n\t\t\t\t\tname: prefix + field.name(),\n\t\t\t\t\tstatus: validation\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n}\n"]} \ No newline at end of file diff --git a/src/mjoin.ts b/src/mjoin.ts index 6282fd5..f741dd3 100644 --- a/src/mjoin.ts +++ b/src/mjoin.ts @@ -405,7 +405,7 @@ export default class Mjoin extends NestedData { query.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.child[0], '=', join.table + '.' + join.child[1] ); } else { - query.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.parent, '=', dteTableAlias + '.' + join.child ); + query.innerJoin( mJoinTable+' as '+mJoinTableAlias, mJoinTableAlias + '.' + join.child, '=', dteTableAlias + '.' + join.parent ); } let readField = '';