Хранение строк версии в базе данных postgresql для запросов диапазона - PullRequest
0 голосов
/ 07 ноября 2018

Приложение, которое я создаю, требует показа определенного контента пользователям, версия приложения которых соответствует диапазону, указанному для записи контента.

Приложение использует семантическое управление версиями (например, 1.2.3, 1.0.1, 3.7.5).

Я хочу преобразовать строковое значение 1.2.3 в целое число, чтобы я мог создать столбец диапазона, содержащий минимальную и максимальную версии для удобного запроса.

В настоящее время я использую следующую реализацию javascript, которая приводит к большим числам, а также ограничивает меня в младшей версии и версии патча 999 (последняя на самом деле мне подходит).

export function convertVersionToInt(version) {
  const parts = version.split('.')
  if (parts.length !== 3) {
    throw new Error('Received invalid version string')
  }
  parts.forEach(part => {
    if (part.length > 3) {
      throw new Error(`Version string invalid, ${part} is too large.`)
    }
  })
  const [major, minor, patch] = parts
  return parseInt(
    [major, minor.padStart(3, '0'), patch.padStart(3, '0')].join(''),
    10
  )
}

export function convertIntVersionToString(v) {
  const stringifiedNumber = String(v).padStart(7, '0')

  const length = stringifiedNumber.length
  const patch = parseInt(stringifiedNumber.substr(length - 3, 3), 10)
  const minor = parseInt(stringifiedNumber.substr(length - 6, 3), 10)
  const major = stringifiedNumber.substr(0, length - 6)
  return `${major}.${minor}.${patch}`
}

const v120 = convertVersionToInt('1.2.0')
const v120S = convertIntVersionToString(v120)
console.log(v120, v120S) // 1002000 '1.2.0'
const v1121 = convertVersionToInt('11.2.1')
const v1121S = convertIntVersionToString(v1121)
console.log(v1121, v1121S) // 11002001 '11.2.0'
const v001 = convertVersionToInt('0.0.1')
const v001s = convertIntVersionToString(v001)
console.log(v001, v001s) // 1 '0.0.1'

Я хочу знать, существует ли более эффективный способ сериализации версии semver в целое число (или другое значение, которое допускает запросы диапазона). Ограничение количества цифр для каждой части версии (основной, вспомогательный, исправление) в порядке, однако производимые числа должны правильно увеличиваться. Например. число, создаваемое 1.2.0, должно быть больше 0.0.1.

Заранее спасибо за ваш вклад!

1 Ответ

0 голосов
/ 21 апреля 2019

Если у вас есть контроль над схемой базы данных, pg-semver может быть полезен для вас: https://github.com/theory/pg-semver Он допускает тип данных semver, и вы можете использовать ожидаемые операторы сравнения для выполнения проверок вашей версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...