@terascope/data-mate 2.24.0 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/duckdb-extensions.js +8 -0
- package/dist/src/adapters/index.d.ts +1 -0
- package/dist/src/adapters/index.d.ts.map +1 -1
- package/dist/src/adapters/index.js +1 -0
- package/dist/src/adapters/index.js.map +1 -1
- package/dist/src/adapters/teal-frame-adapter/index.d.ts +62 -0
- package/dist/src/adapters/teal-frame-adapter/index.d.ts.map +1 -0
- package/dist/src/adapters/teal-frame-adapter/index.js +427 -0
- package/dist/src/adapters/teal-frame-adapter/index.js.map +1 -0
- package/dist/src/core/utils.d.ts +1 -1
- package/dist/src/core/utils.d.ts.map +1 -1
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/function-configs/boolean/isBoolean.d.ts.map +1 -1
- package/dist/src/function-configs/boolean/isBoolean.js +11 -0
- package/dist/src/function-configs/boolean/isBoolean.js.map +1 -1
- package/dist/src/function-configs/boolean/isBooleanLike.d.ts.map +1 -1
- package/dist/src/function-configs/boolean/isBooleanLike.js +21 -0
- package/dist/src/function-configs/boolean/isBooleanLike.js.map +1 -1
- package/dist/src/function-configs/boolean/sql-utils.d.ts +31 -0
- package/dist/src/function-configs/boolean/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/boolean/sql-utils.js +52 -0
- package/dist/src/function-configs/boolean/sql-utils.js.map +1 -0
- package/dist/src/function-configs/boolean/toBoolean.d.ts.map +1 -1
- package/dist/src/function-configs/boolean/toBoolean.js +20 -0
- package/dist/src/function-configs/boolean/toBoolean.js.map +1 -1
- package/dist/src/function-configs/date/addToDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/addToDate.js +13 -0
- package/dist/src/function-configs/date/addToDate.js.map +1 -1
- package/dist/src/function-configs/date/formatDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/formatDate.js +29 -0
- package/dist/src/function-configs/date/formatDate.js.map +1 -1
- package/dist/src/function-configs/date/getDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/getDate.js +13 -0
- package/dist/src/function-configs/date/getDate.js.map +1 -1
- package/dist/src/function-configs/date/getHours.d.ts.map +1 -1
- package/dist/src/function-configs/date/getHours.js +13 -0
- package/dist/src/function-configs/date/getHours.js.map +1 -1
- package/dist/src/function-configs/date/getMilliseconds.d.ts.map +1 -1
- package/dist/src/function-configs/date/getMilliseconds.js +16 -0
- package/dist/src/function-configs/date/getMilliseconds.js.map +1 -1
- package/dist/src/function-configs/date/getMinutes.d.ts.map +1 -1
- package/dist/src/function-configs/date/getMinutes.js +13 -0
- package/dist/src/function-configs/date/getMinutes.js.map +1 -1
- package/dist/src/function-configs/date/getMonth.d.ts.map +1 -1
- package/dist/src/function-configs/date/getMonth.js +16 -0
- package/dist/src/function-configs/date/getMonth.js.map +1 -1
- package/dist/src/function-configs/date/getSeconds.d.ts.map +1 -1
- package/dist/src/function-configs/date/getSeconds.js +13 -0
- package/dist/src/function-configs/date/getSeconds.js.map +1 -1
- package/dist/src/function-configs/date/getTimeBetween.d.ts.map +1 -1
- package/dist/src/function-configs/date/getTimeBetween.js +13 -0
- package/dist/src/function-configs/date/getTimeBetween.js.map +1 -1
- package/dist/src/function-configs/date/getTimezoneOffset.d.ts.map +1 -1
- package/dist/src/function-configs/date/getTimezoneOffset.js +12 -0
- package/dist/src/function-configs/date/getTimezoneOffset.js.map +1 -1
- package/dist/src/function-configs/date/getUTCDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/getUTCDate.js +14 -0
- package/dist/src/function-configs/date/getUTCDate.js.map +1 -1
- package/dist/src/function-configs/date/getUTCHours.d.ts.map +1 -1
- package/dist/src/function-configs/date/getUTCHours.js +14 -0
- package/dist/src/function-configs/date/getUTCHours.js.map +1 -1
- package/dist/src/function-configs/date/getUTCMinutes.d.ts.map +1 -1
- package/dist/src/function-configs/date/getUTCMinutes.js +14 -0
- package/dist/src/function-configs/date/getUTCMinutes.js.map +1 -1
- package/dist/src/function-configs/date/getUTCMonth.d.ts.map +1 -1
- package/dist/src/function-configs/date/getUTCMonth.js +16 -0
- package/dist/src/function-configs/date/getUTCMonth.js.map +1 -1
- package/dist/src/function-configs/date/getUTCYear.d.ts.map +1 -1
- package/dist/src/function-configs/date/getUTCYear.js +14 -0
- package/dist/src/function-configs/date/getUTCYear.js.map +1 -1
- package/dist/src/function-configs/date/getYear.d.ts.map +1 -1
- package/dist/src/function-configs/date/getYear.js +13 -0
- package/dist/src/function-configs/date/getYear.js.map +1 -1
- package/dist/src/function-configs/date/isAfter.d.ts.map +1 -1
- package/dist/src/function-configs/date/isAfter.js +9 -0
- package/dist/src/function-configs/date/isAfter.js.map +1 -1
- package/dist/src/function-configs/date/isBefore.d.ts.map +1 -1
- package/dist/src/function-configs/date/isBefore.js +7 -0
- package/dist/src/function-configs/date/isBefore.js.map +1 -1
- package/dist/src/function-configs/date/isBetween.d.ts.map +1 -1
- package/dist/src/function-configs/date/isBetween.js +11 -0
- package/dist/src/function-configs/date/isBetween.js.map +1 -1
- package/dist/src/function-configs/date/isDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/isDate.js +11 -0
- package/dist/src/function-configs/date/isDate.js.map +1 -1
- package/dist/src/function-configs/date/isEpoch.d.ts.map +1 -1
- package/dist/src/function-configs/date/isEpoch.js +12 -0
- package/dist/src/function-configs/date/isEpoch.js.map +1 -1
- package/dist/src/function-configs/date/isEpochMillis.d.ts.map +1 -1
- package/dist/src/function-configs/date/isEpochMillis.js +6 -0
- package/dist/src/function-configs/date/isEpochMillis.js.map +1 -1
- package/dist/src/function-configs/date/isFriday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isFriday.js +11 -0
- package/dist/src/function-configs/date/isFriday.js.map +1 -1
- package/dist/src/function-configs/date/isFuture.d.ts.map +1 -1
- package/dist/src/function-configs/date/isFuture.js +11 -0
- package/dist/src/function-configs/date/isFuture.js.map +1 -1
- package/dist/src/function-configs/date/isISO8601.d.ts.map +1 -1
- package/dist/src/function-configs/date/isISO8601.js +9 -0
- package/dist/src/function-configs/date/isISO8601.js.map +1 -1
- package/dist/src/function-configs/date/isLeapYear.d.ts.map +1 -1
- package/dist/src/function-configs/date/isLeapYear.js +13 -0
- package/dist/src/function-configs/date/isLeapYear.js.map +1 -1
- package/dist/src/function-configs/date/isMonday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isMonday.js +11 -0
- package/dist/src/function-configs/date/isMonday.js.map +1 -1
- package/dist/src/function-configs/date/isPast.d.ts.map +1 -1
- package/dist/src/function-configs/date/isPast.js +11 -0
- package/dist/src/function-configs/date/isPast.js.map +1 -1
- package/dist/src/function-configs/date/isSaturday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isSaturday.js +11 -0
- package/dist/src/function-configs/date/isSaturday.js.map +1 -1
- package/dist/src/function-configs/date/isSunday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isSunday.js +11 -0
- package/dist/src/function-configs/date/isSunday.js.map +1 -1
- package/dist/src/function-configs/date/isThursday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isThursday.js +11 -0
- package/dist/src/function-configs/date/isThursday.js.map +1 -1
- package/dist/src/function-configs/date/isToday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isToday.js +12 -0
- package/dist/src/function-configs/date/isToday.js.map +1 -1
- package/dist/src/function-configs/date/isTomorrow.d.ts.map +1 -1
- package/dist/src/function-configs/date/isTomorrow.js +11 -0
- package/dist/src/function-configs/date/isTomorrow.js.map +1 -1
- package/dist/src/function-configs/date/isTuesday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isTuesday.js +11 -0
- package/dist/src/function-configs/date/isTuesday.js.map +1 -1
- package/dist/src/function-configs/date/isWednesday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isWednesday.js +11 -0
- package/dist/src/function-configs/date/isWednesday.js.map +1 -1
- package/dist/src/function-configs/date/isWeekday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isWeekday.js +9 -0
- package/dist/src/function-configs/date/isWeekday.js.map +1 -1
- package/dist/src/function-configs/date/isWeekend.d.ts.map +1 -1
- package/dist/src/function-configs/date/isWeekend.js +9 -0
- package/dist/src/function-configs/date/isWeekend.js.map +1 -1
- package/dist/src/function-configs/date/isYesterday.d.ts.map +1 -1
- package/dist/src/function-configs/date/isYesterday.js +11 -0
- package/dist/src/function-configs/date/isYesterday.js.map +1 -1
- package/dist/src/function-configs/date/setDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/setDate.js +11 -0
- package/dist/src/function-configs/date/setDate.js.map +1 -1
- package/dist/src/function-configs/date/setHours.d.ts.map +1 -1
- package/dist/src/function-configs/date/setHours.js +8 -0
- package/dist/src/function-configs/date/setHours.js.map +1 -1
- package/dist/src/function-configs/date/setMilliseconds.d.ts.map +1 -1
- package/dist/src/function-configs/date/setMilliseconds.js +12 -0
- package/dist/src/function-configs/date/setMilliseconds.js.map +1 -1
- package/dist/src/function-configs/date/setMinutes.d.ts.map +1 -1
- package/dist/src/function-configs/date/setMinutes.js +8 -0
- package/dist/src/function-configs/date/setMinutes.js.map +1 -1
- package/dist/src/function-configs/date/setMonth.d.ts.map +1 -1
- package/dist/src/function-configs/date/setMonth.js +16 -0
- package/dist/src/function-configs/date/setMonth.js.map +1 -1
- package/dist/src/function-configs/date/setSeconds.d.ts.map +1 -1
- package/dist/src/function-configs/date/setSeconds.js +9 -0
- package/dist/src/function-configs/date/setSeconds.js.map +1 -1
- package/dist/src/function-configs/date/setTimezone.d.ts.map +1 -1
- package/dist/src/function-configs/date/setTimezone.js +13 -0
- package/dist/src/function-configs/date/setTimezone.js.map +1 -1
- package/dist/src/function-configs/date/setYear.d.ts.map +1 -1
- package/dist/src/function-configs/date/setYear.js +15 -0
- package/dist/src/function-configs/date/setYear.js.map +1 -1
- package/dist/src/function-configs/date/sql-utils.d.ts +89 -0
- package/dist/src/function-configs/date/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/date/sql-utils.js +198 -0
- package/dist/src/function-configs/date/sql-utils.js.map +1 -0
- package/dist/src/function-configs/date/subtractFromDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/subtractFromDate.js +10 -0
- package/dist/src/function-configs/date/subtractFromDate.js.map +1 -1
- package/dist/src/function-configs/date/toDailyDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/toDailyDate.js +11 -0
- package/dist/src/function-configs/date/toDailyDate.js.map +1 -1
- package/dist/src/function-configs/date/toDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/toDate.js +17 -0
- package/dist/src/function-configs/date/toDate.js.map +1 -1
- package/dist/src/function-configs/date/toHourlyDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/toHourlyDate.js +11 -0
- package/dist/src/function-configs/date/toHourlyDate.js.map +1 -1
- package/dist/src/function-configs/date/toMonthlyDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/toMonthlyDate.js +11 -0
- package/dist/src/function-configs/date/toMonthlyDate.js.map +1 -1
- package/dist/src/function-configs/date/toTimeZone.d.ts.map +1 -1
- package/dist/src/function-configs/date/toTimeZone.js +13 -0
- package/dist/src/function-configs/date/toTimeZone.js.map +1 -1
- package/dist/src/function-configs/date/toTimeZoneUsingLocation.d.ts.map +1 -1
- package/dist/src/function-configs/date/toTimeZoneUsingLocation.js +22 -0
- package/dist/src/function-configs/date/toTimeZoneUsingLocation.js.map +1 -1
- package/dist/src/function-configs/date/toYearlyDate.d.ts.map +1 -1
- package/dist/src/function-configs/date/toYearlyDate.js +11 -0
- package/dist/src/function-configs/date/toYearlyDate.js.map +1 -1
- package/dist/src/function-configs/geo/geoContains.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoContains.js +11 -0
- package/dist/src/function-configs/geo/geoContains.js.map +1 -1
- package/dist/src/function-configs/geo/geoContainsPoint.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoContainsPoint.js +11 -0
- package/dist/src/function-configs/geo/geoContainsPoint.js.map +1 -1
- package/dist/src/function-configs/geo/geoDisjoint.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoDisjoint.js +7 -0
- package/dist/src/function-configs/geo/geoDisjoint.js.map +1 -1
- package/dist/src/function-configs/geo/geoIntersects.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoIntersects.js +9 -0
- package/dist/src/function-configs/geo/geoIntersects.js.map +1 -1
- package/dist/src/function-configs/geo/geoPointWithinRange.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoPointWithinRange.js +28 -0
- package/dist/src/function-configs/geo/geoPointWithinRange.js.map +1 -1
- package/dist/src/function-configs/geo/geoRelation.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoRelation.js +13 -0
- package/dist/src/function-configs/geo/geoRelation.js.map +1 -1
- package/dist/src/function-configs/geo/geoWithin.d.ts.map +1 -1
- package/dist/src/function-configs/geo/geoWithin.js +7 -0
- package/dist/src/function-configs/geo/geoWithin.js.map +1 -1
- package/dist/src/function-configs/geo/inGeoBoundingBox.d.ts.map +1 -1
- package/dist/src/function-configs/geo/inGeoBoundingBox.js +24 -1
- package/dist/src/function-configs/geo/inGeoBoundingBox.js.map +1 -1
- package/dist/src/function-configs/geo/isGeoJSON.d.ts.map +1 -1
- package/dist/src/function-configs/geo/isGeoJSON.js +6 -0
- package/dist/src/function-configs/geo/isGeoJSON.js.map +1 -1
- package/dist/src/function-configs/geo/isGeoPoint.d.ts.map +1 -1
- package/dist/src/function-configs/geo/isGeoPoint.js +13 -0
- package/dist/src/function-configs/geo/isGeoPoint.js.map +1 -1
- package/dist/src/function-configs/geo/isGeoShapeMultiPolygon.d.ts.map +1 -1
- package/dist/src/function-configs/geo/isGeoShapeMultiPolygon.js +6 -0
- package/dist/src/function-configs/geo/isGeoShapeMultiPolygon.js.map +1 -1
- package/dist/src/function-configs/geo/isGeoShapePoint.d.ts.map +1 -1
- package/dist/src/function-configs/geo/isGeoShapePoint.js +6 -0
- package/dist/src/function-configs/geo/isGeoShapePoint.js.map +1 -1
- package/dist/src/function-configs/geo/isGeoShapePolygon.d.ts.map +1 -1
- package/dist/src/function-configs/geo/isGeoShapePolygon.js +6 -0
- package/dist/src/function-configs/geo/isGeoShapePolygon.js.map +1 -1
- package/dist/src/function-configs/geo/sql-utils.d.ts +116 -0
- package/dist/src/function-configs/geo/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/geo/sql-utils.js +179 -0
- package/dist/src/function-configs/geo/sql-utils.js.map +1 -0
- package/dist/src/function-configs/interfaces.d.ts +102 -0
- package/dist/src/function-configs/interfaces.d.ts.map +1 -1
- package/dist/src/function-configs/interfaces.js.map +1 -1
- package/dist/src/function-configs/ip/extractMappedIPv4.d.ts.map +1 -1
- package/dist/src/function-configs/ip/extractMappedIPv4.js +11 -0
- package/dist/src/function-configs/ip/extractMappedIPv4.js.map +1 -1
- package/dist/src/function-configs/ip/getCIDRBroadcast.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getCIDRBroadcast.js +7 -0
- package/dist/src/function-configs/ip/getCIDRBroadcast.js.map +1 -1
- package/dist/src/function-configs/ip/getCIDRMax.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getCIDRMax.js +10 -0
- package/dist/src/function-configs/ip/getCIDRMax.js.map +1 -1
- package/dist/src/function-configs/ip/getCIDRMin.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getCIDRMin.js +9 -0
- package/dist/src/function-configs/ip/getCIDRMin.js.map +1 -1
- package/dist/src/function-configs/ip/getCIDRNetwork.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getCIDRNetwork.js +7 -0
- package/dist/src/function-configs/ip/getCIDRNetwork.js.map +1 -1
- package/dist/src/function-configs/ip/getFirstIpInCIDR.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getFirstIpInCIDR.js +11 -0
- package/dist/src/function-configs/ip/getFirstIpInCIDR.js.map +1 -1
- package/dist/src/function-configs/ip/getFirstUsableIPInCIDR.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getFirstUsableIPInCIDR.js +14 -0
- package/dist/src/function-configs/ip/getFirstUsableIPInCIDR.js.map +1 -1
- package/dist/src/function-configs/ip/getLastIpInCIDR.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getLastIpInCIDR.js +8 -0
- package/dist/src/function-configs/ip/getLastIpInCIDR.js.map +1 -1
- package/dist/src/function-configs/ip/getLastUsableIPInCIDR.d.ts.map +1 -1
- package/dist/src/function-configs/ip/getLastUsableIPInCIDR.js +13 -0
- package/dist/src/function-configs/ip/getLastUsableIPInCIDR.js.map +1 -1
- package/dist/src/function-configs/ip/inIPRange.d.ts.map +1 -1
- package/dist/src/function-configs/ip/inIPRange.js +15 -0
- package/dist/src/function-configs/ip/inIPRange.js.map +1 -1
- package/dist/src/function-configs/ip/intToIP.d.ts.map +1 -1
- package/dist/src/function-configs/ip/intToIP.js +25 -0
- package/dist/src/function-configs/ip/intToIP.js.map +1 -1
- package/dist/src/function-configs/ip/ipToInt.d.ts.map +1 -1
- package/dist/src/function-configs/ip/ipToInt.js +12 -0
- package/dist/src/function-configs/ip/ipToInt.js.map +1 -1
- package/dist/src/function-configs/ip/isCIDR.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isCIDR.js +8 -0
- package/dist/src/function-configs/ip/isCIDR.js.map +1 -1
- package/dist/src/function-configs/ip/isIP.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isIP.js +10 -0
- package/dist/src/function-configs/ip/isIP.js.map +1 -1
- package/dist/src/function-configs/ip/isIPv4.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isIPv4.js +9 -0
- package/dist/src/function-configs/ip/isIPv4.js.map +1 -1
- package/dist/src/function-configs/ip/isIPv6.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isIPv6.js +10 -0
- package/dist/src/function-configs/ip/isIPv6.js.map +1 -1
- package/dist/src/function-configs/ip/isMappedIPv4.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isMappedIPv4.js +10 -0
- package/dist/src/function-configs/ip/isMappedIPv4.js.map +1 -1
- package/dist/src/function-configs/ip/isNonRoutableIP.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isNonRoutableIP.js +8 -0
- package/dist/src/function-configs/ip/isNonRoutableIP.js.map +1 -1
- package/dist/src/function-configs/ip/isRoutableIP.d.ts.map +1 -1
- package/dist/src/function-configs/ip/isRoutableIP.js +12 -0
- package/dist/src/function-configs/ip/isRoutableIP.js.map +1 -1
- package/dist/src/function-configs/ip/reverseIP.d.ts.map +1 -1
- package/dist/src/function-configs/ip/reverseIP.js +13 -0
- package/dist/src/function-configs/ip/reverseIP.js.map +1 -1
- package/dist/src/function-configs/ip/sql-utils.d.ts +116 -0
- package/dist/src/function-configs/ip/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/ip/sql-utils.js +187 -0
- package/dist/src/function-configs/ip/sql-utils.js.map +1 -0
- package/dist/src/function-configs/ip/toCIDR.d.ts.map +1 -1
- package/dist/src/function-configs/ip/toCIDR.js +19 -0
- package/dist/src/function-configs/ip/toCIDR.js.map +1 -1
- package/dist/src/function-configs/json/setDefault.d.ts.map +1 -1
- package/dist/src/function-configs/json/setDefault.js +17 -0
- package/dist/src/function-configs/json/setDefault.js.map +1 -1
- package/dist/src/function-configs/json/sql-utils.d.ts +20 -0
- package/dist/src/function-configs/json/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/json/sql-utils.js +26 -0
- package/dist/src/function-configs/json/sql-utils.js.map +1 -0
- package/dist/src/function-configs/json/toJSON.d.ts.map +1 -1
- package/dist/src/function-configs/json/toJSON.js +13 -0
- package/dist/src/function-configs/json/toJSON.js.map +1 -1
- package/dist/src/function-configs/numeric/abs.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/abs.js +5 -0
- package/dist/src/function-configs/numeric/abs.js.map +1 -1
- package/dist/src/function-configs/numeric/acos.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/acos.js +12 -0
- package/dist/src/function-configs/numeric/acos.js.map +1 -1
- package/dist/src/function-configs/numeric/acosh.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/acosh.js +12 -0
- package/dist/src/function-configs/numeric/acosh.js.map +1 -1
- package/dist/src/function-configs/numeric/add.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/add.js +12 -0
- package/dist/src/function-configs/numeric/add.js.map +1 -1
- package/dist/src/function-configs/numeric/addValues.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/addValues.js +9 -0
- package/dist/src/function-configs/numeric/addValues.js.map +1 -1
- package/dist/src/function-configs/numeric/asin.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/asin.js +12 -0
- package/dist/src/function-configs/numeric/asin.js.map +1 -1
- package/dist/src/function-configs/numeric/asinh.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/asinh.js +8 -0
- package/dist/src/function-configs/numeric/asinh.js.map +1 -1
- package/dist/src/function-configs/numeric/atan.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/atan.js +8 -0
- package/dist/src/function-configs/numeric/atan.js.map +1 -1
- package/dist/src/function-configs/numeric/atan2.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/atan2.js +16 -0
- package/dist/src/function-configs/numeric/atan2.js.map +1 -1
- package/dist/src/function-configs/numeric/atanh.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/atanh.js +13 -0
- package/dist/src/function-configs/numeric/atanh.js.map +1 -1
- package/dist/src/function-configs/numeric/cbrt.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/cbrt.js +8 -0
- package/dist/src/function-configs/numeric/cbrt.js.map +1 -1
- package/dist/src/function-configs/numeric/ceil.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/ceil.js +13 -0
- package/dist/src/function-configs/numeric/ceil.js.map +1 -1
- package/dist/src/function-configs/numeric/clz32.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/clz32.js +16 -0
- package/dist/src/function-configs/numeric/clz32.js.map +1 -1
- package/dist/src/function-configs/numeric/cos.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/cos.js +8 -0
- package/dist/src/function-configs/numeric/cos.js.map +1 -1
- package/dist/src/function-configs/numeric/cosh.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/cosh.js +8 -0
- package/dist/src/function-configs/numeric/cosh.js.map +1 -1
- package/dist/src/function-configs/numeric/divide.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/divide.js +12 -0
- package/dist/src/function-configs/numeric/divide.js.map +1 -1
- package/dist/src/function-configs/numeric/divideValues.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/divideValues.js +6 -0
- package/dist/src/function-configs/numeric/divideValues.js.map +1 -1
- package/dist/src/function-configs/numeric/exp.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/exp.js +8 -0
- package/dist/src/function-configs/numeric/exp.js.map +1 -1
- package/dist/src/function-configs/numeric/floor.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/floor.js +13 -0
- package/dist/src/function-configs/numeric/floor.js.map +1 -1
- package/dist/src/function-configs/numeric/fround.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/fround.js +5 -0
- package/dist/src/function-configs/numeric/fround.js.map +1 -1
- package/dist/src/function-configs/numeric/hypot.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/hypot.js +14 -0
- package/dist/src/function-configs/numeric/hypot.js.map +1 -1
- package/dist/src/function-configs/numeric/inNumberRange.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/inNumberRange.js +20 -0
- package/dist/src/function-configs/numeric/inNumberRange.js.map +1 -1
- package/dist/src/function-configs/numeric/isEven.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/isEven.js +4 -0
- package/dist/src/function-configs/numeric/isEven.js.map +1 -1
- package/dist/src/function-configs/numeric/isGreaterThan.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/isGreaterThan.js +6 -0
- package/dist/src/function-configs/numeric/isGreaterThan.js.map +1 -1
- package/dist/src/function-configs/numeric/isGreaterThanOrEqualTo.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/isGreaterThanOrEqualTo.js +6 -0
- package/dist/src/function-configs/numeric/isGreaterThanOrEqualTo.js.map +1 -1
- package/dist/src/function-configs/numeric/isLessThan.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/isLessThan.js +6 -0
- package/dist/src/function-configs/numeric/isLessThan.js.map +1 -1
- package/dist/src/function-configs/numeric/isLessThanOrEqualTo.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/isLessThanOrEqualTo.js +6 -0
- package/dist/src/function-configs/numeric/isLessThanOrEqualTo.js.map +1 -1
- package/dist/src/function-configs/numeric/isOdd.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/isOdd.js +9 -0
- package/dist/src/function-configs/numeric/isOdd.js.map +1 -1
- package/dist/src/function-configs/numeric/log.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/log.js +13 -0
- package/dist/src/function-configs/numeric/log.js.map +1 -1
- package/dist/src/function-configs/numeric/log10.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/log10.js +13 -0
- package/dist/src/function-configs/numeric/log10.js.map +1 -1
- package/dist/src/function-configs/numeric/log2.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/log2.js +13 -0
- package/dist/src/function-configs/numeric/log2.js.map +1 -1
- package/dist/src/function-configs/numeric/maxValues.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/maxValues.js +6 -0
- package/dist/src/function-configs/numeric/maxValues.js.map +1 -1
- package/dist/src/function-configs/numeric/minValues.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/minValues.js +6 -0
- package/dist/src/function-configs/numeric/minValues.js.map +1 -1
- package/dist/src/function-configs/numeric/modulus.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/modulus.js +9 -0
- package/dist/src/function-configs/numeric/modulus.js.map +1 -1
- package/dist/src/function-configs/numeric/multiply.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/multiply.js +12 -0
- package/dist/src/function-configs/numeric/multiply.js.map +1 -1
- package/dist/src/function-configs/numeric/multiplyValues.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/multiplyValues.js +6 -0
- package/dist/src/function-configs/numeric/multiplyValues.js.map +1 -1
- package/dist/src/function-configs/numeric/pow.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/pow.js +7 -0
- package/dist/src/function-configs/numeric/pow.js.map +1 -1
- package/dist/src/function-configs/numeric/round.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/round.js +13 -0
- package/dist/src/function-configs/numeric/round.js.map +1 -1
- package/dist/src/function-configs/numeric/setPrecision.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/setPrecision.js +26 -0
- package/dist/src/function-configs/numeric/setPrecision.js.map +1 -1
- package/dist/src/function-configs/numeric/sign.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/sign.js +5 -0
- package/dist/src/function-configs/numeric/sign.js.map +1 -1
- package/dist/src/function-configs/numeric/sin.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/sin.js +8 -0
- package/dist/src/function-configs/numeric/sin.js.map +1 -1
- package/dist/src/function-configs/numeric/sinh.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/sinh.js +8 -0
- package/dist/src/function-configs/numeric/sinh.js.map +1 -1
- package/dist/src/function-configs/numeric/sql-utils.d.ts +54 -0
- package/dist/src/function-configs/numeric/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/numeric/sql-utils.js +76 -0
- package/dist/src/function-configs/numeric/sql-utils.js.map +1 -0
- package/dist/src/function-configs/numeric/sqrt.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/sqrt.js +10 -0
- package/dist/src/function-configs/numeric/sqrt.js.map +1 -1
- package/dist/src/function-configs/numeric/subtract.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/subtract.js +12 -0
- package/dist/src/function-configs/numeric/subtract.js.map +1 -1
- package/dist/src/function-configs/numeric/subtractValues.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/subtractValues.js +9 -0
- package/dist/src/function-configs/numeric/subtractValues.js.map +1 -1
- package/dist/src/function-configs/numeric/tan.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/tan.js +8 -0
- package/dist/src/function-configs/numeric/tan.js.map +1 -1
- package/dist/src/function-configs/numeric/tanh.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/tanh.js +8 -0
- package/dist/src/function-configs/numeric/tanh.js.map +1 -1
- package/dist/src/function-configs/numeric/toCelsius.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/toCelsius.js +14 -0
- package/dist/src/function-configs/numeric/toCelsius.js.map +1 -1
- package/dist/src/function-configs/numeric/toFahrenheit.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/toFahrenheit.js +14 -0
- package/dist/src/function-configs/numeric/toFahrenheit.js.map +1 -1
- package/dist/src/function-configs/numeric/toNumber.d.ts.map +1 -1
- package/dist/src/function-configs/numeric/toNumber.js +42 -0
- package/dist/src/function-configs/numeric/toNumber.js.map +1 -1
- package/dist/src/function-configs/object/equals.d.ts.map +1 -1
- package/dist/src/function-configs/object/equals.js +14 -0
- package/dist/src/function-configs/object/equals.js.map +1 -1
- package/dist/src/function-configs/object/isEmpty.d.ts.map +1 -1
- package/dist/src/function-configs/object/isEmpty.js +26 -0
- package/dist/src/function-configs/object/isEmpty.js.map +1 -1
- package/dist/src/function-configs/object/lookup.d.ts.map +1 -1
- package/dist/src/function-configs/object/lookup.js +8 -0
- package/dist/src/function-configs/object/lookup.js.map +1 -1
- package/dist/src/function-configs/object/sql-utils.d.ts +5 -0
- package/dist/src/function-configs/object/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/object/sql-utils.js +96 -0
- package/dist/src/function-configs/object/sql-utils.js.map +1 -0
- package/dist/src/function-configs/sql-helpers.d.ts +115 -0
- package/dist/src/function-configs/sql-helpers.d.ts.map +1 -0
- package/dist/src/function-configs/sql-helpers.js +169 -0
- package/dist/src/function-configs/sql-helpers.js.map +1 -0
- package/dist/src/function-configs/string/contains.d.ts.map +1 -1
- package/dist/src/function-configs/string/contains.js +5 -0
- package/dist/src/function-configs/string/contains.js.map +1 -1
- package/dist/src/function-configs/string/createID.d.ts.map +1 -1
- package/dist/src/function-configs/string/createID.js +16 -0
- package/dist/src/function-configs/string/createID.js.map +1 -1
- package/dist/src/function-configs/string/decodeBase64.d.ts.map +1 -1
- package/dist/src/function-configs/string/decodeBase64.js +14 -0
- package/dist/src/function-configs/string/decodeBase64.js.map +1 -1
- package/dist/src/function-configs/string/decodeHex.d.ts.map +1 -1
- package/dist/src/function-configs/string/decodeHex.js +13 -0
- package/dist/src/function-configs/string/decodeHex.js.map +1 -1
- package/dist/src/function-configs/string/decodeURL.d.ts.map +1 -1
- package/dist/src/function-configs/string/decodeURL.js +7 -0
- package/dist/src/function-configs/string/decodeURL.js.map +1 -1
- package/dist/src/function-configs/string/encode.d.ts.map +1 -1
- package/dist/src/function-configs/string/encode.js +14 -0
- package/dist/src/function-configs/string/encode.js.map +1 -1
- package/dist/src/function-configs/string/encodeBase64.d.ts.map +1 -1
- package/dist/src/function-configs/string/encodeBase64.js +10 -0
- package/dist/src/function-configs/string/encodeBase64.js.map +1 -1
- package/dist/src/function-configs/string/encodeHex.d.ts.map +1 -1
- package/dist/src/function-configs/string/encodeHex.js +9 -0
- package/dist/src/function-configs/string/encodeHex.js.map +1 -1
- package/dist/src/function-configs/string/encodeSHA.d.ts.map +1 -1
- package/dist/src/function-configs/string/encodeSHA.js +11 -0
- package/dist/src/function-configs/string/encodeSHA.js.map +1 -1
- package/dist/src/function-configs/string/encodeSHA1.d.ts.map +1 -1
- package/dist/src/function-configs/string/encodeSHA1.js +10 -0
- package/dist/src/function-configs/string/encodeSHA1.js.map +1 -1
- package/dist/src/function-configs/string/encodeURL.d.ts.map +1 -1
- package/dist/src/function-configs/string/encodeURL.js +7 -0
- package/dist/src/function-configs/string/encodeURL.js.map +1 -1
- package/dist/src/function-configs/string/endsWith.d.ts.map +1 -1
- package/dist/src/function-configs/string/endsWith.js +5 -0
- package/dist/src/function-configs/string/endsWith.js.map +1 -1
- package/dist/src/function-configs/string/entropy.d.ts.map +1 -1
- package/dist/src/function-configs/string/entropy.js +17 -0
- package/dist/src/function-configs/string/entropy.js.map +1 -1
- package/dist/src/function-configs/string/extract.d.ts.map +1 -1
- package/dist/src/function-configs/string/extract.js +48 -1
- package/dist/src/function-configs/string/extract.js.map +1 -1
- package/dist/src/function-configs/string/isAlpha.d.ts.map +1 -1
- package/dist/src/function-configs/string/isAlpha.js +10 -0
- package/dist/src/function-configs/string/isAlpha.js.map +1 -1
- package/dist/src/function-configs/string/isAlphaNumeric.d.ts.map +1 -1
- package/dist/src/function-configs/string/isAlphaNumeric.js +6 -0
- package/dist/src/function-configs/string/isAlphaNumeric.js.map +1 -1
- package/dist/src/function-configs/string/isBase64.d.ts.map +1 -1
- package/dist/src/function-configs/string/isBase64.js +13 -0
- package/dist/src/function-configs/string/isBase64.js.map +1 -1
- package/dist/src/function-configs/string/isCountryCode.d.ts.map +1 -1
- package/dist/src/function-configs/string/isCountryCode.js +16 -0
- package/dist/src/function-configs/string/isCountryCode.js.map +1 -1
- package/dist/src/function-configs/string/isEmail.d.ts.map +1 -1
- package/dist/src/function-configs/string/isEmail.js +10 -0
- package/dist/src/function-configs/string/isEmail.js.map +1 -1
- package/dist/src/function-configs/string/isFQDN.d.ts.map +1 -1
- package/dist/src/function-configs/string/isFQDN.js +9 -0
- package/dist/src/function-configs/string/isFQDN.js.map +1 -1
- package/dist/src/function-configs/string/isHash.d.ts.map +1 -1
- package/dist/src/function-configs/string/isHash.js +9 -0
- package/dist/src/function-configs/string/isHash.js.map +1 -1
- package/dist/src/function-configs/string/isLength.d.ts.map +1 -1
- package/dist/src/function-configs/string/isLength.js +23 -0
- package/dist/src/function-configs/string/isLength.js.map +1 -1
- package/dist/src/function-configs/string/isMACAddress.d.ts.map +1 -1
- package/dist/src/function-configs/string/isMACAddress.js +17 -0
- package/dist/src/function-configs/string/isMACAddress.js.map +1 -1
- package/dist/src/function-configs/string/isMIMEType.d.ts.map +1 -1
- package/dist/src/function-configs/string/isMIMEType.js +10 -0
- package/dist/src/function-configs/string/isMIMEType.js.map +1 -1
- package/dist/src/function-configs/string/isPhoneNumberLike.d.ts.map +1 -1
- package/dist/src/function-configs/string/isPhoneNumberLike.js +14 -0
- package/dist/src/function-configs/string/isPhoneNumberLike.js.map +1 -1
- package/dist/src/function-configs/string/isPort.d.ts.map +1 -1
- package/dist/src/function-configs/string/isPort.js +12 -0
- package/dist/src/function-configs/string/isPort.js.map +1 -1
- package/dist/src/function-configs/string/isPostalCode.d.ts.map +1 -1
- package/dist/src/function-configs/string/isPostalCode.js +12 -0
- package/dist/src/function-configs/string/isPostalCode.js.map +1 -1
- package/dist/src/function-configs/string/isString.d.ts.map +1 -1
- package/dist/src/function-configs/string/isString.js +7 -0
- package/dist/src/function-configs/string/isString.js.map +1 -1
- package/dist/src/function-configs/string/isUUID.d.ts.map +1 -1
- package/dist/src/function-configs/string/isUUID.js +9 -0
- package/dist/src/function-configs/string/isUUID.js.map +1 -1
- package/dist/src/function-configs/string/join.d.ts.map +1 -1
- package/dist/src/function-configs/string/join.js +17 -0
- package/dist/src/function-configs/string/join.js.map +1 -1
- package/dist/src/function-configs/string/postal-code-utils.d.ts +13 -0
- package/dist/src/function-configs/string/postal-code-utils.d.ts.map +1 -0
- package/dist/src/function-configs/string/postal-code-utils.js +160 -0
- package/dist/src/function-configs/string/postal-code-utils.js.map +1 -0
- package/dist/src/function-configs/string/replaceLiteral.d.ts.map +1 -1
- package/dist/src/function-configs/string/replaceLiteral.js +22 -0
- package/dist/src/function-configs/string/replaceLiteral.js.map +1 -1
- package/dist/src/function-configs/string/replaceRegex.d.ts.map +1 -1
- package/dist/src/function-configs/string/replaceRegex.js +34 -0
- package/dist/src/function-configs/string/replaceRegex.js.map +1 -1
- package/dist/src/function-configs/string/reverse.d.ts.map +1 -1
- package/dist/src/function-configs/string/reverse.js +16 -0
- package/dist/src/function-configs/string/reverse.js.map +1 -1
- package/dist/src/function-configs/string/split.d.ts.map +1 -1
- package/dist/src/function-configs/string/split.js +13 -0
- package/dist/src/function-configs/string/split.js.map +1 -1
- package/dist/src/function-configs/string/sql-regex-utils.d.ts +91 -0
- package/dist/src/function-configs/string/sql-regex-utils.d.ts.map +1 -0
- package/dist/src/function-configs/string/sql-regex-utils.js +123 -0
- package/dist/src/function-configs/string/sql-regex-utils.js.map +1 -0
- package/dist/src/function-configs/string/sql-utils.d.ts +191 -0
- package/dist/src/function-configs/string/sql-utils.d.ts.map +1 -0
- package/dist/src/function-configs/string/sql-utils.js +321 -0
- package/dist/src/function-configs/string/sql-utils.js.map +1 -0
- package/dist/src/function-configs/string/sql-validator-utils.d.ts +49 -0
- package/dist/src/function-configs/string/sql-validator-utils.d.ts.map +1 -0
- package/dist/src/function-configs/string/sql-validator-utils.js +327 -0
- package/dist/src/function-configs/string/sql-validator-utils.js.map +1 -0
- package/dist/src/function-configs/string/startsWith.d.ts.map +1 -1
- package/dist/src/function-configs/string/startsWith.js +5 -0
- package/dist/src/function-configs/string/startsWith.js.map +1 -1
- package/dist/src/function-configs/string/toCamelCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toCamelCase.js +18 -0
- package/dist/src/function-configs/string/toCamelCase.js.map +1 -1
- package/dist/src/function-configs/string/toKebabCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toKebabCase.js +18 -0
- package/dist/src/function-configs/string/toKebabCase.js.map +1 -1
- package/dist/src/function-configs/string/toLowerCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toLowerCase.js +13 -0
- package/dist/src/function-configs/string/toLowerCase.js.map +1 -1
- package/dist/src/function-configs/string/toPascalCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toPascalCase.js +18 -0
- package/dist/src/function-configs/string/toPascalCase.js.map +1 -1
- package/dist/src/function-configs/string/toSnakeCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toSnakeCase.js +18 -0
- package/dist/src/function-configs/string/toSnakeCase.js.map +1 -1
- package/dist/src/function-configs/string/toString.d.ts.map +1 -1
- package/dist/src/function-configs/string/toString.js +42 -0
- package/dist/src/function-configs/string/toString.js.map +1 -1
- package/dist/src/function-configs/string/toTitleCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toTitleCase.js +19 -0
- package/dist/src/function-configs/string/toTitleCase.js.map +1 -1
- package/dist/src/function-configs/string/toUpperCase.d.ts.map +1 -1
- package/dist/src/function-configs/string/toUpperCase.js +13 -0
- package/dist/src/function-configs/string/toUpperCase.js.map +1 -1
- package/dist/src/function-configs/string/trim.d.ts.map +1 -1
- package/dist/src/function-configs/string/trim.js +11 -0
- package/dist/src/function-configs/string/trim.js.map +1 -1
- package/dist/src/function-configs/string/trimEnd.d.ts.map +1 -1
- package/dist/src/function-configs/string/trimEnd.js +11 -0
- package/dist/src/function-configs/string/trimEnd.js.map +1 -1
- package/dist/src/function-configs/string/trimStart.d.ts.map +1 -1
- package/dist/src/function-configs/string/trimStart.js +11 -0
- package/dist/src/function-configs/string/trimStart.js.map +1 -1
- package/dist/src/function-configs/string/truncate.d.ts.map +1 -1
- package/dist/src/function-configs/string/truncate.js +15 -0
- package/dist/src/function-configs/string/truncate.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/teal-frame/DuckContext.d.ts +105 -0
- package/dist/src/teal-frame/DuckContext.d.ts.map +1 -0
- package/dist/src/teal-frame/DuckContext.js +244 -0
- package/dist/src/teal-frame/DuckContext.js.map +1 -0
- package/dist/src/teal-frame/TealFrame.d.ts +371 -0
- package/dist/src/teal-frame/TealFrame.d.ts.map +1 -0
- package/dist/src/teal-frame/TealFrame.js +575 -0
- package/dist/src/teal-frame/TealFrame.js.map +1 -0
- package/dist/src/teal-frame/append.d.ts +45 -0
- package/dist/src/teal-frame/append.d.ts.map +1 -0
- package/dist/src/teal-frame/append.js +136 -0
- package/dist/src/teal-frame/append.js.map +1 -0
- package/dist/src/teal-frame/clauses.d.ts +22 -0
- package/dist/src/teal-frame/clauses.d.ts.map +1 -0
- package/dist/src/teal-frame/clauses.js +41 -0
- package/dist/src/teal-frame/clauses.js.map +1 -0
- package/dist/src/teal-frame/database.d.ts +46 -0
- package/dist/src/teal-frame/database.d.ts.map +1 -0
- package/dist/src/teal-frame/database.js +91 -0
- package/dist/src/teal-frame/database.js.map +1 -0
- package/dist/src/teal-frame/date-value.d.ts +55 -0
- package/dist/src/teal-frame/date-value.d.ts.map +1 -0
- package/dist/src/teal-frame/date-value.js +106 -0
- package/dist/src/teal-frame/date-value.js.map +1 -0
- package/dist/src/teal-frame/deep-select.d.ts +8 -0
- package/dist/src/teal-frame/deep-select.d.ts.map +1 -0
- package/dist/src/teal-frame/deep-select.js +125 -0
- package/dist/src/teal-frame/deep-select.js.map +1 -0
- package/dist/src/teal-frame/duck-values.d.ts +37 -0
- package/dist/src/teal-frame/duck-values.d.ts.map +1 -0
- package/dist/src/teal-frame/duck-values.js +173 -0
- package/dist/src/teal-frame/duck-values.js.map +1 -0
- package/dist/src/teal-frame/errors.d.ts +38 -0
- package/dist/src/teal-frame/errors.d.ts.map +1 -0
- package/dist/src/teal-frame/errors.js +63 -0
- package/dist/src/teal-frame/errors.js.map +1 -0
- package/dist/src/teal-frame/expand-values.d.ts +29 -0
- package/dist/src/teal-frame/expand-values.d.ts.map +1 -0
- package/dist/src/teal-frame/expand-values.js +53 -0
- package/dist/src/teal-frame/expand-values.js.map +1 -0
- package/dist/src/teal-frame/export-json.d.ts +58 -0
- package/dist/src/teal-frame/export-json.d.ts.map +1 -0
- package/dist/src/teal-frame/export-json.js +409 -0
- package/dist/src/teal-frame/export-json.js.map +1 -0
- package/dist/src/teal-frame/extension-tools.d.ts +40 -0
- package/dist/src/teal-frame/extension-tools.d.ts.map +1 -0
- package/dist/src/teal-frame/extension-tools.js +115 -0
- package/dist/src/teal-frame/extension-tools.js.map +1 -0
- package/dist/src/teal-frame/extensions-cli.d.ts +2 -0
- package/dist/src/teal-frame/extensions-cli.d.ts.map +1 -0
- package/dist/src/teal-frame/extensions-cli.js +56 -0
- package/dist/src/teal-frame/extensions-cli.js.map +1 -0
- package/dist/src/teal-frame/extensions.d.ts +53 -0
- package/dist/src/teal-frame/extensions.d.ts.map +1 -0
- package/dist/src/teal-frame/extensions.js +110 -0
- package/dist/src/teal-frame/extensions.js.map +1 -0
- package/dist/src/teal-frame/index.d.ts +23 -0
- package/dist/src/teal-frame/index.d.ts.map +1 -0
- package/dist/src/teal-frame/index.js +23 -0
- package/dist/src/teal-frame/index.js.map +1 -0
- package/dist/src/teal-frame/interfaces.d.ts +186 -0
- package/dist/src/teal-frame/interfaces.d.ts.map +1 -0
- package/dist/src/teal-frame/interfaces.js +2 -0
- package/dist/src/teal-frame/interfaces.js.map +1 -0
- package/dist/src/teal-frame/line-stream.d.ts +10 -0
- package/dist/src/teal-frame/line-stream.d.ts.map +1 -0
- package/dist/src/teal-frame/line-stream.js +35 -0
- package/dist/src/teal-frame/line-stream.js.map +1 -0
- package/dist/src/teal-frame/order-safety.d.ts +15 -0
- package/dist/src/teal-frame/order-safety.d.ts.map +1 -0
- package/dist/src/teal-frame/order-safety.js +21 -0
- package/dist/src/teal-frame/order-safety.js.map +1 -0
- package/dist/src/teal-frame/output.d.ts +18 -0
- package/dist/src/teal-frame/output.d.ts.map +1 -0
- package/dist/src/teal-frame/output.js +63 -0
- package/dist/src/teal-frame/output.js.map +1 -0
- package/dist/src/teal-frame/parquet-columns.d.ts +15 -0
- package/dist/src/teal-frame/parquet-columns.d.ts.map +1 -0
- package/dist/src/teal-frame/parquet-columns.js +45 -0
- package/dist/src/teal-frame/parquet-columns.js.map +1 -0
- package/dist/src/teal-frame/plain-values.d.ts +30 -0
- package/dist/src/teal-frame/plain-values.d.ts.map +1 -0
- package/dist/src/teal-frame/plain-values.js +69 -0
- package/dist/src/teal-frame/plain-values.js.map +1 -0
- package/dist/src/teal-frame/row-shape.d.ts +21 -0
- package/dist/src/teal-frame/row-shape.d.ts.map +1 -0
- package/dist/src/teal-frame/row-shape.js +94 -0
- package/dist/src/teal-frame/row-shape.js.map +1 -0
- package/dist/src/teal-frame/scalar-function.d.ts +66 -0
- package/dist/src/teal-frame/scalar-function.d.ts.map +1 -0
- package/dist/src/teal-frame/scalar-function.js +75 -0
- package/dist/src/teal-frame/scalar-function.js.map +1 -0
- package/dist/src/teal-frame/schema-check.d.ts +43 -0
- package/dist/src/teal-frame/schema-check.d.ts.map +1 -0
- package/dist/src/teal-frame/schema-check.js +66 -0
- package/dist/src/teal-frame/schema-check.js.map +1 -0
- package/dist/src/teal-frame/sources.d.ts +14 -0
- package/dist/src/teal-frame/sources.d.ts.map +1 -0
- package/dist/src/teal-frame/sources.js +28 -0
- package/dist/src/teal-frame/sources.js.map +1 -0
- package/dist/src/teal-frame/table.d.ts +19 -0
- package/dist/src/teal-frame/table.d.ts.map +1 -0
- package/dist/src/teal-frame/table.js +64 -0
- package/dist/src/teal-frame/table.js.map +1 -0
- package/dist/src/teal-frame/udf-types.d.ts +45 -0
- package/dist/src/teal-frame/udf-types.d.ts.map +1 -0
- package/dist/src/teal-frame/udf-types.js +157 -0
- package/dist/src/teal-frame/udf-types.js.map +1 -0
- package/dist/src/teal-frame/wkb.d.ts +6 -0
- package/dist/src/teal-frame/wkb.d.ts.map +1 -0
- package/dist/src/teal-frame/wkb.js +167 -0
- package/dist/src/teal-frame/wkb.js.map +1 -0
- package/package.json +16 -9
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { DataType } from '@terascope/data-types';
|
|
2
|
+
import { quoteIdentifier, quoteLiteral } from '@terascope/sql-builder';
|
|
3
|
+
import { buildJsonExpression, buildJsonListElements, buildJsonRowFilter, resolveRules } from './export-json.js';
|
|
4
|
+
import { int64Column } from './parquet-columns.js';
|
|
5
|
+
/**
|
|
6
|
+
* Implementations of `TealFrame`'s output methods: `writeParquet`, the JSON-lines query behind
|
|
7
|
+
* `ndjson`, `writeNDJSON` and `rows(options)`, and `listValues`. Their contracts are documented
|
|
8
|
+
* on `TealFrame`.
|
|
9
|
+
*/
|
|
10
|
+
/** Writes the frame to a zstd Parquet file, narrowing 128-bit columns to their declared type. */
|
|
11
|
+
export async function writeParquet(ctx, from, config, path) {
|
|
12
|
+
const columns = await ctx.columnTypes(`SELECT * FROM ${from}`);
|
|
13
|
+
const declared = new DataType(config).toDuckDB();
|
|
14
|
+
const list = columns
|
|
15
|
+
.map(({ name, type }) => int64Column(name, type, declared[name]))
|
|
16
|
+
.join(', ');
|
|
17
|
+
// GEOPARQUET_VERSION 'BOTH' writes Parquet's native GEOMETRY logical type, which, unlike
|
|
18
|
+
// the GeoParquet 1.0 default, also works for nested values. A GeoJSON array or an object's
|
|
19
|
+
// GeoJSON member then reads back as GEOMETRY instead of BLOB (BLOB has no cast to
|
|
20
|
+
// GEOMETRY). The 1.0 metadata is still written for readers that only support it.
|
|
21
|
+
await ctx.run(`COPY (SELECT ${list} FROM ${from}) TO ${quoteLiteral(path)}`
|
|
22
|
+
+ ' (FORMAT parquet, COMPRESSION zstd, GEOPARQUET_VERSION \'BOTH\')');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* SQL that renders one JSON line per row, as `DataFrame.toJSON` does with the same options.
|
|
26
|
+
* Rows that `skipEmptyObjects` drops are filtered out. See `export-json.ts`.
|
|
27
|
+
*/
|
|
28
|
+
export function jsonLinesSQL(from, config, options) {
|
|
29
|
+
const expression = buildJsonExpression(config, options);
|
|
30
|
+
const filter = buildJsonRowFilter(config, options);
|
|
31
|
+
return `SELECT ${expression} AS json FROM ${from}` + (filter ? ` WHERE ${filter}` : '');
|
|
32
|
+
}
|
|
33
|
+
/** Yields one row's LIST column element by element, like `ListVector.getRowIterator`. */
|
|
34
|
+
export async function* listValues(ctx, from, config, column, options) {
|
|
35
|
+
const rules = resolveRules(options);
|
|
36
|
+
if (rules.skipDuplicateObjects) {
|
|
37
|
+
throw new Error('ListVector->getIterator is incompatible with skipDuplicateObjects');
|
|
38
|
+
}
|
|
39
|
+
const { sql, isObject } = buildJsonListElements(config, column, options);
|
|
40
|
+
const nilValue = rules.useNullForUndefined ? null : undefined;
|
|
41
|
+
const skipNil = rules.skipNilListValues || (isObject && rules.skipNilObjectValues);
|
|
42
|
+
if (rules.skipEmptyArrays) {
|
|
43
|
+
const values = await ctx.scalar(`SELECT count(${quoteIdentifier(column)}) FROM ${from}`);
|
|
44
|
+
if (Number(values) === 0)
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const [row] = await ctx.rows(`SELECT ${sql} FROM ${from} LIMIT 1`);
|
|
48
|
+
if (row == null)
|
|
49
|
+
return;
|
|
50
|
+
const elements = row[0];
|
|
51
|
+
if (elements == null) {
|
|
52
|
+
if (!skipNil)
|
|
53
|
+
yield nilValue;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
for (const element of elements) {
|
|
57
|
+
if (element != null)
|
|
58
|
+
yield JSON.parse(element);
|
|
59
|
+
else if (!skipNil)
|
|
60
|
+
yield nilValue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/teal-frame/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DuckDBType } from '@duckdb/node-api';
|
|
2
|
+
/**
|
|
3
|
+
* Returns one column of the Parquet projection, with any 128-bit integer narrowed.
|
|
4
|
+
*
|
|
5
|
+
* **Parquet has no 128-bit integer, and DuckDB silently writes one as a DOUBLE**, which changes
|
|
6
|
+
* every value past 2^53. A stored Long is already a BIGINT; this handles computed values
|
|
7
|
+
* (`n::HUGEINT + 1`, a UDF result, `ipToInt` on IPv6).
|
|
8
|
+
*
|
|
9
|
+
* The column is cast to the type declared in the config. Editing DuckDB's rendered type string
|
|
10
|
+
* instead would also rewrite a struct member named `HUGEINT`. The cast is exact for values that
|
|
11
|
+
* fit and fails the write with DuckDB's out-of-range error for values that do not. A wide column
|
|
12
|
+
* the config does not declare is rejected, because there is no correct type to choose.
|
|
13
|
+
*/
|
|
14
|
+
export declare function int64Column(name: string, type: DuckDBType, declared: string | undefined): string;
|
|
15
|
+
//# sourceMappingURL=parquet-columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet-columns.d.ts","sourceRoot":"","sources":["../../../src/teal-frame/parquet-columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAC;AA8B5D;;;;;;;;;;;EAWE;AACF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUhG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { DuckDBTypeId } from '@duckdb/node-api';
|
|
2
|
+
import { quoteIdentifier } from '@terascope/sql-builder';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the column list `writeParquet` selects, so every column is written as a type Parquet
|
|
5
|
+
* can hold exactly. See `int64Column`.
|
|
6
|
+
*/
|
|
7
|
+
/** DuckDB's 128-bit integers, which Parquet has no type for. */
|
|
8
|
+
const WIDE_INTEGER_IDS = new Set([
|
|
9
|
+
DuckDBTypeId.HUGEINT, DuckDBTypeId.UHUGEINT,
|
|
10
|
+
]);
|
|
11
|
+
/** True when a 128-bit integer appears anywhere in a type, including nested members. */
|
|
12
|
+
function hasWideInteger(type) {
|
|
13
|
+
if (WIDE_INTEGER_IDS.has(type.typeId))
|
|
14
|
+
return true;
|
|
15
|
+
const nested = type;
|
|
16
|
+
return [
|
|
17
|
+
...(nested.entryTypes ?? []),
|
|
18
|
+
...(nested.memberTypes ?? []),
|
|
19
|
+
...(nested.valueType ? [nested.valueType] : []),
|
|
20
|
+
...(nested.keyType ? [nested.keyType] : []),
|
|
21
|
+
].some(hasWideInteger);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns one column of the Parquet projection, with any 128-bit integer narrowed.
|
|
25
|
+
*
|
|
26
|
+
* **Parquet has no 128-bit integer, and DuckDB silently writes one as a DOUBLE**, which changes
|
|
27
|
+
* every value past 2^53. A stored Long is already a BIGINT; this handles computed values
|
|
28
|
+
* (`n::HUGEINT + 1`, a UDF result, `ipToInt` on IPv6).
|
|
29
|
+
*
|
|
30
|
+
* The column is cast to the type declared in the config. Editing DuckDB's rendered type string
|
|
31
|
+
* instead would also rewrite a struct member named `HUGEINT`. The cast is exact for values that
|
|
32
|
+
* fit and fails the write with DuckDB's out-of-range error for values that do not. A wide column
|
|
33
|
+
* the config does not declare is rejected, because there is no correct type to choose.
|
|
34
|
+
*/
|
|
35
|
+
export function int64Column(name, type, declared) {
|
|
36
|
+
const column = quoteIdentifier(name);
|
|
37
|
+
if (!hasWideInteger(type))
|
|
38
|
+
return column;
|
|
39
|
+
if (declared == null) {
|
|
40
|
+
throw new TypeError(`Cannot write column "${name}" to Parquet: it holds a 128-bit integer (${type}), which`
|
|
41
|
+
+ ' Parquet cannot carry, and the frame config does not declare it');
|
|
42
|
+
}
|
|
43
|
+
return `CAST(${column} AS ${declared}) AS ${column}`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=parquet-columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet-columns.js","sourceRoot":"","sources":["../../../src/teal-frame/parquet-columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;EAGE;AAEF,gEAAgE;AAChE,MAAM,gBAAgB,GAA8B,IAAI,GAAG,CAAC;IACxD,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ;CAC9C,CAAC,CAAC;AAEH,wFAAwF;AACxF,SAAS,cAAc,CAAC,IAAgB;IACpC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,MAAM,GAAG,IAKd,CAAC;IACF,OAAO;QACH,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;EAWE;AACF,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAgB,EAAE,QAA4B;IACpF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,SAAS,CACf,wBAAwB,IAAI,6CAA6C,IAAI,UAAU;cACrF,iEAAiE,CACtE,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,MAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts values read from DuckDB into the plain JS values `rows()` returns.
|
|
3
|
+
*
|
|
4
|
+
* `rows()` results are sent straight to callers, so no DuckDB value class may leak through:
|
|
5
|
+
*
|
|
6
|
+
* - LIST arrives as a `DuckDBListValue`, which would serialize as `{"items":[...]}`. It becomes
|
|
7
|
+
* an array.
|
|
8
|
+
* - TIMESTAMP arrives as a `DuckDBTimestampValue`. It is rendered with `toISO8601`, as
|
|
9
|
+
* `DateVector.toJSONCompatibleValue` does.
|
|
10
|
+
* - GEOMETRY arrives as WKB bytes. It is decoded back to the GeoShape a `GeoJSON` field holds.
|
|
11
|
+
* - BIGINT and HUGEINT arrive as a JS `bigint`, which `JSON.stringify` cannot serialize.
|
|
12
|
+
* `bigIntToPlain` returns a number when the value fits exactly and a decimal string otherwise.
|
|
13
|
+
*
|
|
14
|
+
* `core-utils`' `bigIntToJSON` is not used, because it is wrong for values read from DuckDB
|
|
15
|
+
* (#4555). It subtracts 1 from every positive value above the safe limit, to cancel a `+1` that
|
|
16
|
+
* core-utils' parser adds, so a value that was never parsed comes back one too low. Its bound
|
|
17
|
+
* is also a signed comparison, so large negative values lose precision instead of becoming
|
|
18
|
+
* strings.
|
|
19
|
+
*
|
|
20
|
+
* The rule here is the same as in `export-json.ts` (`abs(value) > MAX_SAFE` becomes a decimal
|
|
21
|
+
* string, anything smaller a number), so `rows()` and `ndjson()` always agree.
|
|
22
|
+
*/
|
|
23
|
+
export declare const MAX_SAFE_BIGINT = 9007199254740991n;
|
|
24
|
+
export declare function toPlainValue(value: unknown): unknown;
|
|
25
|
+
/**
|
|
26
|
+
* Parses a JSON column's text into the value it encodes. `Any` and untyped `Object` fields are
|
|
27
|
+
* stored as DuckDB JSON columns, which DuckDB returns as text.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseJSONText(value: unknown): unknown;
|
|
30
|
+
//# sourceMappingURL=plain-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-values.d.ts","sourceRoot":"","sources":["../../../src/teal-frame/plain-values.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;EAqBE;AACF,eACA,MAAM,eAAe,oBAAoB,CAAC;AAc1C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA0BpD;AAED;;;EAGE;AACF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { DuckDBTimestampValue, DuckDBGeometryValue } from '@duckdb/node-api';
|
|
2
|
+
import { toISO8601 } from '@terascope/core-utils';
|
|
3
|
+
import { wkbToGeoShape } from './wkb.js';
|
|
4
|
+
/**
|
|
5
|
+
* Converts values read from DuckDB into the plain JS values `rows()` returns.
|
|
6
|
+
*
|
|
7
|
+
* `rows()` results are sent straight to callers, so no DuckDB value class may leak through:
|
|
8
|
+
*
|
|
9
|
+
* - LIST arrives as a `DuckDBListValue`, which would serialize as `{"items":[...]}`. It becomes
|
|
10
|
+
* an array.
|
|
11
|
+
* - TIMESTAMP arrives as a `DuckDBTimestampValue`. It is rendered with `toISO8601`, as
|
|
12
|
+
* `DateVector.toJSONCompatibleValue` does.
|
|
13
|
+
* - GEOMETRY arrives as WKB bytes. It is decoded back to the GeoShape a `GeoJSON` field holds.
|
|
14
|
+
* - BIGINT and HUGEINT arrive as a JS `bigint`, which `JSON.stringify` cannot serialize.
|
|
15
|
+
* `bigIntToPlain` returns a number when the value fits exactly and a decimal string otherwise.
|
|
16
|
+
*
|
|
17
|
+
* `core-utils`' `bigIntToJSON` is not used, because it is wrong for values read from DuckDB
|
|
18
|
+
* (#4555). It subtracts 1 from every positive value above the safe limit, to cancel a `+1` that
|
|
19
|
+
* core-utils' parser adds, so a value that was never parsed comes back one too low. Its bound
|
|
20
|
+
* is also a signed comparison, so large negative values lose precision instead of becoming
|
|
21
|
+
* strings.
|
|
22
|
+
*
|
|
23
|
+
* The rule here is the same as in `export-json.ts` (`abs(value) > MAX_SAFE` becomes a decimal
|
|
24
|
+
* string, anything smaller a number), so `rows()` and `ndjson()` always agree.
|
|
25
|
+
*/
|
|
26
|
+
export /** The largest whole number JSON can carry without `JSON.parse` rounding it. */ const MAX_SAFE_BIGINT = 9007199254740991n;
|
|
27
|
+
/**
|
|
28
|
+
* Converts a bigint to a number when it fits exactly, or to an exact decimal string when it
|
|
29
|
+
* does not.
|
|
30
|
+
*
|
|
31
|
+
* The bound applies to the magnitude, matching `abs(x) > 9007199254740991` in `export-json.ts`.
|
|
32
|
+
* No arithmetic is applied to the value.
|
|
33
|
+
*/
|
|
34
|
+
function bigIntToPlain(value) {
|
|
35
|
+
if (value > MAX_SAFE_BIGINT || value < -MAX_SAFE_BIGINT)
|
|
36
|
+
return value.toString(10);
|
|
37
|
+
return Number(value);
|
|
38
|
+
}
|
|
39
|
+
export function toPlainValue(value) {
|
|
40
|
+
if (value == null)
|
|
41
|
+
return value;
|
|
42
|
+
if (typeof value === 'bigint')
|
|
43
|
+
return bigIntToPlain(value);
|
|
44
|
+
if (typeof value !== 'object')
|
|
45
|
+
return value;
|
|
46
|
+
if (value instanceof DuckDBTimestampValue) {
|
|
47
|
+
return toISO8601(Number(value.micros / 1000n));
|
|
48
|
+
}
|
|
49
|
+
// a GeoJSON column is a GEOMETRY, which the binding hands over as WKB
|
|
50
|
+
if (value instanceof DuckDBGeometryValue)
|
|
51
|
+
return wkbToGeoShape(value.bytes);
|
|
52
|
+
const items = value.items;
|
|
53
|
+
if (Array.isArray(items))
|
|
54
|
+
return items.map(toPlainValue);
|
|
55
|
+
const entries = value.entries;
|
|
56
|
+
if (entries != null && typeof entries === 'object') {
|
|
57
|
+
return Object.fromEntries(Object.entries(entries)
|
|
58
|
+
.map(([key, val]) => [key, toPlainValue(val)]));
|
|
59
|
+
}
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parses a JSON column's text into the value it encodes. `Any` and untyped `Object` fields are
|
|
64
|
+
* stored as DuckDB JSON columns, which DuckDB returns as text.
|
|
65
|
+
*/
|
|
66
|
+
export function parseJSONText(value) {
|
|
67
|
+
return typeof value === 'string' ? JSON.parse(value) : value;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=plain-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-values.js","sourceRoot":"","sources":["../../../src/teal-frame/plain-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;EAqBE;AACF,MAAM,CAAC,gFAAgF,CACvF,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C;;;;;;EAME;AACF,SAAS,aAAa,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,eAAe,IAAI,KAAK,GAAG,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACvC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAEhC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAE3D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,sEAAsE;IACtE,IAAI,KAAK,YAAY,mBAAmB;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;IACzD,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,OAAO,CAAC,OAAkC,CAAC;aAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CACrD,CAAC;IACN,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;EAGE;AACF,MAAM,UAAU,aAAa,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DataTypeConfig, DataTypeFields, ReadonlyDataTypeConfig, ReadonlyDataTypeFields, FieldType } from '@terascope/types';
|
|
2
|
+
/**
|
|
3
|
+
* Shapes `rows()` output where the right shape depends on the field config, not the value.
|
|
4
|
+
*
|
|
5
|
+
* - `toPlainValue` turns every STRUCT into an object. A `Tuple` is stored as
|
|
6
|
+
* `STRUCT("0" ..., "1" ...)` (a DuckDB LIST cannot mix element types), but `DataFrame`
|
|
7
|
+
* returns it as an array, so it is converted back.
|
|
8
|
+
* - A `Date` is stored as `{ ms, tz_offset }` and rendered as `toISO8601` renders it. See
|
|
9
|
+
* `date-value.ts`.
|
|
10
|
+
* - A JSON column (`Any`, or an `Object`/`Tuple` with no declared children) arrives as text and is
|
|
11
|
+
* parsed, so `{x: 1}` is returned as an object rather than the string `'{"x":1}'`.
|
|
12
|
+
*
|
|
13
|
+
* Shapers are built once per `rows()` call. A column that needs no shaping gets none and costs
|
|
14
|
+
* nothing per row.
|
|
15
|
+
*/
|
|
16
|
+
export type ValueShaper = (value: unknown) => unknown;
|
|
17
|
+
/** Returns a shaper for each top-level column that needs one, keyed by column name. */
|
|
18
|
+
export declare function makeRowShapers(config: DataTypeConfig | ReadonlyDataTypeConfig): ReadonlyMap<string, ValueShaper>;
|
|
19
|
+
/** Whether the column is stored as JSON (`toDuckDB` maps these types to `JSON`). */
|
|
20
|
+
export declare function isJSONColumn(type: FieldType, childConfig?: DataTypeFields | ReadonlyDataTypeFields): boolean;
|
|
21
|
+
//# sourceMappingURL=row-shape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-shape.d.ts","sourceRoot":"","sources":["../../../src/teal-frame/row-shape.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EAAuB,cAAc,EAAE,sBAAsB,EAC3E,sBAAsB,EAAE,SAAS,EACpC,MAAM,kBAAkB,CAAC;AAK1B;;;;;;;;;;;;;EAaE;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;AAEtD,uFAAuF;AACvF,wBAAgB,cAAc,CAC1B,MAAM,EAAE,cAAc,GAAG,sBAAsB,GAChD,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAalC;AAaD,oFAAoF;AACpF,wBAAgB,YAAY,CACxB,IAAI,EAAE,SAAS,EACf,WAAW,CAAC,EAAE,cAAc,GAAG,sBAAsB,GACtD,OAAO,CAKT"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { FieldType } from '@terascope/types';
|
|
2
|
+
import { getChildDataTypeConfig } from '../core/utils.js';
|
|
3
|
+
import { parseJSONText } from './plain-values.js';
|
|
4
|
+
import { renderPlainDate } from './date-value.js';
|
|
5
|
+
/** Returns a shaper for each top-level column that needs one, keyed by column name. */
|
|
6
|
+
export function makeRowShapers(config) {
|
|
7
|
+
const fields = (config.fields ?? {});
|
|
8
|
+
const shapers = new Map();
|
|
9
|
+
for (const [name, fieldConfig] of Object.entries(fields)) {
|
|
10
|
+
if (name.includes('.'))
|
|
11
|
+
continue;
|
|
12
|
+
const shaper = fieldShaper(fieldConfig, getChildDataTypeConfig(fields, name, fieldConfig.type));
|
|
13
|
+
if (shaper)
|
|
14
|
+
shapers.set(name, shaper);
|
|
15
|
+
}
|
|
16
|
+
return shapers;
|
|
17
|
+
}
|
|
18
|
+
function fieldShaper(fieldConfig, childConfig) {
|
|
19
|
+
const element = elementShaper(fieldConfig.type, childConfig);
|
|
20
|
+
if (element == null)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (!fieldConfig.array)
|
|
23
|
+
return element;
|
|
24
|
+
return (value) => (Array.isArray(value) ? value.map(element) : value);
|
|
25
|
+
}
|
|
26
|
+
/** Whether the column is stored as JSON (`toDuckDB` maps these types to `JSON`). */
|
|
27
|
+
export function isJSONColumn(type, childConfig) {
|
|
28
|
+
if (type === FieldType.Any)
|
|
29
|
+
return true;
|
|
30
|
+
if (type !== FieldType.Object && type !== FieldType.Tuple)
|
|
31
|
+
return false;
|
|
32
|
+
return childConfig == null
|
|
33
|
+
|| Object.keys(childConfig).every((name) => name.includes('.'));
|
|
34
|
+
}
|
|
35
|
+
function elementShaper(type, childConfig) {
|
|
36
|
+
if (isJSONColumn(type, childConfig))
|
|
37
|
+
return parseJSONText;
|
|
38
|
+
if (type === FieldType.Date)
|
|
39
|
+
return renderPlainDate;
|
|
40
|
+
if (type === FieldType.Tuple)
|
|
41
|
+
return tupleShaper(childConfig);
|
|
42
|
+
return objectShaper(type, childConfig);
|
|
43
|
+
}
|
|
44
|
+
/** Returns `[name, shaper]` for each direct child; the shaper is undefined when not needed. */
|
|
45
|
+
function childShapers(childConfig) {
|
|
46
|
+
if (childConfig == null)
|
|
47
|
+
return [];
|
|
48
|
+
return Object.entries(childConfig)
|
|
49
|
+
.filter(([name]) => !name.includes('.'))
|
|
50
|
+
.map(([name, config]) => [
|
|
51
|
+
name,
|
|
52
|
+
fieldShaper(config, getChildDataTypeConfig(childConfig, name, config.type)),
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Converts `{"0": a, "1": b}` to `[a, b]` in position order, shaping each position. A NULL
|
|
57
|
+
* position stays `null` in the array, as in `DataFrame`.
|
|
58
|
+
*/
|
|
59
|
+
function tupleShaper(childConfig) {
|
|
60
|
+
const positions = childShapers(childConfig)
|
|
61
|
+
.sort(([a], [b]) => Number(a) - Number(b));
|
|
62
|
+
return (value) => {
|
|
63
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
64
|
+
return value;
|
|
65
|
+
const struct = value;
|
|
66
|
+
return positions.map(([name, shape]) => {
|
|
67
|
+
const member = struct[name] ?? null;
|
|
68
|
+
return shape ? shape(member) : member;
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Shapes an `Object` whose children need shaping (for example a Tuple or JSON child). Returns a
|
|
74
|
+
* new object and never mutates the input.
|
|
75
|
+
*/
|
|
76
|
+
function objectShaper(type, childConfig) {
|
|
77
|
+
if (type !== FieldType.Object)
|
|
78
|
+
return undefined;
|
|
79
|
+
const shaped = childShapers(childConfig)
|
|
80
|
+
.filter((entry) => entry[1] != null);
|
|
81
|
+
if (shaped.length === 0)
|
|
82
|
+
return undefined;
|
|
83
|
+
return (value) => {
|
|
84
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
85
|
+
return value;
|
|
86
|
+
const copy = { ...value };
|
|
87
|
+
for (const [name, shape] of shaped) {
|
|
88
|
+
if (name in copy)
|
|
89
|
+
copy[name] = shape(copy[name]);
|
|
90
|
+
}
|
|
91
|
+
return copy;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=row-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-shape.js","sourceRoot":"","sources":["../../../src/teal-frame/row-shape.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { DuckDBScalarFunction } from '@duckdb/node-api';
|
|
2
|
+
import { FieldType, DataTypeFieldConfig, DataTypeFields, ReadonlyDataTypeFields } from '@terascope/types';
|
|
3
|
+
/**
|
|
4
|
+
* A per-value implementation, matching what `FieldTransformConfig.create` /
|
|
5
|
+
* `FieldValidateConfig.create` return: `(value, index) => result`.
|
|
6
|
+
*/
|
|
7
|
+
export type ScalarFunctionImpl = (value: unknown, index: number) => unknown;
|
|
8
|
+
export interface ScalarFunctionSpec {
|
|
9
|
+
/** The name it is called by in SQL. */
|
|
10
|
+
name: string;
|
|
11
|
+
/**
|
|
12
|
+
* The single value argument: a bare field type, or a full field config for a list, struct or
|
|
13
|
+
* JSON value, which a bare type cannot express. See `udfTypeFor`.
|
|
14
|
+
*/
|
|
15
|
+
parameter: FieldType | DataTypeFieldConfig;
|
|
16
|
+
/** Children of the parameter, for an Object/Tuple parameter. */
|
|
17
|
+
parameterChildren?: DataTypeFields | ReadonlyDataTypeFields;
|
|
18
|
+
/**
|
|
19
|
+
* The result's field config, not just its type.
|
|
20
|
+
*
|
|
21
|
+
* The returned JS value must be converted to DuckDB's representation (a BIGINT vector
|
|
22
|
+
* rejects a `number`, for example). `makeValueConverter`, which `fromRecords` also uses,
|
|
23
|
+
* does that from the config.
|
|
24
|
+
*/
|
|
25
|
+
returns: DataTypeFieldConfig;
|
|
26
|
+
/** Children of the result type, for Object/Tuple results. */
|
|
27
|
+
returnsChildren?: DataTypeFields | ReadonlyDataTypeFields;
|
|
28
|
+
/**
|
|
29
|
+
* The implementation, called once per row.
|
|
30
|
+
*
|
|
31
|
+
* This should come from a function config's `create()` via `tealFrameAdapter`, not be
|
|
32
|
+
* written by hand. The function configs already define the name, arguments, accepted types,
|
|
33
|
+
* `output_type`, and null and array handling, so restating them here would duplicate them.
|
|
34
|
+
*
|
|
35
|
+
* Exactly one of `fn` and `fnForArgs` is set.
|
|
36
|
+
*/
|
|
37
|
+
fn?: ScalarFunctionImpl;
|
|
38
|
+
/**
|
|
39
|
+
* Builds the implementation for one argument set from its JSON text, which the SQL passes as
|
|
40
|
+
* a second, constant parameter: `dm_lookup_x(code, '{"in":{...}}')`.
|
|
41
|
+
*
|
|
42
|
+
* This keeps the number of registered UDFs bounded. DuckDB cannot unregister a scalar
|
|
43
|
+
* function, so registering one UDF per argument set (per `lookup` table, regex or format)
|
|
44
|
+
* would grow without limit in a long-running process. Passing the arguments as a parameter
|
|
45
|
+
* means one UDF per function and type signature, and each argument set's implementation is
|
|
46
|
+
* cached in a bounded LRU (`ARGUMENT_SETS_KEPT`).
|
|
47
|
+
*/
|
|
48
|
+
fnForArgs?: (argsText: string) => ScalarFunctionImpl;
|
|
49
|
+
/**
|
|
50
|
+
* Call `fn` for rows where the argument is null. Defaults to false, which matches
|
|
51
|
+
* `DataFrame`: `transformVectorToBuilder` iterates `vector.values()`, which skips nil
|
|
52
|
+
* entries, so a transform never receives a null. DuckDB passes nulls to a UDF, so the skip
|
|
53
|
+
* is done here.
|
|
54
|
+
*/
|
|
55
|
+
callWithNull?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** How many argument sets' implementations one UDF keeps; the least recently used is dropped. */
|
|
58
|
+
export declare const ARGUMENT_SETS_KEPT = 256;
|
|
59
|
+
/**
|
|
60
|
+
* Wraps a per-row JS function as a vectorized DuckDB scalar function.
|
|
61
|
+
*
|
|
62
|
+
* The binding is chunk-based (`mainFunction(info, chunk, outputVector)`), so the JS boundary is
|
|
63
|
+
* crossed once per chunk of about 2048 rows, not once per row.
|
|
64
|
+
*/
|
|
65
|
+
export declare function createScalarFunction(spec: ScalarFunctionSpec): DuckDBScalarFunction;
|
|
66
|
+
//# sourceMappingURL=scalar-function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalar-function.d.ts","sourceRoot":"","sources":["../../../src/teal-frame/scalar-function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAW,MAAM,kBAAkB,CAAC;AACjE,OAAO,EACH,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,sBAAsB,EACzE,MAAM,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IAC/B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb;;;MAGE;IACF,SAAS,EAAE,SAAS,GAAG,mBAAmB,CAAC;IAC3C,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,cAAc,GAAG,sBAAsB,CAAC;IAC5D;;;;;;OAMG;IACH,OAAO,EAAE,mBAAmB,CAAC;IAC7B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,cAAc,GAAG,sBAAsB,CAAC;IAC1D;;;;;;;;OAQG;IACH,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACxB;;;;;;;;;MASE;IACF,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,CAAC;IACrD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,iGAAiG;AACjG,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAqBtC;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CAkDnF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DuckDBScalarFunction, VARCHAR } from '@duckdb/node-api';
|
|
2
|
+
import { makeValueConverter } from './duck-values.js';
|
|
3
|
+
import { makeInputConverter, udfTypeFor } from './udf-types.js';
|
|
4
|
+
/** How many argument sets' implementations one UDF keeps; the least recently used is dropped. */
|
|
5
|
+
export const ARGUMENT_SETS_KEPT = 256;
|
|
6
|
+
/** Memoizes `build` per argument text in a bounded LRU. */
|
|
7
|
+
function perArgumentSet(build) {
|
|
8
|
+
const kept = new Map();
|
|
9
|
+
return (argsText) => {
|
|
10
|
+
const found = kept.get(argsText);
|
|
11
|
+
if (found) {
|
|
12
|
+
kept.delete(argsText);
|
|
13
|
+
kept.set(argsText, found);
|
|
14
|
+
return found;
|
|
15
|
+
}
|
|
16
|
+
const built = build(argsText);
|
|
17
|
+
kept.set(argsText, built);
|
|
18
|
+
if (kept.size > ARGUMENT_SETS_KEPT)
|
|
19
|
+
kept.delete(kept.keys().next().value);
|
|
20
|
+
return built;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wraps a per-row JS function as a vectorized DuckDB scalar function.
|
|
25
|
+
*
|
|
26
|
+
* The binding is chunk-based (`mainFunction(info, chunk, outputVector)`), so the JS boundary is
|
|
27
|
+
* crossed once per chunk of about 2048 rows, not once per row.
|
|
28
|
+
*/
|
|
29
|
+
export function createScalarFunction(spec) {
|
|
30
|
+
const callWithNull = spec.callWithNull ?? false;
|
|
31
|
+
// a computed result may be wider than a stored Long; see `wideIntegers`
|
|
32
|
+
const convert = makeValueConverter(spec.returns, spec.returnsChildren, { wideIntegers: true });
|
|
33
|
+
const parameter = typeof spec.parameter === 'string'
|
|
34
|
+
? { type: spec.parameter }
|
|
35
|
+
: spec.parameter;
|
|
36
|
+
/**
|
|
37
|
+
* Input values need converting too. Without it, a date arrives as a DuckDB value class
|
|
38
|
+
* that the date functions would misread (for example, as host-local time). See
|
|
39
|
+
* `makeInputConverter`.
|
|
40
|
+
*/
|
|
41
|
+
const toInput = makeInputConverter(parameter, spec.parameterChildren);
|
|
42
|
+
const forArgs = spec.fnForArgs ? perArgumentSet(spec.fnForArgs) : undefined;
|
|
43
|
+
if (!forArgs && !spec.fn) {
|
|
44
|
+
throw new TypeError(`Scalar function "${spec.name}" needs \`fn\` or \`fnForArgs\``);
|
|
45
|
+
}
|
|
46
|
+
return DuckDBScalarFunction.create({
|
|
47
|
+
name: spec.name,
|
|
48
|
+
parameterTypes: forArgs
|
|
49
|
+
? [udfTypeFor(parameter, spec.parameterChildren), VARCHAR]
|
|
50
|
+
: [udfTypeFor(parameter, spec.parameterChildren)],
|
|
51
|
+
returnType: udfTypeFor(spec.returns, spec.returnsChildren, { wide: true }),
|
|
52
|
+
mainFunction: (_info, chunk, output) => {
|
|
53
|
+
const values = chunk.getColumnValues(0);
|
|
54
|
+
/**
|
|
55
|
+
* The arguments are one constant literal per call (`udfCall`), so only the first row
|
|
56
|
+
* is read. Reading the whole column would copy the JSON into a JS string for every
|
|
57
|
+
* row, which is very slow for a large `lookup` table.
|
|
58
|
+
*/
|
|
59
|
+
const impl = forArgs
|
|
60
|
+
? forArgs(chunk.getColumnVector(1).getItem(0))
|
|
61
|
+
: spec.fn;
|
|
62
|
+
for (let row = 0; row < chunk.rowCount; row++) {
|
|
63
|
+
const value = values[row];
|
|
64
|
+
if (value == null && !callWithNull) {
|
|
65
|
+
output.setItem(row, null);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const result = impl(toInput(value), row);
|
|
69
|
+
output.setItem(row, (result == null ? null : convert(result)));
|
|
70
|
+
}
|
|
71
|
+
output.flush();
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=scalar-function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalar-function.js","sourceRoot":"","sources":["../../../src/teal-frame/scalar-function.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FieldType } from '@terascope/types';
|
|
2
|
+
import { TealFrame } from './TealFrame.js';
|
|
3
|
+
/**
|
|
4
|
+
* One disagreement between a frame's declared `DataTypeConfig` and the column types DuckDB
|
|
5
|
+
* actually produces.
|
|
6
|
+
*/
|
|
7
|
+
export interface SchemaMismatch {
|
|
8
|
+
column: string;
|
|
9
|
+
/**
|
|
10
|
+
* The `FieldType` the config declares. Reports lead with this, because DuckDB types are a
|
|
11
|
+
* storage detail. Absent when `kind` is `unexpected` (the column was never declared).
|
|
12
|
+
*/
|
|
13
|
+
declared?: FieldType;
|
|
14
|
+
kind: 'type' | 'missing' | 'unexpected';
|
|
15
|
+
/**
|
|
16
|
+
* For diagnosis: the DuckDB type `declared` maps to, and the type DuckDB actually produced.
|
|
17
|
+
*
|
|
18
|
+
* There is no DuckDB-to-`FieldType` mapping, because it would be ambiguous (`VARCHAR` backs
|
|
19
|
+
* `Keyword`, `Text`, `IP`, `Binary` and more). So types are compared as DuckDB types.
|
|
20
|
+
*/
|
|
21
|
+
storage?: {
|
|
22
|
+
declared?: string;
|
|
23
|
+
actual?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the DuckDB column type of each column in a frame, for diagnosis and for checking a
|
|
28
|
+
* config against what DuckDB produced.
|
|
29
|
+
*/
|
|
30
|
+
export declare function describeColumns(frame: TealFrame): Promise<Record<string, string>>;
|
|
31
|
+
/**
|
|
32
|
+
* Compares a frame's declared config with the column types DuckDB actually produced. An empty
|
|
33
|
+
* array means they agree.
|
|
34
|
+
*
|
|
35
|
+
* A column's type comes from its SQL expression, not from the config, so a projection can
|
|
36
|
+
* declare `Integer` while its SQL yields VARCHAR. Aggregations are a common case: DuckDB
|
|
37
|
+
* promotes `sum(BIGINT)` to HUGEINT, while data-mate treats the result as a `Long`.
|
|
38
|
+
*
|
|
39
|
+
* Returns the differences rather than throwing, so a caller can assert on them, log them, or
|
|
40
|
+
* ignore kinds it does not care about.
|
|
41
|
+
*/
|
|
42
|
+
export declare function diffSchema(frame: TealFrame): Promise<SchemaMismatch[]>;
|
|
43
|
+
//# sourceMappingURL=schema-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-check.d.ts","sourceRoot":"","sources":["../../../src/teal-frame/schema-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf;;;MAGE;IACF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;IACxC;;;;;MAKE;IACF,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAED;;;EAGE;AACF,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAKvF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAgC5E"}
|