@dpkit/table
Version:
Data Package implementation in TypeScript.
79 lines (72 loc) • 2.51 kB
text/typescript
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
}
}