Skip to content

Commit

Permalink
A method bucket.query now sent requests until get last record from se…
Browse files Browse the repository at this point in the history
…rver
  • Loading branch information
Rumpelshtinskiy committed Sep 19, 2024
1 parent 582fbd3 commit 8bbbead
Show file tree
Hide file tree
Showing 38 changed files with 94 additions and 144 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ NOTE: The token you're instantiating the client with must have full access to cr
```java
import store.reduct.client.ReductTokenClient;
import store.reduct.client.TokenClient;
import store.reduct.client.config.ServerProperties;
import store.reduct.model.token.AccessToken;
import store.reduct.model.token.TokenPermissions;
import config.client.store.reduct.ServerProperties;
import token.model.store.reduct.AccessToken;
import token.model.store.reduct.TokenPermissions;
import java.util.List;

public class Main {
Expand All @@ -38,8 +38,8 @@ public class Main {
### Retrieve information about the server
```java
import store.reduct.client.ReductServerClient;
import store.reduct.client.config.ServerProperties;
import store.reduct.model.server.ServerInfo;
import config.client.store.reduct.ServerProperties;
import server.model.store.reduct.ServerInfo;

public class Main {
public static void main(String[] args) {
Expand All @@ -57,9 +57,9 @@ public class Main {
```java
import store.reduct.client.BucketClient;
import store.reduct.client.ReductBucketClient;
import store.reduct.client.config.ServerProperties;
import store.reduct.model.bucket.BucketSettings;
import store.reduct.model.bucket.QuotaType;
import config.client.store.reduct.ServerProperties;
import bucket.model.store.reduct.BucketSettings;
import bucket.model.store.reduct.QuotaType;

public class Main {
public static void main(String[] args) {
Expand Down
68 changes: 35 additions & 33 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -39,46 +39,48 @@ jar {

tasks.named('test') {
useJUnitPlatform()
dependsOn(tasks.assemble)
}

import com.vanniktech.maven.publish.SonatypeHost
tasks.register('publishingToCentralMaven') {
println 'Publishing to Central Maven is started.'
mavenPublishing {
publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
signAllPublications()

coordinates(group, archivesBaseName, version)
pom {
name = archivesBaseName
description = "ReductStore Client SDK for Java"
url = "https://www.reduct.store/docs"

mavenPublishing {
publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
signAllPublications()

coordinates(group, archivesBaseName, version)
pom {
name = archivesBaseName
description = "ReductStore Client SDK for Java"
url = "https://www.reduct.store/docs"

licenses {
license {
name = "MIT License"
url = "https://opensource.org/licenses/MIT"
}
}
scm {
url = "https://github.com/reductstore/reduct-java.git"
connection = "scm:git:git://github.com/reductstore/reduct-java.git"
developerConnection = "scm:git:ssh://github.com/reductstore/reduct-java.git"
}
developers {
developer {
id = "mtp"
name = "matepocz"
licenses {
license {
name = "MIT License"
url = "https://opensource.org/licenses/MIT"
}
}
developer {
id = "Rumpelshtinskiy"
name = "Rustam Galikhanov"
scm {
url = "https://github.com/reductstore/reduct-java.git"
connection = "scm:git:git://github.com/reductstore/reduct-java.git"
developerConnection = "scm:git:ssh://github.com/reductstore/reduct-java.git"
}
developer {
id = "reductsoftware"
name = "ReductSoftware UG"
email = "[email protected]"
developers {
developer {
id = "mtp"
name = "matepocz"
}
developer {
id = "Rumpelshtinskiy"
name = "Rustam Galikhanov"
}
developer {
id = "reductsoftware"
name = "ReductSoftware UG"
email = "[email protected]"
}
}
}
}
}
}
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1 @@
rootProject.name = 'reduct-java'
rootProject.name = 'reduct-java'
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,19 @@
import store.reduct.utils.Strings;
import store.reduct.utils.http.Queries;

import java.awt.*;
import java.math.BigInteger;
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.ByteBuffer;
import java.time.Instant;
import java.util.*;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -260,7 +266,7 @@ public Record getMetaInfo(String entryName, Long timestamp) throws ReductExcepti
* @param ttl
* @return
*/
public Iterator<Record> query(String entryName, Integer start, Integer stop, Integer ttl) {
public Collection<Record> query(String entryName, Integer start, Integer stop, Integer ttl) {
if(Strings.isBlank(name) || Strings.isBlank(entryName) || Objects.isNull(start) || Objects.isNull(stop) || Objects.isNull(ttl))
{
throw new ReductException("Validation error");
Expand All @@ -272,7 +278,8 @@ public Iterator<Record> query(String entryName, Integer start, Integer stop, Int
.GET();
HttpResponse<String> response = reductClient.send(builder, HttpResponse.BodyHandlers.ofString());
QueryId queryId = JsonUtils.parseObject(response.body(), QueryId.class);
return getRecords(entryName, queryId.getId()).iterator();

return getRecords(entryName, queryId.getId());
}

/**
Expand All @@ -283,7 +290,7 @@ public Iterator<Record> query(String entryName, Integer start, Integer stop, Int
* @throws ReductException
* @throws IllegalArgumentException
*/
Stream<Record> getRecords(@NonNull String entryName, Long queryId) throws ReductException, IllegalArgumentException {
Collection<Record> getRecords(@NonNull String entryName, Long queryId) throws ReductException, IllegalArgumentException {
if(Objects.isNull(queryId))
{
throw new ReductException("Validation error");
Expand All @@ -292,36 +299,46 @@ Stream<Record> getRecords(@NonNull String entryName, Long queryId) throws Reduct
HttpRequest.Builder builder = HttpRequest.newBuilder()
.uri(uri)
.GET();
HttpResponse<byte[]> httpResponse = reductClient.send(builder, HttpResponse.BodyHandlers.ofByteArray());
ByteBuffer byteBuffer = ByteBuffer.wrap(httpResponse.body());
return httpResponse.headers()
.map()
.entrySet()
.stream()
.filter(ent -> ent.getKey().contains(getXReductTimeWithUnderscoreHeader()))
.map(ent -> {
String ts = ent.getKey().substring(getXReductTimeWithUnderscoreHeader().length());
String[] split = ent.getValue().get(0).split(",");
if(split.length < 2) {
throw new ReductException(String.format("Headers has a wrong format for timestamp: %s", ts));
}
try {
int length = Integer.parseInt(split[0]);
String type = split[1];
byte[] tempBuf = new byte[length];
byteBuffer.get(tempBuf);
return Record.builder()
.body(tempBuf)
.entryName(entryName)
.timestamp(Optional.of(ts).map(Long::parseLong).orElseThrow(() -> new ReductException(X_REDUCT_TIME_IS_NOT_SUCH_LONG_FORMAT)))
.type(type)
.length(length)
.build();
}
catch (NumberFormatException ex) {
throw new ReductException(CONTENT_LENGTH_IS_NOT_SET_IN_THE_RECORD);
}
});
Collection<Record> records = new LinkedList<>();

boolean hasNext = true;
while (hasNext) {
HttpResponse<byte[]> httpResponse = reductClient.send(builder, HttpResponse.BodyHandlers.ofByteArray());
hasNext = httpResponse.statusCode() != 204;
if (hasNext) {
return records;
}
ByteBuffer byteBuffer = ByteBuffer.wrap(httpResponse.body());
records.addAll(httpResponse.headers()
.map()
.entrySet()
.stream()
.filter(ent -> ent.getKey().contains(getXReductTimeWithUnderscoreHeader()))
.map(ent -> {
String ts = ent.getKey().substring(getXReductTimeWithUnderscoreHeader().length());
String[] split = ent.getValue().get(0).split(",");
if (split.length < 2) {
throw new ReductException(String.format("Headers has a wrong format for timestamp: %s", ts));
}
try {
int length = Integer.parseInt(split[0]);
String type = split[1];
byte[] tempBuf = new byte[length];
byteBuffer.get(tempBuf);
return Record.builder()
.body(tempBuf)
.entryName(entryName)
.timestamp(Optional.of(ts).map(Long::parseLong).orElseThrow(() -> new ReductException(X_REDUCT_TIME_IS_NOT_SUCH_LONG_FORMAT)))
.type(type)
.length(length)
.build();
} catch (NumberFormatException ex) {
throw new ReductException(CONTENT_LENGTH_IS_NOT_SET_IN_THE_RECORD);
}
}).toList());

};
return records;
}


Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@
import org.junit.jupiter.api.Test;
import store.reduct.utils.http.Queries;

import javax.xml.transform.stream.StreamResult;

import java.util.Iterator;
import java.util.stream.Stream;

import static org.assertj.core.api.Assertions.assertThat;

public class QueriesTest {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,9 @@
package store.reduct.client;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import store.reduct.client.config.ServerProperties;
import store.reduct.client.util.BucketExamples;
import store.reduct.common.BucketURL;
import store.reduct.common.exception.ReductException;
import store.reduct.model.bucket.BucketSettings;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.*;

@Disabled
class ReductBucketClientTest {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,8 @@
package store.reduct.client;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import store.reduct.client.config.ServerProperties;
import store.reduct.client.util.ResponseExamples;
import store.reduct.common.ServerURL;
import store.reduct.common.exception.ReductException;
import store.reduct.model.bucket.Buckets;
import store.reduct.model.server.ServerInfo;
import store.reduct.utils.http.HttpStatus;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@Disabled
@ExtendWith(MockitoExtension.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,6 @@
package store.reduct.client;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import store.reduct.client.config.ServerProperties;
import store.reduct.client.util.TokenExamples;
import store.reduct.common.ServerURL;
import store.reduct.common.TokenURL;
import store.reduct.common.exception.ReductException;
import store.reduct.model.token.AccessToken;
import store.reduct.model.token.AccessTokens;
import store.reduct.model.token.TokenPermissions;
import store.reduct.utils.http.HttpStatus;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@Disabled
class ReductTokenClientTest {
Expand Down

0 comments on commit 8bbbead

Please sign in to comment.