Skip to content

Releases: alfateam/orange-orm

v4.0.0

28 May 20:22
Compare
Choose a tag to compare

Changed the behaviour of update to accept a where filter and only update passed in columns and relations. The previous behaviour of update has moved to replace method.

From the docs:

__Selective updates__  
The update method is ideal for updating specific columns and relationships across one or multiple rows. You must provide a where filter to specify which rows to target. If you include a fetching strategy, the affected rows and their related data will be returned; otherwise, no data is returned.

```javascript
import map from './map';
const db = map.sqlite('demo.db');

update();

async function update() {

  const propsToBeModified = {
    orderDate: new Date(),
    customerId: 2,
    lines: [
      { id: 1, product: 'Bicycle', amount: 250 }, //already existing line
      { id: 2, product: 'Small guitar', amount: 150 }, //already existing line
      { product: 'Piano', amount: 800 } //the new line to be inserted
    ]
  };

  const strategy = {customer: true, deliveryAddress: true, lines: true};
  const orders = await db.order.update(propsToBeModified, { where: x => x.id.eq(1) }, strategy);
}

Replacing a row from JSON
The replace method is suitable when a complete overwrite is required from a JSON object - typically in a REST API. However, it's important to consider that this method replaces the entire row and it's children, which might not always be desirable in a multi-user environment.

import map from './map';
const db = map.sqlite('demo.db');

replace();

async function replace() {

  const modified = {
    id: 1,
    orderDate: '2023-07-14T12:00:00',
    customer: {
      id: 2
    },
    deliveryAddress: {
      name: 'Roger', //modified name
      street: 'Node street 1',
      postalCode: '7059',
      postalPlace: 'Jakobsli',
      countryCode: 'NO'
    },
    lines: [
      { id: 1, product: 'Bicycle', amount: 250 },
      { id: 2, product: 'Small guitar', amount: 150 },
      { product: 'Piano', amount: 800 } //the new line to be inserted
    ]
  };

  const order = await db.order.replace(modified, {customer: true, deliveryAddress: true, lines: true});
}

v3.10.3

23 May 14:45
Compare
Choose a tag to compare

Fix duplicate signature for those still using code generation

v3.10.2

18 May 07:31
Compare
Choose a tag to compare

RDB was renamed to orange-orm
Install from npmjs.org/package/orange-orm

v3.10.1

15 May 13:00
Compare
Choose a tag to compare

Bugfix: Adding hasOne row to existing parent throws. See #86

v3.10.0

11 May 20:44
Compare
Choose a tag to compare

Now supporting aggregates

You can count records and aggregate numerical columns. This can either be done across rows or separately for each row.
Supported functions include:

  • count
  • sum
  • min
  • max
  • avg

The aggregate function effeciently groups data together.
In this particular example , for each customer, it counts the number of lines associated with their orders and calculates the total amount of these lines.
Under the hood, it will run an sql group by customerId and customerName.

import map from './map';
const db = map.sqlite('demo.db');

getAggregates();

async function getAggregates() {
  const orders = await db.order.aggregate({
    where: x => x.orderDate.greaterThan(new Date(2022, 0, 11, 9, 24, 47)),
    customerId: x => x.customerId,
    customerName: x => x.customer.name,
    numberOfLines: x => x.count(x => x.lines.id),
    totals: x => x.sum(x => lines.amount)    
  });
}

v3.9.0

08 May 08:09
Compare
Choose a tag to compare

Possible to elevate associated column on a related table to a parent table when fetching. Example with the customer.balance column below.

  const orders = await db.order.getAll({
    balance: x => x.customer.balance
  });

v3.8.0

04 May 06:06
Compare
Choose a tag to compare

Aggregate operators

  const orders = await db.order.getAll({
    numberOfLines: x => x.count(x => x.lines.id),
    totalAmount: x => x.sum(x => x.lines.amount),
    minAmount: x => x.min(x => x.lines.amount),
    maxAmount: x => x.max(x => x.lines.amount),
    avgAmount: x => x.avg(x => x.lines.amount),
  });

v.3.7.0

13 Apr 09:50
Compare
Choose a tag to compare

What's Changed

  • mysql@3.9.4 and tedious@18.1.0 by @lroal in #79

Full Changelog: v3.6.2...v3.7.0

v3.6.2

10 Apr 10:16
Compare
Choose a tag to compare

Bug fix:
getMany with orderBy an array throws after v3.6.0

v3.6.1

02 Apr 07:10
4804c19
Compare
Choose a tag to compare

What's Changed

  • Fixed bug in filtered relations regarding incorrect alias by @lroal in #76