@graphty/graph-io 0.0.0 → 0.2.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/LICENSE +21 -0
- package/README.md +250 -28
- package/dist/chunks/children-CL3Cy0ez.js +238 -0
- package/dist/chunks/children-CL3Cy0ez.js.map +1 -0
- package/dist/chunks/escape-DyI8JofU.js +938 -0
- package/dist/chunks/escape-DyI8JofU.js.map +1 -0
- package/dist/chunks/importer-CQnJuWJw.js +2987 -0
- package/dist/chunks/importer-CQnJuWJw.js.map +1 -0
- package/dist/chunks/importer-CpCpfbxr.js +2015 -0
- package/dist/chunks/importer-CpCpfbxr.js.map +1 -0
- package/dist/chunks/importer-DbnGYr3_.js +2342 -0
- package/dist/chunks/importer-DbnGYr3_.js.map +1 -0
- package/dist/chunks/importer-GozH8DkN.js +3050 -0
- package/dist/chunks/importer-GozH8DkN.js.map +1 -0
- package/dist/chunks/records-CGpxszm1.js +605 -0
- package/dist/chunks/records-CGpxszm1.js.map +1 -0
- package/dist/chunks/text-CajMdVFy.js +189 -0
- package/dist/chunks/text-CajMdVFy.js.map +1 -0
- package/dist/chunks/writer-DxSKC7TL.js +2842 -0
- package/dist/chunks/writer-DxSKC7TL.js.map +1 -0
- package/dist/csv.d.ts +1 -0
- package/dist/csv.js +1702 -0
- package/dist/csv.js.map +1 -0
- package/dist/dot.d.ts +1 -0
- package/dist/dot.js +8 -0
- package/dist/dot.js.map +1 -0
- package/dist/gexf.d.ts +1 -0
- package/dist/gexf.js +3466 -0
- package/dist/gexf.js.map +1 -0
- package/dist/gml.d.ts +1 -0
- package/dist/gml.js +2647 -0
- package/dist/gml.js.map +1 -0
- package/dist/graph-io.d.ts +1 -0
- package/dist/graph-io.js +790 -0
- package/dist/graph-io.js.map +1 -0
- package/dist/graphml.d.ts +1 -0
- package/dist/graphml.js +8 -0
- package/dist/graphml.js.map +1 -0
- package/dist/json.d.ts +1 -0
- package/dist/json.js +11 -0
- package/dist/json.js.map +1 -0
- package/dist/neo4j.d.ts +1 -0
- package/dist/neo4j.js +2046 -0
- package/dist/neo4j.js.map +1 -0
- package/dist/pajek.d.ts +1 -0
- package/dist/pajek.js +8 -0
- package/dist/pajek.js.map +1 -0
- package/dist/src/children.d.ts +134 -0
- package/dist/src/children.d.ts.map +1 -0
- package/dist/src/children.js +274 -0
- package/dist/src/children.js.map +1 -0
- package/dist/src/common/attributes.d.ts +229 -0
- package/dist/src/common/attributes.d.ts.map +1 -0
- package/dist/src/common/attributes.js +368 -0
- package/dist/src/common/attributes.js.map +1 -0
- package/dist/src/common/codes.d.ts +105 -0
- package/dist/src/common/codes.d.ts.map +1 -0
- package/dist/src/common/codes.js +107 -0
- package/dist/src/common/codes.js.map +1 -0
- package/dist/src/common/declared-types.d.ts +84 -0
- package/dist/src/common/declared-types.d.ts.map +1 -0
- package/dist/src/common/declared-types.js +326 -0
- package/dist/src/common/declared-types.js.map +1 -0
- package/dist/src/common/direction.d.ts +206 -0
- package/dist/src/common/direction.d.ts.map +1 -0
- package/dist/src/common/direction.js +370 -0
- package/dist/src/common/direction.js.map +1 -0
- package/dist/src/common/escape.d.ts +92 -0
- package/dist/src/common/escape.d.ts.map +1 -0
- package/dist/src/common/escape.js +212 -0
- package/dist/src/common/escape.js.map +1 -0
- package/dist/src/common/export.d.ts +249 -0
- package/dist/src/common/export.d.ts.map +1 -0
- package/dist/src/common/export.js +594 -0
- package/dist/src/common/export.js.map +1 -0
- package/dist/src/common/format.d.ts +59 -0
- package/dist/src/common/format.d.ts.map +1 -0
- package/dist/src/common/format.js +106 -0
- package/dist/src/common/format.js.map +1 -0
- package/dist/src/common/ids.d.ts +83 -0
- package/dist/src/common/ids.d.ts.map +1 -0
- package/dist/src/common/ids.js +158 -0
- package/dist/src/common/ids.js.map +1 -0
- package/dist/src/common/input.d.ts +100 -0
- package/dist/src/common/input.d.ts.map +1 -0
- package/dist/src/common/input.js +335 -0
- package/dist/src/common/input.js.map +1 -0
- package/dist/src/common/lists.d.ts +34 -0
- package/dist/src/common/lists.d.ts.map +1 -0
- package/dist/src/common/lists.js +185 -0
- package/dist/src/common/lists.js.map +1 -0
- package/dist/src/common/options.d.ts +108 -0
- package/dist/src/common/options.d.ts.map +1 -0
- package/dist/src/common/options.js +265 -0
- package/dist/src/common/options.js.map +1 -0
- package/dist/src/common/report.d.ts +187 -0
- package/dist/src/common/report.d.ts.map +1 -0
- package/dist/src/common/report.js +274 -0
- package/dist/src/common/report.js.map +1 -0
- package/dist/src/common/temporal.d.ts +71 -0
- package/dist/src/common/temporal.d.ts.map +1 -0
- package/dist/src/common/temporal.js +266 -0
- package/dist/src/common/temporal.js.map +1 -0
- package/dist/src/common/text.d.ts +104 -0
- package/dist/src/common/text.d.ts.map +1 -0
- package/dist/src/common/text.js +255 -0
- package/dist/src/common/text.js.map +1 -0
- package/dist/src/common/weights.d.ts +77 -0
- package/dist/src/common/weights.d.ts.map +1 -0
- package/dist/src/common/weights.js +156 -0
- package/dist/src/common/weights.js.map +1 -0
- package/dist/src/common/writer.d.ts +51 -0
- package/dist/src/common/writer.d.ts.map +1 -0
- package/dist/src/common/writer.js +108 -0
- package/dist/src/common/writer.js.map +1 -0
- package/dist/src/common/xml.d.ts +245 -0
- package/dist/src/common/xml.d.ts.map +1 -0
- package/dist/src/common/xml.js +942 -0
- package/dist/src/common/xml.js.map +1 -0
- package/dist/src/formats/csv/exporter.d.ts +70 -0
- package/dist/src/formats/csv/exporter.d.ts.map +1 -0
- package/dist/src/formats/csv/exporter.js +682 -0
- package/dist/src/formats/csv/exporter.js.map +1 -0
- package/dist/src/formats/csv/header.d.ts +66 -0
- package/dist/src/formats/csv/header.d.ts.map +1 -0
- package/dist/src/formats/csv/header.js +152 -0
- package/dist/src/formats/csv/header.js.map +1 -0
- package/dist/src/formats/csv/importer.d.ts +82 -0
- package/dist/src/formats/csv/importer.d.ts.map +1 -0
- package/dist/src/formats/csv/importer.js +849 -0
- package/dist/src/formats/csv/importer.js.map +1 -0
- package/dist/src/formats/csv/index.d.ts +60 -0
- package/dist/src/formats/csv/index.d.ts.map +1 -0
- package/dist/src/formats/csv/index.js +63 -0
- package/dist/src/formats/csv/index.js.map +1 -0
- package/dist/src/formats/csv/records.d.ts +188 -0
- package/dist/src/formats/csv/records.d.ts.map +1 -0
- package/dist/src/formats/csv/records.js +702 -0
- package/dist/src/formats/csv/records.js.map +1 -0
- package/dist/src/formats/csv/values.d.ts +105 -0
- package/dist/src/formats/csv/values.d.ts.map +1 -0
- package/dist/src/formats/csv/values.js +192 -0
- package/dist/src/formats/csv/values.js.map +1 -0
- package/dist/src/formats/dot/exporter.d.ts +52 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -0
- package/dist/src/formats/dot/exporter.js +836 -0
- package/dist/src/formats/dot/exporter.js.map +1 -0
- package/dist/src/formats/dot/importer.d.ts +102 -0
- package/dist/src/formats/dot/importer.d.ts.map +1 -0
- package/dist/src/formats/dot/importer.js +1291 -0
- package/dist/src/formats/dot/importer.js.map +1 -0
- package/dist/src/formats/dot/index.d.ts +7 -0
- package/dist/src/formats/dot/index.d.ts.map +1 -0
- package/dist/src/formats/dot/index.js +7 -0
- package/dist/src/formats/dot/index.js.map +1 -0
- package/dist/src/formats/dot/names.d.ts +29 -0
- package/dist/src/formats/dot/names.d.ts.map +1 -0
- package/dist/src/formats/dot/names.js +28 -0
- package/dist/src/formats/dot/names.js.map +1 -0
- package/dist/src/formats/dot/tokenizer.d.ts +114 -0
- package/dist/src/formats/dot/tokenizer.d.ts.map +1 -0
- package/dist/src/formats/dot/tokenizer.js +341 -0
- package/dist/src/formats/dot/tokenizer.js.map +1 -0
- package/dist/src/formats/gexf/exporter.d.ts +56 -0
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -0
- package/dist/src/formats/gexf/exporter.js +1395 -0
- package/dist/src/formats/gexf/exporter.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +73 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -0
- package/dist/src/formats/gexf/importer.js +1880 -0
- package/dist/src/formats/gexf/importer.js.map +1 -0
- package/dist/src/formats/gexf/index.d.ts +96 -0
- package/dist/src/formats/gexf/index.d.ts.map +1 -0
- package/dist/src/formats/gexf/index.js +97 -0
- package/dist/src/formats/gexf/index.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts +135 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -0
- package/dist/src/formats/gexf/schema.js +323 -0
- package/dist/src/formats/gexf/schema.js.map +1 -0
- package/dist/src/formats/gml/exporter.d.ts +69 -0
- package/dist/src/formats/gml/exporter.d.ts.map +1 -0
- package/dist/src/formats/gml/exporter.js +1093 -0
- package/dist/src/formats/gml/exporter.js.map +1 -0
- package/dist/src/formats/gml/importer.d.ts +66 -0
- package/dist/src/formats/gml/importer.d.ts.map +1 -0
- package/dist/src/formats/gml/importer.js +1331 -0
- package/dist/src/formats/gml/importer.js.map +1 -0
- package/dist/src/formats/gml/index.d.ts +85 -0
- package/dist/src/formats/gml/index.d.ts.map +1 -0
- package/dist/src/formats/gml/index.js +88 -0
- package/dist/src/formats/gml/index.js.map +1 -0
- package/dist/src/formats/gml/syntax.d.ts +186 -0
- package/dist/src/formats/gml/syntax.d.ts.map +1 -0
- package/dist/src/formats/gml/syntax.js +467 -0
- package/dist/src/formats/gml/syntax.js.map +1 -0
- package/dist/src/formats/graphml/constants.d.ts +169 -0
- package/dist/src/formats/graphml/constants.d.ts.map +1 -0
- package/dist/src/formats/graphml/constants.js +165 -0
- package/dist/src/formats/graphml/constants.js.map +1 -0
- package/dist/src/formats/graphml/exporter.d.ts +34 -0
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -0
- package/dist/src/formats/graphml/exporter.js +1176 -0
- package/dist/src/formats/graphml/exporter.js.map +1 -0
- package/dist/src/formats/graphml/importer.d.ts +31 -0
- package/dist/src/formats/graphml/importer.d.ts.map +1 -0
- package/dist/src/formats/graphml/importer.js +1607 -0
- package/dist/src/formats/graphml/importer.js.map +1 -0
- package/dist/src/formats/graphml/index.d.ts +8 -0
- package/dist/src/formats/graphml/index.d.ts.map +1 -0
- package/dist/src/formats/graphml/index.js +8 -0
- package/dist/src/formats/graphml/index.js.map +1 -0
- package/dist/src/formats/graphml/tree.d.ts +72 -0
- package/dist/src/formats/graphml/tree.d.ts.map +1 -0
- package/dist/src/formats/graphml/tree.js +290 -0
- package/dist/src/formats/graphml/tree.js.map +1 -0
- package/dist/src/formats/json/dialect.d.ts +125 -0
- package/dist/src/formats/json/dialect.d.ts.map +1 -0
- package/dist/src/formats/json/dialect.js +262 -0
- package/dist/src/formats/json/dialect.js.map +1 -0
- package/dist/src/formats/json/exporter.d.ts +89 -0
- package/dist/src/formats/json/exporter.d.ts.map +1 -0
- package/dist/src/formats/json/exporter.js +1358 -0
- package/dist/src/formats/json/exporter.js.map +1 -0
- package/dist/src/formats/json/importer.d.ts +108 -0
- package/dist/src/formats/json/importer.d.ts.map +1 -0
- package/dist/src/formats/json/importer.js +1838 -0
- package/dist/src/formats/json/importer.js.map +1 -0
- package/dist/src/formats/json/index.d.ts +8 -0
- package/dist/src/formats/json/index.d.ts.map +1 -0
- package/dist/src/formats/json/index.js +8 -0
- package/dist/src/formats/json/index.js.map +1 -0
- package/dist/src/formats/neo4j/exporter.d.ts +68 -0
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -0
- package/dist/src/formats/neo4j/exporter.js +1055 -0
- package/dist/src/formats/neo4j/exporter.js.map +1 -0
- package/dist/src/formats/neo4j/header.d.ts +52 -0
- package/dist/src/formats/neo4j/header.d.ts.map +1 -0
- package/dist/src/formats/neo4j/header.js +131 -0
- package/dist/src/formats/neo4j/header.js.map +1 -0
- package/dist/src/formats/neo4j/importer.d.ts +73 -0
- package/dist/src/formats/neo4j/importer.d.ts.map +1 -0
- package/dist/src/formats/neo4j/importer.js +932 -0
- package/dist/src/formats/neo4j/importer.js.map +1 -0
- package/dist/src/formats/neo4j/index.d.ts +79 -0
- package/dist/src/formats/neo4j/index.d.ts.map +1 -0
- package/dist/src/formats/neo4j/index.js +83 -0
- package/dist/src/formats/neo4j/index.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts +58 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -0
- package/dist/src/formats/pajek/exporter.js +825 -0
- package/dist/src/formats/pajek/exporter.js.map +1 -0
- package/dist/src/formats/pajek/importer.d.ts +88 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -0
- package/dist/src/formats/pajek/importer.js +1047 -0
- package/dist/src/formats/pajek/importer.js.map +1 -0
- package/dist/src/formats/pajek/index.d.ts +7 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -0
- package/dist/src/formats/pajek/index.js +7 -0
- package/dist/src/formats/pajek/index.js.map +1 -0
- package/dist/src/formats/pajek/syntax.d.ts +112 -0
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -0
- package/dist/src/formats/pajek/syntax.js +269 -0
- package/dist/src/formats/pajek/syntax.js.map +1 -0
- package/dist/src/index.d.ts +35 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +39 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/registry.d.ts +207 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js +481 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/sniff.d.ts +104 -0
- package/dist/src/sniff.d.ts.map +1 -0
- package/dist/src/sniff.js +357 -0
- package/dist/src/sniff.js.map +1 -0
- package/dist/src/types.d.ts +238 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +29 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +122 -7
- package/src/children.ts +335 -0
- package/src/common/attributes.ts +520 -0
- package/src/common/codes.ts +153 -0
- package/src/common/declared-types.ts +374 -0
- package/src/common/direction.ts +518 -0
- package/src/common/escape.ts +231 -0
- package/src/common/export.ts +817 -0
- package/src/common/format.ts +111 -0
- package/src/common/ids.ts +176 -0
- package/src/common/input.ts +378 -0
- package/src/common/lists.ts +196 -0
- package/src/common/options.ts +377 -0
- package/src/common/report.ts +352 -0
- package/src/common/temporal.ts +302 -0
- package/src/common/text.ts +294 -0
- package/src/common/weights.ts +202 -0
- package/src/common/writer.ts +123 -0
- package/src/common/xml.ts +1053 -0
- package/src/formats/csv/exporter.ts +894 -0
- package/src/formats/csv/header.ts +172 -0
- package/src/formats/csv/importer.ts +1104 -0
- package/src/formats/csv/index.ts +88 -0
- package/src/formats/csv/records.ts +813 -0
- package/src/formats/csv/values.ts +224 -0
- package/src/formats/dot/exporter.ts +1014 -0
- package/src/formats/dot/importer.ts +1549 -0
- package/src/formats/dot/index.ts +7 -0
- package/src/formats/dot/names.ts +40 -0
- package/src/formats/dot/tokenizer.ts +384 -0
- package/src/formats/gexf/exporter.ts +1696 -0
- package/src/formats/gexf/importer.ts +2333 -0
- package/src/formats/gexf/index.ts +142 -0
- package/src/formats/gexf/schema.ts +361 -0
- package/src/formats/gml/exporter.ts +1404 -0
- package/src/formats/gml/importer.ts +1591 -0
- package/src/formats/gml/index.ts +128 -0
- package/src/formats/gml/syntax.ts +545 -0
- package/src/formats/graphml/constants.ts +225 -0
- package/src/formats/graphml/exporter.ts +1458 -0
- package/src/formats/graphml/importer.ts +2027 -0
- package/src/formats/graphml/index.ts +8 -0
- package/src/formats/graphml/tree.ts +318 -0
- package/src/formats/json/dialect.ts +317 -0
- package/src/formats/json/exporter.ts +1616 -0
- package/src/formats/json/importer.ts +2271 -0
- package/src/formats/json/index.ts +8 -0
- package/src/formats/neo4j/exporter.ts +1287 -0
- package/src/formats/neo4j/header.ts +156 -0
- package/src/formats/neo4j/importer.ts +1220 -0
- package/src/formats/neo4j/index.ts +116 -0
- package/src/formats/pajek/exporter.ts +1000 -0
- package/src/formats/pajek/importer.ts +1311 -0
- package/src/formats/pajek/index.ts +7 -0
- package/src/formats/pajek/syntax.ts +307 -0
- package/src/index.ts +244 -0
- package/src/registry.ts +617 -0
- package/src/sniff.ts +397 -0
- package/src/types.ts +262 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The children CSR over a containment column (design sections 5.10, 7.1 and 8.2): containment
|
|
3
|
+
* (GEXF `pid` / `<parents>`, Cytoscape `parent`, DOT clusters, GraphML nested graphs) is a node
|
|
4
|
+
* column with the `parent` role (u32, refersTo node) or the `parents` role (list of u32) and never
|
|
5
|
+
* enters the CSR of the snapshot. Importers and exporters that need to walk containers top-down
|
|
6
|
+
* (nested subgraphs, cluster blocks, parent lists) build this inverse index once: for every node
|
|
7
|
+
* `u`, `children[rowPtr[u] .. rowPtr[u + 1])` are its children in ascending index order, `roots`
|
|
8
|
+
* are the nodes with no parent, and `depthFirst()` is the pre-order the nested writers use.
|
|
9
|
+
*
|
|
10
|
+
* The helper is deliberately outside the core (7.1: it computes a property the arrays do not
|
|
11
|
+
* already imply and only io needs it). A reference is ignored when it is unset, INVALID_INDEX, out
|
|
12
|
+
* of range, or the node itself; a cycle (a parent chain that never reaches a root) is reported
|
|
13
|
+
* through `unreachable` and its members are appended to the depth-first order in index order so
|
|
14
|
+
* every node is written exactly once.
|
|
15
|
+
*/
|
|
16
|
+
import { INVALID_INDEX } from "@graphty/graph-format";
|
|
17
|
+
/**
|
|
18
|
+
* The children CSR of a snapshot's containment column (design sections 5.10 and 7.1): the inverse
|
|
19
|
+
* of the parent relation as a compressed sparse row structure over node indices.
|
|
20
|
+
*/
|
|
21
|
+
export class ChildrenCsr {
|
|
22
|
+
/**
|
|
23
|
+
* Build the CSR; use childrenCsr() rather than the constructor.
|
|
24
|
+
* @param nodeCount - the node count
|
|
25
|
+
* @param rowPtr - the row pointers
|
|
26
|
+
* @param children - the child list
|
|
27
|
+
* @param parentCount - parents per node (0 for a root)
|
|
28
|
+
* @param dropped - references ignored
|
|
29
|
+
* @param column - the source column, or null
|
|
30
|
+
*/
|
|
31
|
+
constructor(nodeCount, rowPtr, children, parentCount, dropped, column) {
|
|
32
|
+
this.nodeCount = nodeCount;
|
|
33
|
+
this.rowPtr = rowPtr;
|
|
34
|
+
this.children = children;
|
|
35
|
+
this.parentCount = parentCount;
|
|
36
|
+
this.edgeCount = children.length;
|
|
37
|
+
this.dropped = dropped;
|
|
38
|
+
this.column = column;
|
|
39
|
+
let rootCount = 0;
|
|
40
|
+
for (let u = 0; u < nodeCount; u++) {
|
|
41
|
+
if (parentCount[u] === 0) {
|
|
42
|
+
rootCount++;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const roots = new Uint32Array(rootCount);
|
|
46
|
+
let r = 0;
|
|
47
|
+
for (let u = 0; u < nodeCount; u++) {
|
|
48
|
+
if (parentCount[u] === 0) {
|
|
49
|
+
roots[r++] = u;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
this.roots = roots;
|
|
53
|
+
this.unreachable = nodeCount - this.reachableCount();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The children of a node, as a view into `children` (do not modify).
|
|
57
|
+
* @param node - the node index
|
|
58
|
+
* @returns the child indices in ascending order; empty for a leaf
|
|
59
|
+
*/
|
|
60
|
+
childrenOf(node) {
|
|
61
|
+
return this.children.subarray(this.rowPtr[node], this.rowPtr[node + 1]);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* How many children a node has.
|
|
65
|
+
* @param node - the node index
|
|
66
|
+
* @returns the count
|
|
67
|
+
*/
|
|
68
|
+
childCount(node) {
|
|
69
|
+
return this.rowPtr[node + 1] - this.rowPtr[node];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Whether a node is a container (has at least one child).
|
|
73
|
+
* @param node - the node index
|
|
74
|
+
* @returns true when it has children
|
|
75
|
+
*/
|
|
76
|
+
hasChildren(node) {
|
|
77
|
+
return this.rowPtr[node + 1] > this.rowPtr[node];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* How many parents a node has: 0 for a root, 1 under a `parent` column, any number under `parents`.
|
|
81
|
+
* @param node - the node index
|
|
82
|
+
* @returns the parent count
|
|
83
|
+
*/
|
|
84
|
+
parentCountOf(node) {
|
|
85
|
+
return this.parentCount[node];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Whether a node has no parent.
|
|
89
|
+
* @param node - the node index
|
|
90
|
+
* @returns true for a root
|
|
91
|
+
*/
|
|
92
|
+
isRoot(node) {
|
|
93
|
+
return this.parentCount[node] === 0;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Whether the snapshot has any containment at all.
|
|
97
|
+
* @returns true when at least one child reference was kept
|
|
98
|
+
*/
|
|
99
|
+
isEmpty() {
|
|
100
|
+
return this.edgeCount === 0;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A pre-order depth-first traversal from the roots in index order (children in ascending
|
|
104
|
+
* order), then every node not yet visited (a cycle member, or a multi-parent node reached
|
|
105
|
+
* only through a cycle) in index order at depth 0. Each node appears exactly once, so nested
|
|
106
|
+
* writers emit every element once even for a `parents` column that shares a child.
|
|
107
|
+
* @returns the order, the depth of every node and whether the order differs from index order
|
|
108
|
+
*/
|
|
109
|
+
depthFirst() {
|
|
110
|
+
const n = this.nodeCount;
|
|
111
|
+
const order = new Uint32Array(n);
|
|
112
|
+
const depth = new Uint32Array(n);
|
|
113
|
+
const visited = new Uint8Array(n);
|
|
114
|
+
const stackNode = [];
|
|
115
|
+
const stackCursor = [];
|
|
116
|
+
let position = 0;
|
|
117
|
+
let reordered = false;
|
|
118
|
+
const place = (u, d) => {
|
|
119
|
+
visited[u] = 1;
|
|
120
|
+
if (u !== position) {
|
|
121
|
+
reordered = true;
|
|
122
|
+
}
|
|
123
|
+
order[position++] = u;
|
|
124
|
+
depth[u] = d;
|
|
125
|
+
};
|
|
126
|
+
const visit = (root) => {
|
|
127
|
+
place(root, 0);
|
|
128
|
+
stackNode.push(root);
|
|
129
|
+
stackCursor.push(this.rowPtr[root]);
|
|
130
|
+
while (stackNode.length > 0) {
|
|
131
|
+
const top = stackNode.length - 1;
|
|
132
|
+
const u = stackNode[top];
|
|
133
|
+
const cursor = stackCursor[top];
|
|
134
|
+
if (cursor >= this.rowPtr[u + 1]) {
|
|
135
|
+
stackNode.pop();
|
|
136
|
+
stackCursor.pop();
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
stackCursor[top] = cursor + 1;
|
|
140
|
+
const v = this.children[cursor];
|
|
141
|
+
if (visited[v] === 1) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
place(v, stackNode.length);
|
|
145
|
+
stackNode.push(v);
|
|
146
|
+
stackCursor.push(this.rowPtr[v]);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
for (const root of this.roots) {
|
|
150
|
+
visit(root);
|
|
151
|
+
}
|
|
152
|
+
for (let u = 0; u < n; u++) {
|
|
153
|
+
if (visited[u] === 0) {
|
|
154
|
+
visit(u);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { order, depth, reordered };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The nodes reachable from the roots by following child references.
|
|
161
|
+
* @returns how many nodes a traversal from the roots reaches
|
|
162
|
+
*/
|
|
163
|
+
reachableCount() {
|
|
164
|
+
const visited = new Uint8Array(this.nodeCount);
|
|
165
|
+
// every node is pushed at most once, so a stack of nodeCount entries never overflows
|
|
166
|
+
const stack = new Uint32Array(this.nodeCount);
|
|
167
|
+
let top = 0;
|
|
168
|
+
let count = 0;
|
|
169
|
+
for (const root of this.roots) {
|
|
170
|
+
visited[root] = 1;
|
|
171
|
+
count++;
|
|
172
|
+
stack[top++] = root;
|
|
173
|
+
while (top > 0) {
|
|
174
|
+
const u = stack[--top];
|
|
175
|
+
for (let k = this.rowPtr[u]; k < this.rowPtr[u + 1]; k++) {
|
|
176
|
+
const v = this.children[k];
|
|
177
|
+
if (visited[v] === 0) {
|
|
178
|
+
visited[v] = 1;
|
|
179
|
+
count++;
|
|
180
|
+
stack[top++] = v;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return count;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Build the children CSR of a snapshot (design section 7.1: a graph-io helper, not a core view).
|
|
190
|
+
* @param snapshot - the snapshot
|
|
191
|
+
* @param options - which column to read; the `parent` role, then `parents`, by default
|
|
192
|
+
* @returns the CSR; empty (every node a root) when the snapshot has no containment column
|
|
193
|
+
*/
|
|
194
|
+
export function childrenCsr(snapshot, options = {}) {
|
|
195
|
+
const column = resolveColumn(snapshot, options.column === undefined ? "auto" : options.column);
|
|
196
|
+
return childrenFromColumn(snapshot.nodeCount, column);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Build the children CSR over one containment column without a snapshot (an importer that holds
|
|
200
|
+
* the column before freezing, a test).
|
|
201
|
+
* @param nodeCount - the node count the references index into
|
|
202
|
+
* @param column - a u32 `parent`-shaped column, a list-of-u32 `parents`-shaped column, or null for none
|
|
203
|
+
* @returns the CSR
|
|
204
|
+
*/
|
|
205
|
+
export function childrenFromColumn(nodeCount, column) {
|
|
206
|
+
const rowPtr = new Uint32Array(nodeCount + 1);
|
|
207
|
+
const parentCount = new Uint32Array(nodeCount);
|
|
208
|
+
let dropped = 0;
|
|
209
|
+
const references = [];
|
|
210
|
+
if (column !== null) {
|
|
211
|
+
const rows = Math.min(column.length, nodeCount);
|
|
212
|
+
const keep = (child, parent) => {
|
|
213
|
+
if (!Number.isInteger(parent) || parent === INVALID_INDEX || parent >= nodeCount || parent === child) {
|
|
214
|
+
dropped++;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
references.push(child, parent);
|
|
218
|
+
rowPtr[parent + 1]++;
|
|
219
|
+
parentCount[child]++;
|
|
220
|
+
};
|
|
221
|
+
if (column.dtype === "u32") {
|
|
222
|
+
const { data } = column;
|
|
223
|
+
for (let i = 0; i < rows; i++) {
|
|
224
|
+
if (column.isSet(i)) {
|
|
225
|
+
keep(i, data[i]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else if (column.dtype === "list") {
|
|
230
|
+
for (let i = 0; i < rows; i++) {
|
|
231
|
+
if (!column.isSet(i)) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
for (const item of column.sliceOf(i)) {
|
|
235
|
+
if (typeof item === "number") {
|
|
236
|
+
keep(i, item);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
dropped++;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
throw new TypeError(`a containment column must be u32 or a list of u32, found ${column.dtype} column "${column.meta.name}"`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
for (let u = 0; u < nodeCount; u++) {
|
|
249
|
+
rowPtr[u + 1] += rowPtr[u];
|
|
250
|
+
}
|
|
251
|
+
const children = new Uint32Array(rowPtr[nodeCount]);
|
|
252
|
+
const fill = rowPtr.slice(0, nodeCount);
|
|
253
|
+
// references were collected in ascending child order, so each parent's range fills ascending
|
|
254
|
+
for (let k = 0; k < references.length; k += 2) {
|
|
255
|
+
children[fill[references[k + 1]]++] = references[k];
|
|
256
|
+
}
|
|
257
|
+
return new ChildrenCsr(nodeCount, rowPtr, children, parentCount, dropped, column);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The column a ChildrenOptions selects.
|
|
261
|
+
* @param snapshot - the snapshot
|
|
262
|
+
* @param choice - the option value
|
|
263
|
+
* @returns the column, or null when the snapshot has none of that shape
|
|
264
|
+
*/
|
|
265
|
+
function resolveColumn(snapshot, choice) {
|
|
266
|
+
if (typeof choice !== "string") {
|
|
267
|
+
return choice;
|
|
268
|
+
}
|
|
269
|
+
if (choice === "parent" || choice === "parents") {
|
|
270
|
+
return snapshot.nodes.byRole(choice);
|
|
271
|
+
}
|
|
272
|
+
return snapshot.nodes.byRole("parent") ?? snapshot.nodes.byRole("parents");
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"children.js","sourceRoot":"","sources":["../../src/children.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attribute declaration shared by the typed importers (design sections 5.1, 5.5 and 5.6): turn a
|
|
3
|
+
* GEXF `<attribute>`, a GraphML `<key>` or a Neo4j header column into a ColumnDecl with the right
|
|
4
|
+
* dtype, default, options and origin metadata; parse values (scalars and lists) by the declaration;
|
|
5
|
+
* derive the deterministic `<name>#<origin.id>` name when a declared name collides; and the dict
|
|
6
|
+
* heuristic of design section 5.4.
|
|
7
|
+
*
|
|
8
|
+
* Naming rule (design section 5.6): a column's name is the GEXF `title` / GraphML `attr.name`,
|
|
9
|
+
* falling back to the attribute `id` when the title is absent; `origin.id` always keeps the source
|
|
10
|
+
* id and `origin.title` the title when it differs from the resolved name.
|
|
11
|
+
*/
|
|
12
|
+
import { type ColumnDecl, type ColumnHandle, type ColumnRole, type GraphSink } from "@graphty/graph-format";
|
|
13
|
+
import { type IssueCategory } from "../types.js";
|
|
14
|
+
import { BAD_DEFAULT_CODE, BAD_OPTIONS_CODE, PRECISION_CODE, ROLE_TAKEN_CODE } from "./codes.js";
|
|
15
|
+
import { type DeclaredTypeSpec, type DeclaringFormat } from "./declared-types.js";
|
|
16
|
+
import { type ListSyntax } from "./lists.js";
|
|
17
|
+
import { type ImportReportBuilder, type IssueLocation } from "./report.js";
|
|
18
|
+
import { type TemporalValue } from "./temporal.js";
|
|
19
|
+
/**
|
|
20
|
+
* What an importer knows about a declared attribute.
|
|
21
|
+
* Consumed by the per-format importers and exporters under src/formats.
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export interface AttributeDeclarationInput {
|
|
25
|
+
/** The declaring format. */
|
|
26
|
+
readonly format: DeclaringFormat;
|
|
27
|
+
/** The attribute id (GEXF `id`, GraphML key `id`, Neo4j header name); null when the format has none. */
|
|
28
|
+
readonly id: string | null;
|
|
29
|
+
/** The GEXF `title` / GraphML `attr.name`; null when absent (yFiles keys omit it). */
|
|
30
|
+
readonly title: string | null;
|
|
31
|
+
/** The declared type text; null for an untyped declaration (stored as string). */
|
|
32
|
+
readonly type: string | null;
|
|
33
|
+
/** The declaring namespace ("viz", "yfiles", "neo4j"), or null. */
|
|
34
|
+
readonly namespace?: string | null | undefined;
|
|
35
|
+
/** The `<default>` text, or null. */
|
|
36
|
+
readonly defaultText?: string | null | undefined;
|
|
37
|
+
/** The GEXF `<options>` text, or null. */
|
|
38
|
+
readonly optionsText?: string | null | undefined;
|
|
39
|
+
/** The list syntax of defaults, options and values; "gexf" by default. */
|
|
40
|
+
readonly listSyntax?: ListSyntax | undefined;
|
|
41
|
+
/** A role to give the column, or null. */
|
|
42
|
+
readonly role?: ColumnRole | null | undefined;
|
|
43
|
+
/** Whether the attribute is dynamic (GEXF mode="dynamic"). */
|
|
44
|
+
readonly dynamic?: boolean | undefined;
|
|
45
|
+
/** The importer's `long` option. */
|
|
46
|
+
readonly long: "f64" | "string";
|
|
47
|
+
/** Whether a column name is already taken in the target table; drives the `#id` rename. */
|
|
48
|
+
readonly taken?: ((name: string) => boolean) | undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A non-fatal problem with a declaration, for the importer to record as a warning.
|
|
52
|
+
* Consumed by the per-format importers and exporters under src/formats.
|
|
53
|
+
* @public
|
|
54
|
+
*/
|
|
55
|
+
export interface DeclarationIssue {
|
|
56
|
+
/** The issue category. */
|
|
57
|
+
readonly category: IssueCategory;
|
|
58
|
+
/** The stable code. */
|
|
59
|
+
readonly code: string;
|
|
60
|
+
/** A plain-ASCII message. */
|
|
61
|
+
readonly message: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A declared attribute: the ColumnDecl to push, the spec to parse values with, and what to report.
|
|
65
|
+
* Consumed by the per-format importers and exporters under src/formats.
|
|
66
|
+
* @public
|
|
67
|
+
*/
|
|
68
|
+
export interface DeclaredAttribute {
|
|
69
|
+
/** The declaration for declareNodeColumn / declareEdgeColumn. */
|
|
70
|
+
readonly decl: ColumnDecl;
|
|
71
|
+
/** How values are parsed. */
|
|
72
|
+
readonly spec: DeclaredTypeSpec;
|
|
73
|
+
/** The list syntax values are split with. */
|
|
74
|
+
readonly listSyntax: ListSyntax;
|
|
75
|
+
/** The companion text column of a temporal attribute (design section 5.1), or null. */
|
|
76
|
+
readonly companion: ColumnDecl | null;
|
|
77
|
+
/** Whether the name received the `#id` suffix. */
|
|
78
|
+
readonly renamed: boolean;
|
|
79
|
+
/** Problems the importer records as warnings (unknown type, unparsable default or options). */
|
|
80
|
+
readonly issues: readonly DeclarationIssue[];
|
|
81
|
+
}
|
|
82
|
+
/** Issue code: the declared type is not one the format defines; the column is kept as string. */
|
|
83
|
+
export declare const UNKNOWN_TYPE_CODE = "W_UNKNOWN_ATTR_TYPE";
|
|
84
|
+
/** Issue code: the column was renamed `<name>#<id>` because the name was taken (design section 5.6). */
|
|
85
|
+
export declare const RENAMED_CODE = "W_COLUMN_RENAMED";
|
|
86
|
+
export { BAD_DEFAULT_CODE, BAD_OPTIONS_CODE, PRECISION_CODE, ROLE_TAKEN_CODE };
|
|
87
|
+
/** Rows sampled before the dict heuristic decides (design section 5.4). */
|
|
88
|
+
export declare const DICT_SAMPLE_ROWS = 1024;
|
|
89
|
+
/**
|
|
90
|
+
* Build the column declaration of a declared attribute.
|
|
91
|
+
* @param input - what the file declares
|
|
92
|
+
* @returns the declaration, the value spec and any warnings to record
|
|
93
|
+
*/
|
|
94
|
+
export declare function declareAttribute(input: AttributeDeclarationInput): DeclaredAttribute;
|
|
95
|
+
/**
|
|
96
|
+
* Parse a value text by a declaration: a scalar, or a list split by the syntax with each item
|
|
97
|
+
* parsed by the item kind.
|
|
98
|
+
* @param text - the value text
|
|
99
|
+
* @param spec - the declared type
|
|
100
|
+
* @param listSyntax - the list syntax
|
|
101
|
+
* @returns the value to push (a boolean, a number, a string, a JSON value or an array)
|
|
102
|
+
*/
|
|
103
|
+
export declare function parseDeclaredValue(text: string, spec: DeclaredTypeSpec, listSyntax: ListSyntax): unknown;
|
|
104
|
+
/**
|
|
105
|
+
* Parse a temporal value text by a declaration, keeping the source text when its canonical form
|
|
106
|
+
* differs (for the companion column).
|
|
107
|
+
* @param text - the value text
|
|
108
|
+
* @param spec - a scalar temporal spec
|
|
109
|
+
* @returns the value and the text to keep, or null text
|
|
110
|
+
*/
|
|
111
|
+
export declare function parseDeclaredTemporal(text: string, spec: DeclaredTypeSpec): TemporalValue;
|
|
112
|
+
/**
|
|
113
|
+
* Whether a long value's text lost precision when parsed to f64 (design section 5.1: a value with
|
|
114
|
+
* |v| > 2^53 is stored as the nearest f64 and recorded as a `precision` issue). Decided from the
|
|
115
|
+
* text, since the parsed number alone cannot tell 2^53 from 2^53 + 1.
|
|
116
|
+
* @param spec - the declared type
|
|
117
|
+
* @param text - the value text (trimmed or not)
|
|
118
|
+
* @returns true when the importer should record a `precision` issue
|
|
119
|
+
*/
|
|
120
|
+
export declare function losesPrecision(spec: DeclaredTypeSpec, text: string): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Declare a column on the sink for one domain.
|
|
123
|
+
* @param sink - the sink
|
|
124
|
+
* @param domain - node or edge
|
|
125
|
+
* @param decl - the declaration
|
|
126
|
+
* @returns the column handle
|
|
127
|
+
*/
|
|
128
|
+
export declare function declareOn(sink: GraphSink, domain: "node" | "edge", decl: ColumnDecl): ColumnHandle;
|
|
129
|
+
/**
|
|
130
|
+
* The outcome of declareResolved(): the handle and the declaration as it was applied.
|
|
131
|
+
* Consumed by the per-format importers under src/formats.
|
|
132
|
+
* @public
|
|
133
|
+
*/
|
|
134
|
+
export interface ResolvedDeclaration {
|
|
135
|
+
/** The column handle. */
|
|
136
|
+
readonly handle: ColumnHandle;
|
|
137
|
+
/** The declaration as applied (its name and role may differ from the request). */
|
|
138
|
+
readonly decl: ColumnDecl;
|
|
139
|
+
/** Whether the column was renamed `<name>#<id>` (W_COLUMN_RENAMED recorded). */
|
|
140
|
+
readonly renamed: boolean;
|
|
141
|
+
/** Whether the role was dropped because the table already holds it (W_ROLE_TAKEN recorded). */
|
|
142
|
+
readonly roleDropped: boolean;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The io rule of design section 5.6 in one place, so every importer agrees: declare a column on
|
|
146
|
+
* the sink and, when the sink already holds the name with another shape (an earlier import, a
|
|
147
|
+
* caller's column), rename it `<name>#<origin.id>` (a counter when the source has no id) and
|
|
148
|
+
* record W_COLUMN_RENAMED (coercion); when the table already holds the role (design section 5.5:
|
|
149
|
+
* at most one column per role), declare without the role and record W_ROLE_TAKEN (coercion). The
|
|
150
|
+
* same shape under the same name returns the existing handle, as the sink does.
|
|
151
|
+
* @param sink - the sink
|
|
152
|
+
* @param domain - node or edge
|
|
153
|
+
* @param decl - the wanted declaration
|
|
154
|
+
* @param report - the report the coercion issues are recorded in
|
|
155
|
+
* @param where - the line and element, when known
|
|
156
|
+
* @returns the handle and the declaration as applied
|
|
157
|
+
*/
|
|
158
|
+
export declare function declareResolved(sink: GraphSink, domain: "node" | "edge", decl: ColumnDecl, report: ImportReportBuilder, where?: IssueLocation): ResolvedDeclaration;
|
|
159
|
+
/**
|
|
160
|
+
* Declare the companion text column of a temporal column (design section 5.1). A table holds at
|
|
161
|
+
* most one column per role, so when another companion already carries `timeText` this one is
|
|
162
|
+
* declared without the role (reported once per table); exporters find every companion through
|
|
163
|
+
* `extra.for`.
|
|
164
|
+
* @param sink - the sink
|
|
165
|
+
* @param domain - node or edge
|
|
166
|
+
* @param companion - the declaration from declareAttribute()
|
|
167
|
+
* @param report - the report the role loss is recorded in; when omitted the loss is silent
|
|
168
|
+
* @returns the column handle
|
|
169
|
+
*/
|
|
170
|
+
export declare function declareCompanion(sink: GraphSink, domain: "node" | "edge", companion: ColumnDecl, report?: ImportReportBuilder): ColumnHandle;
|
|
171
|
+
/**
|
|
172
|
+
* Whether a column name is taken in a sink's table, the usual `taken` callback.
|
|
173
|
+
* @param sink - the sink
|
|
174
|
+
* @param domain - node or edge
|
|
175
|
+
* @returns a predicate over column names
|
|
176
|
+
*/
|
|
177
|
+
export declare function takenIn(sink: GraphSink, domain: "node" | "edge"): (name: string) => boolean;
|
|
178
|
+
/**
|
|
179
|
+
* The deterministic name of a declared attribute whose preferred name is taken (design section
|
|
180
|
+
* 5.6): `<name>#<origin.id>`, and `<name>#<origin.id>#2`, `#3`... should that be taken as well.
|
|
181
|
+
* @param name - the preferred name
|
|
182
|
+
* @param id - the source id (the attribute id or key id); null falls back to a counter
|
|
183
|
+
* @param taken - whether a name is already used in the table
|
|
184
|
+
* @returns a free name
|
|
185
|
+
*/
|
|
186
|
+
export declare function uniqueColumnName(name: string, id: string | null, taken: (name: string) => boolean): string;
|
|
187
|
+
/**
|
|
188
|
+
* The dict heuristic of design section 5.4 for an untyped string column: observe values until the
|
|
189
|
+
* sample is full; the column is a dict when the distinct count stays below half the rows, a string
|
|
190
|
+
* otherwise. The importer buffers the sampled values and declares the column on the decision.
|
|
191
|
+
*/
|
|
192
|
+
export declare class DictHeuristic {
|
|
193
|
+
private readonly distinct;
|
|
194
|
+
private rowsSeen;
|
|
195
|
+
private readonly sampleRows;
|
|
196
|
+
/**
|
|
197
|
+
* Create a heuristic.
|
|
198
|
+
* @param sampleRows - rows observed before deciding; DICT_SAMPLE_ROWS by default
|
|
199
|
+
*/
|
|
200
|
+
constructor(sampleRows?: number);
|
|
201
|
+
/**
|
|
202
|
+
* Rows observed so far.
|
|
203
|
+
* @returns the count
|
|
204
|
+
*/
|
|
205
|
+
get rows(): number;
|
|
206
|
+
/**
|
|
207
|
+
* Distinct values observed so far.
|
|
208
|
+
* @returns the count
|
|
209
|
+
*/
|
|
210
|
+
get distinctCount(): number;
|
|
211
|
+
/**
|
|
212
|
+
* Whether the sample is full.
|
|
213
|
+
* @returns true once sampleRows values were observed
|
|
214
|
+
*/
|
|
215
|
+
get decided(): boolean;
|
|
216
|
+
/**
|
|
217
|
+
* Observe one value.
|
|
218
|
+
* @param value - the value text
|
|
219
|
+
* @returns true when this observation completed the sample
|
|
220
|
+
*/
|
|
221
|
+
observe(value: string): boolean;
|
|
222
|
+
/**
|
|
223
|
+
* The dtype the sample suggests: dict when the distinct count is below rows / 2 (and at least
|
|
224
|
+
* one row was seen), string otherwise. Valid before the sample is full (end of input).
|
|
225
|
+
* @returns "dict" or "string"
|
|
226
|
+
*/
|
|
227
|
+
decide(): "dict" | "string";
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../../src/common/attributes.ts"],"names":[],"mappings":"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"}
|