1.1.5 • Published 8 years ago

query-ql v1.1.5

Weekly downloads
-
License
MIT
Repository
github
Last release
8 years ago

query-ql

parse http query to sql.

use with pg (es6)

const res = pg.query(...parsePGQuery(model, query))
const total = pg.query(...parsePGCount(model, query))

parsePGQuery (model, query, pagination = true)

const model = {
  __config__: {
    tableName: 'member',
    pagination: {
      defaultRows: 20,
      maxRows: 30
    }
  },
  id: {
    type: 'number',
    name: 'id'
  },
  name: {
    type: 'string',
    name: 'name'
  },
  age: {
    type: 'number',
    name: 'age'
  },
  createTime: {
    type: 'number',
    name: '_create_time'
  },
  other: 'this property is unused'
}

const query = {
  id: ['[0, 10]', '<-1, 11, 32>'],
  name: ['%name', 'name', ''],
  age: [],
  createTime: ['[200, 1000]'],
  sorter: '-id, +name, age, -createTime',
  rows: '20',
  page: '2'
}

const sql = parsePGQuery(model, query)
// sql is array
// sql[0] is 'SELECT id, name, age, _create_time FROM member WHERE (((id >= $1 AND id <= $2) OR (id = $3 OR id = $4 OR id = $5))) AND ((name LIKE $6 OR name = $7)) AND (((_create_time >= $8 AND _create_time <= $9))) ORDER BY id DESC, name ASC, age ASC, _create_time DESC OFFSET $10 LIMIT $11',
// sql[1] is [0, 10, -1, 11, 32, '%name', 'name', 200, 1000, 20, 20]

const sql2 = parsePGQuery(mdoel, query, false)
// sql is array
// sql[0] is 'SELECT id, name, age, _create_time FROM member WHERE (((id >= $1 AND id <= $2) OR (id = $3 OR id = $4 OR id = $5))) AND ((name LIKE $6 OR name = $7)) AND (((_create_time >= $8 AND _create_time <= $9))) ORDER BY id DESC, name ASC, age ASC, _create_time DESC'
// sql[1] is [0, 10, -1, 11, 32, '%name', 'name', 200, 1000]

parsePGCount (model, query)

const sql = parsePGCount(model, query)
// sql[0] is 'SELECT COUNT(id)::INTEGER FROM member WHERE (((id >= $1 AND id <= $2) OR (id = $3 OR id = $4 OR id = $5))) AND ((name LIKE $6 OR name = $7)) AND (((_create_time >= $8 AND _create_time <= $9)))
// sql[1] is [0, 10, -1, 11, 32, '%name', 'name', 200, 1000]

parseWhere (model, query)

const model = {
  id: {
    type: 'number',
    name: 'id'
  },
  name: {
    type: 'string',
    name: 'name'
  },
  age: {
    type: 'number',
    name: 'age'
  },
  createTime: {
    type: 'number',
    name: '_create_time'
  }
}

const query = {
  id: ['[0, 10]', '<-1, 11, 32>'],
  name: ['%name', 'name', ''],
  age: [],
  createTime: ['[200, 1000]']
}

const sql = parseWhere(model, query)
// the sql is: ['(((id >= $ AND id <= $) OR (id = $ OR id = $ OR id = $))) AND ((name LIKE $ OR name = $)) AND (((_create_time >= $ AND _create_time <= $)))', [0, 10, -1, 11, 32, '%name', 'name', 200, 1000]]

parseSorters (model, query)

const model = {
  id: {
    type: 'number',
    name: 'id'
  },
  name: {
    type: 'string',
    name: 'name'
  },
  age: {
    type: 'number',
    name: 'age'
  },
  createTime: {
    type: 'number',
    name: '_create_time'
  }
}
const query = {
  sorter: '-id, +name, age, -createTime'
}
const sorter = parseSorters(model, query)
// sorter is: 'id DESC, name ASC, age ASC, _create_time DESC'

pattern

interval

?id=[0, 10] -> 0 <= id <= 10

?id=[0, 10) -> 0 <= id < 10

?id=(0, 10) -> 0 < id < 10

?id=(0, 10] -> 0 < id <= 10

?id=(0,] -> 0 < id

?id=(0,) -> 0 < id

?id=[0,] -> 0 <= id

?id=[0,) -> 0 <= id

?id=(, 10] -> id <= 10

?id=[, 10] -> id <= 10

?id=(, 10) -> id < 10

?id=[, 10) -> id < 10

equal

?id=10 -> id = 10

?name=foo -> name = 'foo'

like

?name=%foo -> name LIKE '%foo'

or

?id=<0, 1, 5> -> id = 0 OR id = 1 OR id = 5

?name=<foo, %bar> -> name = 'foo' OR name LIKE '%bar'

1.1.5

8 years ago

1.1.4

8 years ago

1.1.3

8 years ago

1.1.2

8 years ago

1.1.1

8 years ago

1.1.0

8 years ago

1.0.2

8 years ago

1.0.1

8 years ago

1.0.0

8 years ago