UNPKG

@dpkit/table

Version:

Data Package implementation in TypeScript.

79 lines (72 loc) 2.51 kB
import type { Field, Schema } from "@dpkit/core" import { col, lit, when } from "nodejs-polars" import type { Expr } from "nodejs-polars" import { parseArrayField } from "./types/array.ts" import { parseBooleanField } from "./types/boolean.ts" import { parseDateField } from "./types/date.ts" import { parseDatetimeField } from "./types/datetime.ts" import { parseDurationField } from "./types/duration.ts" import { parseGeojsonField } from "./types/geojson.ts" import { parseGeopointField } from "./types/geopoint.ts" import { parseIntegerField } from "./types/integer.ts" import { parseListField } from "./types/list.ts" import { parseNumberField } from "./types/number.ts" import { parseObjectField } from "./types/object.ts" import { parseStringField } from "./types/string.ts" import { parseTimeField } from "./types/time.ts" import { parseYearField } from "./types/year.ts" import { parseYearmonthField } from "./types/yearmonth.ts" const DEFAULT_MISSING_VALUES = [""] export function parseField( field: Field, options?: { expr?: Expr; schema?: Schema }, ) { let expr = options?.expr ?? col(field.name) const missingValues = field.missingValues ?? options?.schema?.missingValues ?? DEFAULT_MISSING_VALUES const flattenMissingValues = missingValues.map(item => typeof item === "string" ? item : item.value, ) if (flattenMissingValues.length) { expr = when(expr.isIn(flattenMissingValues)) .then(lit(null)) .otherwise(expr) .alias(field.name) } switch (field.type) { case "string": return parseStringField(field, expr) case "integer": return parseIntegerField(field, expr) case "number": return parseNumberField(field, expr) case "boolean": return parseBooleanField(field, expr) case "date": return parseDateField(field, expr) case "datetime": return parseDatetimeField(field, expr) case "time": return parseTimeField(field, expr) case "year": return parseYearField(field, expr) case "yearmonth": return parseYearmonthField(field, expr) case "list": return parseListField(field, expr) case "array": return parseArrayField(field, expr) case "geopoint": return parseGeopointField(field, expr) case "object": return parseObjectField(field, expr) case "geojson": return parseGeojsonField(field, expr) case "duration": return parseDurationField(field, expr) default: return expr } }