Skip to content

Commit 2898bfe

Browse files
committed
RDBC-622 parse cmp exchange in sync way
1 parent 93934fe commit 2898bfe

File tree

12 files changed

+95
-69
lines changed

12 files changed

+95
-69
lines changed

src/Documents/Commands/FacetQueryCommand.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,19 @@ export class FacetQueryCommand extends QueryCommand {
4848
defaultTransform: "camel"
4949
}) as any;
5050

51+
const mappedIncludes: Record<string, any> = {};
52+
if (json.Includes) {
53+
for (const [key, value] of Object.entries(json.Includes)) {
54+
mappedIncludes[key] = ObjectUtil.transformDocumentKeys(value, conventions);
55+
}
56+
}
57+
5158
return {
5259
...restMapped,
5360
indexTimestamp: conventions.dateUtil.parse(IndexTimestamp),
5461
lastQueryTime: conventions.dateUtil.parse(LastQueryTime),
5562
results: Results.map(x => ObjectUtil.transformObjectKeys(x, { defaultTransform: "camel" })),
56-
includes: {}
63+
includes: mappedIncludes
5764
};
5865
}
5966
}

src/Documents/Conventions/DocumentConventions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export class DocumentConventions {
102102

103103
private readonly _bulkInsert: BulkInsertConventions;
104104

105-
private _useJsonlStreaming = false;
105+
private _useJsonlStreaming = true;
106106

107107
public get bulkInsert() {
108108
return this._bulkInsert;

src/Documents/Operations/CompareExchange/CompareExchangeValueResultParser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { CompareExchangeResultClass, EntityConstructor } from "../../../Types";
1010
export interface CompareExchangeResultItem {
1111
index: number;
1212
key: string;
13-
value: { object: object };
13+
value: { object: object, "@metadata"?: any };
1414
}
1515

1616
export interface GetCompareExchangeValuesResponse {
@@ -91,7 +91,7 @@ export class CompareExchangeValueResultParser {
9191
}
9292

9393
let rawValue = raw.object;
94-
if (TypeUtil.isPrimitiveType(clazz) || !clazz) {
94+
if (clazz && TypeUtil.isPrimitiveType(clazz) || TypeUtil.isPrimitive(rawValue)) {
9595
return new CompareExchangeValue(key, index, rawValue, metadata);
9696
} else {
9797
if (!rawValue) {

src/Documents/Operations/CompareExchange/GetCompareExchangeValueOperation.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import { DocumentConventions } from "../../Conventions/DocumentConventions";
77
import { IDocumentStore } from "../../IDocumentStore";
88
import { throwError } from "../../../Exceptions";
99
import { ServerNode } from "../../../Http/ServerNode";
10-
import { CompareExchangeResultClass } from "../../../Types";
10+
import { CompareExchangeResultClass, ServerCasing, ServerResponse } from "../../../Types";
1111
import { CompareExchangeValueResultParser, GetCompareExchangeValuesResponse } from "./CompareExchangeValueResultParser";
1212
import * as stream from "readable-stream";
13+
import { GetCompareExchangeValuesCommand } from "./GetCompareExchangeValuesOperation";
1314

1415
export class GetCompareExchangeValueOperation<T> implements IOperation<CompareExchangeValue<T>> {
1516

@@ -60,7 +61,7 @@ export class GetCompareExchangeValueCommand<T> extends RavenCommand<CompareExcha
6061

6162
public createRequest(node: ServerNode): HttpRequestParameters {
6263
const uri = node.url + "/databases/" + node.database + "/cmpxchg?key=" + encodeURIComponent(this._key);
63-
return { uri };
64+
return {uri};
6465
}
6566

6667
public async setResponseAsync(bodyStream: stream.Stream, fromCache: boolean): Promise<string> {
@@ -69,14 +70,14 @@ export class GetCompareExchangeValueCommand<T> extends RavenCommand<CompareExcha
6970
}
7071

7172
let body: string = null;
72-
const results = await this._pipeline<GetCompareExchangeValuesResponse>()
73+
const results = await this._pipeline<ServerCasing<ServerResponse<GetCompareExchangeValuesResponse>>>()
7374
.collectBody(x => body = x)
74-
.parseJsonAsync()
75-
.jsonKeysTransform("GetCompareExchangeValue", this._conventions)
75+
.parseJsonSync()
7676
.process(bodyStream);
7777

78-
this.result = CompareExchangeValueResultParser.getValue(
79-
results as GetCompareExchangeValuesResponse, this._materializeMetadata, this._conventions, this._clazz);
78+
const localObject = GetCompareExchangeValuesCommand.mapToLocalObject(results);
79+
80+
this.result = CompareExchangeValueResultParser.getValue(localObject, this._materializeMetadata, this._conventions, this._clazz);
8081
return body;
8182
}
8283
}

src/Documents/Operations/CompareExchange/GetCompareExchangeValuesOperation.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { HttpRequestParameters } from "../../../Primitives/Http";
22
import { IOperation, OperationResultType } from "../OperationAbstractions";
33
import { CompareExchangeValue } from "./CompareExchangeValue";
44
import { throwError } from "../../../Exceptions";
5-
import { CompareExchangeResultClass } from "../../../Types";
5+
import { CompareExchangeResultClass, ServerCasing, ServerResponse } from "../../../Types";
66
import { IDocumentStore } from "../../IDocumentStore";
77
import { DocumentConventions } from "../../Conventions/DocumentConventions";
88
import { HttpCache } from "../../../Http/HttpCache";
@@ -12,6 +12,7 @@ import { CompareExchangeValueResultParser, GetCompareExchangeValuesResponse } fr
1212
import * as stream from "readable-stream";
1313
import { StringBuilder } from "../../../Utility/StringBuilder";
1414
import { TypeUtil } from "../../../Utility/TypeUtil";
15+
import { QueryResult } from "../../Queries/QueryResult";
1516

1617
export interface GetCompareExchangeValuesParameters<T> {
1718
keys?: string[];
@@ -142,15 +143,41 @@ export class GetCompareExchangeValuesCommand<T> extends RavenCommand<{ [key: str
142143
return body;
143144
}
144145

145-
const results = await this._pipeline<GetCompareExchangeValuesResponse>()
146+
const results = await this._pipeline<ServerCasing<ServerResponse<GetCompareExchangeValuesResponse>>>()
146147
.collectBody(b => body = b)
147-
.parseJsonAsync()
148-
.jsonKeysTransform("GetCompareExchangeValue", this._conventions)
148+
.parseJsonSync()
149149
.process(bodyStream);
150150

151+
const localObject = GetCompareExchangeValuesCommand.mapToLocalObject(results);
152+
151153
this.result = CompareExchangeValueResultParser.getValues<T>(
152-
results, this._materializeMetadata, this._conventions, this._operation.clazz);
154+
localObject, this._materializeMetadata, this._conventions, this._operation.clazz);
153155

154156
return body;
155157
}
158+
159+
public static mapToLocalObject(json: ServerCasing<ServerResponse<GetCompareExchangeValuesResponse>>): GetCompareExchangeValuesResponse {
160+
return {
161+
results: json.Results.map(item => {
162+
if (!item.Value) {
163+
return {
164+
index: item.Index,
165+
key: item.Key,
166+
value: null
167+
}
168+
}
169+
170+
const { Object, ...rest} = item.Value;
171+
172+
return {
173+
value: {
174+
...rest,
175+
object: Object
176+
},
177+
index: item.Index,
178+
key: item.Key
179+
}
180+
})
181+
}
182+
}
156183
}

src/Documents/Session/Operations/Lazy/LazyGetCompareExchangeValueOperation.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import {
1010
CompareExchangeValueResultParser,
1111
GetCompareExchangeValuesResponse
1212
} from "../../../Operations/CompareExchange/CompareExchangeValueResultParser";
13-
import { CompareExchangeResultClass } from "../../../../Types";
13+
import { CompareExchangeResultClass, ServerCasing, ServerResponse } from "../../../../Types";
1414
import { DocumentConventions } from "../../../Conventions/DocumentConventions";
1515
import { QueryResult } from "../../../Queries/QueryResult";
16+
import { GetCompareExchangeValuesCommand } from "../../../Operations/CompareExchange/GetCompareExchangeValuesOperation";
1617

1718
export class LazyGetCompareExchangeValueOperation<T> implements ILazyOperation {
1819
private readonly _clusterSession: ClusterTransactionOperationsBase;
@@ -76,12 +77,11 @@ export class LazyGetCompareExchangeValueOperation<T> implements ILazyOperation {
7677
}
7778

7879
if (response.result) {
79-
const results = await RavenCommandResponsePipeline.create<GetCompareExchangeValuesResponse>()
80-
.parseJsonAsync()
81-
.jsonKeysTransform("GetCompareExchangeValue", this._conventions)
82-
.process(stringToReadable(response.result));
80+
const results = JSON.parse(response.result) as ServerCasing<ServerResponse<GetCompareExchangeValuesResponse>>;
8381

84-
const value = CompareExchangeValueResultParser.getValue(results, false, this._conventions, null);
82+
const localObject = GetCompareExchangeValuesCommand.mapToLocalObject(results);
83+
84+
const value = CompareExchangeValueResultParser.getValue(localObject, false, this._conventions, null);
8585

8686
if (this._clusterSession.session.noTracking) {
8787
if (!value) {

src/Documents/Session/Operations/Lazy/LazyGetCompareExchangeValuesOperation.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ILazyOperation } from "./ILazyOperation";
22
import { ClusterTransactionOperationsBase } from "../../ClusterTransactionOperationsBase";
3-
import { CompareExchangeResultClass } from "../../../../Types";
3+
import { CompareExchangeResultClass, ServerCasing, ServerResponse } from "../../../../Types";
44
import { throwError } from "../../../../Exceptions";
55
import { TypeUtil } from "../../../../Utility/TypeUtil";
66
import { GetRequest } from "../../../Commands/MultiGet/GetRequest";
@@ -16,6 +16,7 @@ import { DocumentConventions } from "../../../Conventions/DocumentConventions";
1616
import { QueryResult } from "../../../Queries/QueryResult";
1717
import { CompareExchangeValue } from "../../../Operations/CompareExchange/CompareExchangeValue";
1818
import { StringBuilder } from "../../../../Utility/StringBuilder";
19+
import { GetCompareExchangeValuesCommand } from "../../../Operations/CompareExchange/GetCompareExchangeValuesOperation";
1920

2021
export class LazyGetCompareExchangeValuesOperation<T> implements ILazyOperation {
2122
private readonly _clusterSession: ClusterTransactionOperationsBase;
@@ -131,14 +132,13 @@ export class LazyGetCompareExchangeValuesOperation<T> implements ILazyOperation
131132
}
132133

133134
if (response.result) {
134-
const results = await RavenCommandResponsePipeline.create<GetCompareExchangeValuesResponse>()
135-
.parseJsonAsync()
136-
.jsonKeysTransform("GetCompareExchangeValue", this._conventions)
137-
.process(stringToReadable(response.result));
135+
const results = JSON.parse(response.result) as ServerCasing<ServerResponse<GetCompareExchangeValuesResponse>>;
136+
137+
const localObject = GetCompareExchangeValuesCommand.mapToLocalObject(results);
138138

139139
if (this._clusterSession.session.noTracking) {
140140
const result: { [key: string]: CompareExchangeValue<T> } = {};
141-
for (const kvp of Object.entries(CompareExchangeValueResultParser.getValues(results, false, this._conventions))) {
141+
for (const kvp of Object.entries(CompareExchangeValueResultParser.getValues(localObject, false, this._conventions))) {
142142
if (!kvp[1].value) {
143143
result[kvp[0]] = this._clusterSession.registerMissingCompareExchangeValue(kvp[0]).getValue(this._clazz, this._conventions);
144144
continue;
@@ -151,7 +151,7 @@ export class LazyGetCompareExchangeValuesOperation<T> implements ILazyOperation
151151
return;
152152
}
153153

154-
for (const kvp of Object.entries(CompareExchangeValueResultParser.getValues(results, false, this._conventions))) {
154+
for (const kvp of Object.entries(CompareExchangeValueResultParser.getValues(localObject, false, this._conventions))) {
155155
if (!kvp[1]) {
156156
continue;
157157
}

src/Http/RavenCommandResponsePipeline.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export class RavenCommandResponsePipeline<TStreamResult> extends EventEmitter {
9393
}
9494
});
9595

96-
transforms.push(extractItemTransform);
96+
transforms.unshift(extractItemTransform);
9797

9898
this._opts.jsonlAsync = {
9999
transforms

src/Mapping/Json/Streams/TransformJsonKeysProfiles.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export type TransformJsonKeysProfile =
66
"DocumentLoad"
77
| "Patch"
88
| "CompareExchangeValue"
9-
| "GetCompareExchangeValue"
109
| "SubscriptionResponsePayload"
1110
| "SubscriptionRevisionsResponsePayload";
1211

@@ -45,17 +44,6 @@ export function getTransformJsonKeysProfile(
4544
};
4645
}
4746

48-
if (profile === "GetCompareExchangeValue") {
49-
if (!conventions) {
50-
throwError("InvalidArgumentException", "Document conventions are required for this profile.");
51-
}
52-
53-
return {
54-
getCurrentTransform:
55-
buildEntityKeysTransformForGetCompareExchangeValue(conventions.entityFieldNameConvention)
56-
};
57-
}
58-
5947
if (profile === "SubscriptionResponsePayload") {
6048
if (!conventions) {
6149
throwError("InvalidArgumentException", "Document conventions are required for this profile.");
@@ -176,24 +164,6 @@ function buildEntityKeysTransformForPutCompareExchangeValue(entityCasingConventi
176164
};
177165
}
178166

179-
function buildEntityKeysTransformForGetCompareExchangeValue(entityCasingConvention) {
180-
return function getCompareExchangeValueTransform(key, stack) {
181-
const len = stack.length;
182-
183-
if (stack[0] === "Results") {
184-
if (stack[2] === "Value" && stack[3] === "@metadata") {
185-
return handleMetadataJsonKeys(key, stack, len, 4);
186-
}
187-
}
188-
189-
if (len <= 4) {
190-
return "camel";
191-
}
192-
193-
return entityCasingConvention;
194-
};
195-
}
196-
197167
function buildEntityKeysTransformForSubscriptionResponsePayload(entityCasingConvention) {
198168
return function entityKeysTransform(key, stack) {
199169
const len = stack.length;

test/Documents/CustomKeyCaseConventionsTests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ describe("With custom key case conventions set", function () {
273273

274274
const cmp = await session.advanced.clusterTransaction.getCompareExchangeValue<typeof pascalCasedCmpXchObj>("cmp/1");
275275
// we don't transform casing for cmpXchValues
276-
assert.strictEqual(cmp.value.Email, pascalCasedCmpXchObj.Email);
276+
assert.strictEqual(cmp.value.email, pascalCasedCmpXchObj.Email);
277277

278278
assertThat(session.advanced.numberOfRequests)
279279
.isEqualTo(1);

0 commit comments

Comments
 (0)