Skip to content

Commit e95f70a

Browse files
Adjusting endpoint
1 parent b43a483 commit e95f70a

File tree

3 files changed

+140
-149
lines changed

3 files changed

+140
-149
lines changed

api/src/main/java/marquez/api/LineageKindsResource.java

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import com.codahale.metrics.annotation.ExceptionMetered;
1111
import com.codahale.metrics.annotation.ResponseMetered;
1212
import com.codahale.metrics.annotation.Timed;
13-
import java.net.URLDecoder;
1413
import java.io.UnsupportedEncodingException;
14+
import java.net.URLDecoder;
1515
import java.util.Map;
1616
import javax.validation.constraints.Min;
1717
import javax.validation.constraints.NotNull;
@@ -24,13 +24,14 @@
2424
import javax.ws.rs.core.Response;
2525
import lombok.NonNull;
2626
import lombok.extern.slf4j.Slf4j;
27-
import marquez.service.ServiceFactory;
2827
import marquez.service.LineageKindsService;
2928
import marquez.service.NodeIdNotFoundException;
30-
import marquez.service.models.LineageKindsModels.*;
29+
import marquez.service.ServiceFactory;
30+
import marquez.service.models.LineageKindsModels.LineageGraphKind;
31+
import marquez.service.models.LineageKindsModels.LineageGraphKindList;
3132

3233
@Slf4j
33-
@Path("/api/graphs/v1alpha1")
34+
@Path("/api/v1/alpha")
3435
public class LineageKindsResource extends BaseResource {
3536

3637
private final LineageKindsService lineageKindsService;
@@ -41,8 +42,8 @@ public LineageKindsResource(@NonNull final ServiceFactory serviceFactory) {
4142
}
4243

4344
/**
44-
* Get lineage kinds using GET with path parameters
45-
* Example: GET /api/graphs/v1alpha1/kinds/dataset%3Abrazil-operations.smart-efficiency%3Adataset.ae-training-case-andre-brito?depth=2
45+
* Get lineage kinds using GET with path parameters Example: GET
46+
* /api/graphs/v1alpha1/kinds/dataset%3Abrazil-operations.smart-efficiency%3Adataset.ae-training-case-andre-brito?depth=2
4647
*/
4748
@Timed
4849
@ResponseMetered
@@ -54,7 +55,7 @@ public Response getLineageKinds(
5455
@PathParam("nodeId") @NotNull String nodeId,
5556
@QueryParam("depth") @DefaultValue("1") int depth,
5657
@QueryParam("includeMetadata") @DefaultValue("true") boolean includeMetadata) {
57-
58+
5859
try {
5960
// URL decode the nodeId since it contains special characters like colons
6061
String decodedNodeId;
@@ -66,15 +67,15 @@ public Response getLineageKinds(
6667
.entity(Map.of("error", "Invalid nodeId encoding", "nodeId", nodeId))
6768
.build();
6869
}
69-
70+
7071
log.info("Getting lineage kinds for nodeId: {}", decodedNodeId);
71-
72+
7273
// Delegate to service
73-
LineageGraphKind lineageGraphKind = lineageKindsService.convertToLineageGraphKind(
74-
decodedNodeId, depth, includeMetadata);
75-
74+
LineageGraphKind lineageGraphKind =
75+
lineageKindsService.convertToLineageGraphKind(decodedNodeId, depth, includeMetadata);
76+
7677
return Response.ok(lineageGraphKind).build();
77-
78+
7879
} catch (NodeIdNotFoundException e) {
7980
log.warn("NodeId not found: {}", nodeId);
8081
return Response.status(404)
@@ -89,8 +90,8 @@ public Response getLineageKinds(
8990
}
9091

9192
/**
92-
* Alternative endpoint using query parameter instead of path parameter
93-
* Example: GET /api/graphs/v1alpha1/kinds?nodeId=dataset:ai-private-banking.common:dataset.nusignals-stability-index-daily-categorization-time&depth=2
93+
* Alternative endpoint using query parameter instead of path parameter Example: GET
94+
* /api/graphs/v1alpha1/kinds?nodeId=dataset:ai-private-banking.common:dataset.nusignals-stability-index-daily-categorization-time&depth=2
9495
*/
9596
@Timed
9697
@ResponseMetered
@@ -102,16 +103,16 @@ public Response getLineageKindsByQuery(
102103
@QueryParam("nodeId") @NotNull String nodeId,
103104
@QueryParam("depth") @DefaultValue("1") int depth,
104105
@QueryParam("includeMetadata") @DefaultValue("true") boolean includeMetadata) {
105-
106+
106107
try {
107108
log.info("Getting lineage kinds for nodeId: {}", nodeId);
108-
109+
109110
// No need to URL decode since it's a query parameter
110-
LineageGraphKind lineageGraphKind = lineageKindsService.convertToLineageGraphKind(
111-
nodeId, depth, includeMetadata);
112-
111+
LineageGraphKind lineageGraphKind =
112+
lineageKindsService.convertToLineageGraphKind(nodeId, depth, includeMetadata);
113+
113114
return Response.ok(lineageGraphKind).build();
114-
115+
115116
} catch (NodeIdNotFoundException e) {
116117
log.warn("NodeId not found: {}", nodeId);
117118
return Response.status(404)
@@ -125,26 +126,23 @@ public Response getLineageKindsByQuery(
125126
}
126127
}
127128

128-
/**
129-
* Get a LineageGraph kind by name
130-
*/
129+
/** Get a LineageGraph kind by name */
131130
@Timed
132131
@ResponseMetered
133132
@ExceptionMetered
134133
@GET
135134
@Produces(APPLICATION_JSON)
136135
@Path("/lineage-graphs/{name}")
137136
public Response getLineageGraphKind(
138-
@PathParam("name") @NotNull String name,
139-
@QueryParam("depth") @DefaultValue("20") int depth) {
140-
137+
@PathParam("name") @NotNull String name, @QueryParam("depth") @DefaultValue("20") int depth) {
138+
141139
try {
142140
log.info("Getting lineage graph by name: {}", name);
143-
141+
144142
LineageGraphKind lineageGraphKind = lineageKindsService.getLineageGraphByName(name, depth);
145-
143+
146144
return Response.ok(lineageGraphKind).build();
147-
145+
148146
} catch (NodeIdNotFoundException e) {
149147
log.warn("LineageGraph not found: {}", name);
150148
return Response.status(404)
@@ -158,9 +156,7 @@ public Response getLineageGraphKind(
158156
}
159157
}
160158

161-
/**
162-
* List LineageGraph kinds with optional filtering
163-
*/
159+
/** List LineageGraph kinds with optional filtering */
164160
@Timed
165161
@ResponseMetered
166162
@ExceptionMetered
@@ -170,19 +166,20 @@ public Response getLineageGraphKind(
170166
public Response listLineageGraphKinds(
171167
@QueryParam("labelSelector") String labelSelector,
172168
@QueryParam("limit") @DefaultValue("50") @Min(1) int limit) {
173-
169+
174170
try {
175171
log.info("Listing lineage graphs with labelSelector: {}, limit: {}", labelSelector, limit);
176-
177-
LineageGraphKindList response = lineageKindsService.listLineageGraphKinds(labelSelector, limit);
178-
172+
173+
LineageGraphKindList response =
174+
lineageKindsService.listLineageGraphKinds(labelSelector, limit);
175+
179176
return Response.ok(response).build();
180-
177+
181178
} catch (Exception e) {
182179
log.error("Failed to list LineageGraph kinds", e);
183180
return Response.status(500)
184181
.entity(Map.of("error", "Failed to list lineage graphs", "message", e.getMessage()))
185182
.build();
186183
}
187184
}
188-
}
185+
}

api/src/main/java/marquez/service/LineageKindsService.java

Lines changed: 66 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,15 @@
1111
import java.util.stream.Collectors;
1212
import lombok.NonNull;
1313
import lombok.extern.slf4j.Slf4j;
14-
import marquez.service.models.LineageKindsModels.*;
1514
import marquez.service.models.Lineage;
15+
import marquez.service.models.LineageKindsModels.CentralNodeInfo;
16+
import marquez.service.models.LineageKindsModels.DataGovernance;
17+
import marquez.service.models.LineageKindsModels.DataObjectNodeSpec;
18+
import marquez.service.models.LineageKindsModels.KindMetadata;
19+
import marquez.service.models.LineageKindsModels.LineageGraphKind;
20+
import marquez.service.models.LineageKindsModels.LineageGraphKindList;
21+
import marquez.service.models.LineageKindsModels.LineageGraphSpec;
22+
import marquez.service.models.LineageKindsModels.ListMetadata;
1623
import marquez.service.models.Node;
1724
import marquez.service.models.NodeId;
1825

@@ -25,112 +32,98 @@ public LineageKindsService(@NonNull LineageService lineageService) {
2532
this.lineageService = lineageService;
2633
}
2734

28-
/**
29-
* Convert traditional Marquez lineage to LineageGraph kind format
30-
*/
35+
/** Convert traditional Marquez lineage to LineageGraph kind format */
3136
public LineageGraphKind convertToLineageGraphKind(
32-
@NonNull String nodeIdValue,
33-
int depth,
34-
boolean includeMetadata) throws NodeIdNotFoundException {
35-
37+
@NonNull String nodeIdValue, int depth, boolean includeMetadata)
38+
throws NodeIdNotFoundException {
39+
3640
log.debug("Converting lineage to kinds format for nodeId: {}, depth: {}", nodeIdValue, depth);
37-
41+
3842
// 1. Get traditional lineage using existing directLineage service
3943
NodeId nodeId = NodeId.of(nodeIdValue);
4044
Lineage traditionalLineage = lineageService.directLineage(nodeId, depth);
41-
45+
4246
// 2. Convert to kinds format
4347
return convertToLineageGraphKind(traditionalLineage, nodeId, depth, includeMetadata);
4448
}
4549

46-
/**
47-
* Get a LineageGraph kind by user-friendly name
48-
*/
49-
public LineageGraphKind getLineageGraphByName(
50-
@NonNull String name,
51-
int depth) throws NodeIdNotFoundException {
52-
50+
/** Get a LineageGraph kind by user-friendly name */
51+
public LineageGraphKind getLineageGraphByName(@NonNull String name, int depth)
52+
throws NodeIdNotFoundException {
53+
5354
log.debug("Getting lineage graph by name: {}, depth: {}", name, depth);
54-
55+
5556
NodeId nodeId = deriveNodeIdFromName(name);
5657
Lineage traditionalLineage = lineageService.directLineage(nodeId, depth);
57-
58+
5859
return convertToLineageGraphKind(traditionalLineage, nodeId, depth, true);
5960
}
6061

61-
/**
62-
* List LineageGraph kinds with optional filtering
63-
*/
62+
/** List LineageGraph kinds with optional filtering */
6463
public LineageGraphKindList listLineageGraphKinds(String labelSelector, int limit) {
6564
log.debug("Listing lineage graphs with labelSelector: {}, limit: {}", labelSelector, limit);
66-
65+
6766
// This is a simplified implementation
6867
// In practice, you'd query your metadata store based on labels
6968
List<LineageGraphKind> items = findLineageGraphsByLabels(labelSelector, limit);
70-
69+
7170
return LineageGraphKindList.builder()
7271
.apiVersion("graphs/v1alpha1")
7372
.kind("LineageGraphList")
74-
.metadata(ListMetadata.builder()
75-
.totalCount(items.size())
76-
.build())
73+
.metadata(ListMetadata.builder().totalCount(items.size()).build())
7774
.items(items)
7875
.build();
7976
}
8077

81-
/**
82-
* Convert traditional Marquez lineage to LineageGraph kind
83-
*/
78+
/** Convert traditional Marquez lineage to LineageGraph kind */
8479
private LineageGraphKind convertToLineageGraphKind(
85-
Lineage traditionalLineage,
86-
NodeId centralNodeId,
87-
int depth,
88-
boolean includeMetadata) {
89-
80+
Lineage traditionalLineage, NodeId centralNodeId, int depth, boolean includeMetadata) {
81+
9082
// Extract central node information
9183
CentralNodeInfo centralNode = extractCentralNodeInfo(traditionalLineage, centralNodeId);
92-
84+
9385
// Build metadata
94-
KindMetadata.KindMetadataBuilder metadataBuilder = KindMetadata.builder()
95-
.name(generateLineageGraphName(centralNodeId))
96-
.graphDepth(depth)
97-
.centralNode(centralNode)
98-
.createdAt(Instant.now());
99-
86+
KindMetadata.KindMetadataBuilder metadataBuilder =
87+
KindMetadata.builder()
88+
.name(generateLineageGraphName(centralNodeId))
89+
.graphDepth(depth)
90+
.centralNode(centralNode)
91+
.createdAt(Instant.now());
92+
10093
if (includeMetadata) {
10194
// Add governance-related labels and annotations
10295
metadataBuilder
103-
.labels(Map.of(
104-
"data-domain", centralNode.getDataGovernance().getDataDomain(),
105-
"data-subdomain", centralNode.getDataGovernance().getDataSubdomain(),
106-
"geo", centralNode.getDataGovernance().getGeo(),
107-
"source-system", centralNode.getSourceSystem() != null ? centralNode.getSourceSystem() : "unknown"
108-
))
109-
.annotations(Map.of(
110-
"marquez.source-endpoint", "/api/v1/lineage/direct",
111-
"conversion.timestamp", Instant.now().toString(),
112-
"conversion.depth", String.valueOf(depth)
113-
));
96+
.labels(
97+
Map.of(
98+
"data-domain", centralNode.getDataGovernance().getDataDomain(),
99+
"data-subdomain", centralNode.getDataGovernance().getDataSubdomain(),
100+
"geo", centralNode.getDataGovernance().getGeo(),
101+
"source-system",
102+
centralNode.getSourceSystem() != null
103+
? centralNode.getSourceSystem()
104+
: "unknown"))
105+
.annotations(
106+
Map.of(
107+
"marquez.source-endpoint", "/api/v1/lineage/direct",
108+
"conversion.timestamp", Instant.now().toString(),
109+
"conversion.depth", String.valueOf(depth)));
114110
}
115-
111+
116112
// Convert nodes
117-
List<DataObjectNodeSpec> nodes = traditionalLineage.getGraph().stream()
118-
.map(this::convertToDataObjectNodeSpec)
119-
.collect(Collectors.toList());
120-
113+
List<DataObjectNodeSpec> nodes =
114+
traditionalLineage.getGraph().stream()
115+
.map(this::convertToDataObjectNodeSpec)
116+
.collect(Collectors.toList());
117+
121118
return LineageGraphKind.builder()
122119
.apiVersion("graphs/v1alpha1")
123120
.kind("LineageGraph")
124121
.metadata(metadataBuilder.build())
125-
.spec(LineageGraphSpec.builder()
126-
.nodes(nodes)
127-
.build())
122+
.spec(LineageGraphSpec.builder().nodes(nodes).build())
128123
.build();
129124
}
130125

131-
/**
132-
* Convert a traditional graph node to DataObjectNodeSpec
133-
*/
126+
/** Convert a traditional graph node to DataObjectNodeSpec */
134127
private DataObjectNodeSpec convertToDataObjectNodeSpec(Node traditionalNode) {
135128
return DataObjectNodeSpec.builder()
136129
.nurn(generateNuRN(traditionalNode))
@@ -198,18 +191,19 @@ private String extractVersion(Node node) {
198191

199192
private CentralNodeInfo extractCentralNodeInfo(Lineage lineage, NodeId centralNodeId) {
200193
String centralIdValue = centralNodeId.getValue();
201-
194+
202195
// Extract namespace and name from nodeId (format: "dataset:namespace:name")
203196
String[] parts = centralIdValue.split(":", 3);
204197
String namespace = parts.length > 1 ? parts[1] : "default";
205198
String name = parts.length > 2 ? parts[2] : centralIdValue;
206-
199+
207200
return CentralNodeInfo.builder()
208-
.dataGovernance(DataGovernance.builder()
209-
.geo("DATA")
210-
.dataDomain(namespace)
211-
.dataSubdomain("datasets")
212-
.build())
201+
.dataGovernance(
202+
DataGovernance.builder()
203+
.geo("DATA")
204+
.dataDomain(namespace)
205+
.dataSubdomain("datasets")
206+
.build())
213207
.nurn("nurn:nu:data:metapod:" + centralIdValue.replace(":", "/"))
214208
.name(namespace + "/" + name)
215209
.type("dataset")
@@ -232,4 +226,4 @@ private List<LineageGraphKind> findLineageGraphsByLabels(String labelSelector, i
232226
// For now, return empty list
233227
return List.of();
234228
}
235-
}
229+
}

0 commit comments

Comments
 (0)