Skip to content

Commit 50a87ac

Browse files
committed
adds supoort for plain queries
1 parent 9065237 commit 50a87ac

13 files changed

Lines changed: 193 additions & 93 deletions

File tree

settings.gradle

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/java/com/arcadeanalytics/repository/FileSystemRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ public class FileSystemRepository {
3737
private final Path rootPath;
3838

3939
public FileSystemRepository(@Value("${application.storage.path:target/storage}") String path) {
40-
41-
4240
rootPath = Paths.get(path).toAbsolutePath().normalize();
4341
log.info("File system repository storage path:: {} ", rootPath.toAbsolutePath());
4442
}

src/main/java/com/arcadeanalytics/provider/FileSystemDataProvider.java renamed to src/main/java/com/arcadeanalytics/repository/FileSystemWidgetSnapshotsRepository.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.arcadeanalytics.provider;
1+
package com.arcadeanalytics.repository;
22

33
/*-
44
* #%L
@@ -21,14 +21,16 @@
2121
*/
2222

2323
import com.arcadeanalytics.domain.Widget;
24-
import com.arcadeanalytics.repository.FileSystemRepository;
2524
import com.google.common.base.Charsets;
2625
import org.slf4j.Logger;
2726
import org.slf4j.LoggerFactory;
27+
import org.springframework.stereotype.Component;
2828

2929
import java.io.IOException;
3030
import java.nio.file.Files;
3131
import java.nio.file.Path;
32+
import java.time.LocalDateTime;
33+
import java.time.format.DateTimeFormatter;
3234
import java.util.Collections;
3335
import java.util.Comparator;
3436
import java.util.List;
@@ -37,21 +39,39 @@
3739

3840
import static java.util.Collections.reverse;
3941

40-
public class FileSystemDataProvider {
42+
/**
43+
* File system based repository for snapshot of {@link Widget}s
44+
*/
45+
@Component
46+
public class FileSystemWidgetSnapshotsRepository {
47+
48+
public static final String SNAPSHOT_PREFIX = "data-snapshot-";
4149

42-
private final Logger log = LoggerFactory.getLogger(FileSystemDataProvider.class);
50+
private final Logger log = LoggerFactory.getLogger(FileSystemWidgetSnapshotsRepository.class);
4351

4452
private final FileSystemRepository fsRepo;
4553
private final Path widgets;
4654

47-
public FileSystemDataProvider(FileSystemRepository fsRepo) {
55+
public FileSystemWidgetSnapshotsRepository(FileSystemRepository fsRepo) {
4856

4957
this.fsRepo = fsRepo;
5058
widgets = fsRepo.getRootPath().resolve("widgets");
5159
}
5260

5361

54-
public Optional<String> fetchData(Widget widget) {
62+
public boolean storeSnapshot(Widget widget, String data) {
63+
64+
final String file = "widgets/"
65+
+ widget.getId().toString()
66+
+ "/"
67+
+ SNAPSHOT_PREFIX
68+
+ DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now());
69+
70+
return fsRepo.store(file, data.getBytes());
71+
72+
}
73+
74+
public Optional<String> loadLatestSnapshot(Widget widget) {
5575

5676
final Long id = widget.getId();
5777

@@ -75,7 +95,7 @@ public Optional<String> fetchData(Widget widget) {
7595

7696
}
7797

78-
public Optional<String> fetchData(Widget widget, String filename) {
98+
public Optional<String> loadSnapshot(Widget widget, String filename) {
7999
final Long id = widget.getId();
80100

81101
final Path file = widgets.resolve(id.toString()).resolve(filename);
@@ -138,7 +158,7 @@ public List<String> getAllSnapshots(Widget widget) {
138158
reverse(snapshots);
139159
return snapshots;
140160
} catch (IOException e) {
141-
log.error("unable delete snapshots for widget {} due to {} ", id, e.getMessage());
161+
log.error("unable to get snapshots for widget {} due to {} ", id, e.getMessage());
142162

143163
}
144164

src/main/java/com/arcadeanalytics/service/EnvironmentService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import com.arcadeanalytics.domain.Widget;
2929
import com.arcadeanalytics.domain.Workspace;
3030
import com.arcadeanalytics.domain.enumeration.ContractType;
31-
import com.arcadeanalytics.provider.FileSystemDataProvider;
31+
import com.arcadeanalytics.repository.FileSystemWidgetSnapshotsRepository;
3232
import com.arcadeanalytics.repository.ArcadeUserRepository;
3333
import com.arcadeanalytics.repository.CompanyRepository;
3434
import com.arcadeanalytics.repository.DashboardRepository;
@@ -80,7 +80,7 @@ public class EnvironmentService {
8080

8181
private final ElasticGraphIndexerService elasticGraphIndexerService;
8282

83-
private final FileSystemDataProvider fileSystemDataProvider;
83+
private final FileSystemWidgetSnapshotsRepository fileSystemWidgetSnapshotsRepository;
8484

8585
private final String templateUserName;
8686

@@ -106,7 +106,7 @@ public EnvironmentService(WorkspaceRepository workspaceRepository,
106106
this.companyRepository = companyRepository;
107107
this.dataSourceIndexRepository = dataSourceIndexRepository;
108108
this.elasticGraphIndexerService = elasticGraphIndexerService;
109-
this.fileSystemDataProvider = new FileSystemDataProvider(fileSystemRepository);
109+
this.fileSystemWidgetSnapshotsRepository = new FileSystemWidgetSnapshotsRepository(fileSystemRepository);
110110

111111
templateUserName = env.getProperty("application.templateUser", TEMPLATE_USER_NAME);
112112

@@ -252,7 +252,7 @@ public void deleteDashboard(Dashboard dashboard) {
252252
widgets.forEach(widget -> {
253253
Optional.ofNullable(widget.getDataSet())
254254
.ifPresent(dataSetRepository::delete);
255-
fileSystemDataProvider.deleteAllSnapshots(widget);
255+
fileSystemWidgetSnapshotsRepository.deleteAllSnapshots(widget);
256256
widgetRepository.delete(widget);
257257
widgetSearchRepository.delete(widget.getId());
258258
});

src/main/java/com/arcadeanalytics/service/WidgetService.java

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@
3030
import com.arcadeanalytics.provider.DataSourceInfo;
3131
import com.arcadeanalytics.provider.DataSourceMetadataProvider;
3232
import com.arcadeanalytics.provider.DataSourceProviderFactory;
33-
import com.arcadeanalytics.provider.FileSystemDataProvider;
33+
import com.arcadeanalytics.provider.DataSourceTableDataProvider;
3434
import com.arcadeanalytics.provider.GraphData;
3535
import com.arcadeanalytics.repository.ArcadeUserRepository;
3636
import com.arcadeanalytics.repository.DataSetRepository;
3737
import com.arcadeanalytics.repository.DataSourceRepository;
38-
import com.arcadeanalytics.repository.FileSystemRepository;
38+
import com.arcadeanalytics.repository.FileSystemWidgetSnapshotsRepository;
3939
import com.arcadeanalytics.repository.WidgetRepository;
4040
import com.arcadeanalytics.repository.search.WidgetSearchRepository;
4141
import com.arcadeanalytics.security.AuthoritiesConstants;
@@ -63,9 +63,6 @@
6363
import org.springframework.stereotype.Service;
6464
import org.springframework.transaction.annotation.Transactional;
6565

66-
import java.time.LocalDateTime;
67-
import java.time.format.DateTimeFormatter;
68-
import java.util.Collections;
6966
import java.util.LinkedHashMap;
7067
import java.util.LinkedHashSet;
7168
import java.util.List;
@@ -76,6 +73,7 @@
7673
import java.util.stream.Collectors;
7774

7875
import static com.arcadeanalytics.service.util.DataSourceUtil.toDataSourceInfo;
76+
import static java.util.Collections.emptyList;
7977
import static org.elasticsearch.index.query.QueryBuilders.queryStringQuery;
8078

8179
/**
@@ -101,8 +99,6 @@ public class WidgetService {
10199

102100
private final ArcadeUserRepository arcadeUserRepository;
103101

104-
private final FileSystemRepository fsRepository;
105-
106102
private final CacheManager cacheManager;
107103

108104
private final DataSourceProviderFactory<DataSourceMetadataProvider> dataSourceMetadataProviderFactory;
@@ -111,29 +107,36 @@ public class WidgetService {
111107

112108
private final DataSourceProviderFactory<DataSourceGraphProvider> dataSourceGraphProviderFactory;
113109

110+
private final FileSystemWidgetSnapshotsRepository widgetSnapshotsRepository;
111+
112+
private final DataSourceProviderFactory<DataSourceTableDataProvider> dataSourceTableDataProviderFactory;
113+
114114
public WidgetService(WidgetRepository widgetRepository,
115115
WidgetMapper widgetMapper,
116116
WidgetSearchRepository widgetSearchRepository,
117117
DataSetRepository dataSetRepository,
118118
DataSourceRepository dataSourceRepository,
119119
ArcadeUserRepository arcadeUserRepository,
120-
FileSystemRepository fsRepository,
120+
FileSystemWidgetSnapshotsRepository widgetSnapshotsRepository,
121121
CacheManager cacheManager,
122122
DataSourceProviderFactory<DataSourceMetadataProvider> dataSourceMetadataProviderFactory,
123123
DataSourceProviderFactory<DataSourceGraphDataProvider> dataSourceGraphDataProviderFactory,
124+
DataSourceProviderFactory<DataSourceTableDataProvider> dataSourceTableDataProviderFactory,
124125
DataSourceProviderFactory<DataSourceGraphProvider> dataSourceGraphProviderFactory) {
125126
this.widgetRepository = widgetRepository;
126127
this.widgetMapper = widgetMapper;
127128
this.widgetSearchRepository = widgetSearchRepository;
128129
this.dataSetRepository = dataSetRepository;
129130
this.dataSourceRepository = dataSourceRepository;
130131
this.arcadeUserRepository = arcadeUserRepository;
131-
this.fsRepository = fsRepository;
132+
this.widgetSnapshotsRepository = widgetSnapshotsRepository;
132133
this.cacheManager = cacheManager;
133134

134135
this.dataSourceMetadataProviderFactory = dataSourceMetadataProviderFactory;
135136
this.dataSourceGraphDataProviderFactory = dataSourceGraphDataProviderFactory;
137+
this.dataSourceTableDataProviderFactory = dataSourceTableDataProviderFactory;
136138
this.dataSourceGraphProviderFactory = dataSourceGraphProviderFactory;
139+
137140
}
138141

139142

@@ -275,14 +278,39 @@ public Page<WidgetDTO> search(String query, Pageable pageable) {
275278
}
276279

277280
@Transactional(readOnly = true)
278-
public GraphData getData(Long id, QueryDTO query) {
281+
public GraphData getTableData(Long id, QueryDTO query) {
279282
return getWidgetIfAllowed(id)
280283
.map(widget -> {
281284

282285
final Contract contract = contract();
283286

284287
if (query.getDatasetCardinality() > contract.getMaxElements()) return GraphData.getEMPTY();
285288

289+
final DataSourceInfo ds = toDataSourceInfo(widget.getDataSource());
290+
291+
final int limit = contract.getMaxElements() - query.getDatasetCardinality();
292+
293+
final GraphData graphData = dataSourceTableDataProviderFactory.create(ds)
294+
.fetchData(ds, query.getQuery(), query.getParams(), limit);
295+
return graphData;
296+
297+
}
298+
299+
)
300+
.orElse(GraphData.getEMPTY());
301+
302+
303+
}
304+
305+
306+
@Transactional(readOnly = true)
307+
public GraphData getData(Long id, QueryDTO query) {
308+
return getWidgetIfAllowed(id)
309+
.map(widget -> {
310+
311+
final Contract contract = contract();
312+
313+
if (query.getDatasetCardinality() > contract.getMaxElements()) return GraphData.getEMPTY();
286314

287315
final DataSourceInfo ds = toDataSourceInfo(widget.getDataSource());
288316

@@ -309,8 +337,8 @@ public GraphData getData(Long id, QueryDTO query) {
309337
public Optional<String> getSnapshot(Long id) {
310338

311339
return getWidgetIfAllowed(id)
312-
.map(widget -> new FileSystemDataProvider(fsRepository)
313-
.fetchData(widget)
340+
.map(widget -> widgetSnapshotsRepository
341+
.loadLatestSnapshot(widget)
314342
.map(name -> name.replace(SNAPSHOT_PREFIX, "")))
315343
.orElse(Optional.empty());
316344
}
@@ -325,8 +353,8 @@ public Optional<String> getSnapshotForEmbed(UUID uuid) {
325353

326354
return widgetRepository.findOneByUuid(uuid)
327355
.filter(widget -> widget.isShared())
328-
.map(widget -> new FileSystemDataProvider(fsRepository)
329-
.fetchData(widget)
356+
.map(widget -> widgetSnapshotsRepository
357+
.loadLatestSnapshot(widget)
330358
.map(name -> name.replace(SNAPSHOT_PREFIX, "")))
331359
.orElse(Optional.empty());
332360
}
@@ -344,21 +372,21 @@ public Optional<String> getSnapshot(Long id, String fileName) {
344372
if (fileName.equalsIgnoreCase("last")) return getSnapshot(id);
345373

346374
return getWidgetIfAllowed(id)
347-
.map(widget -> new FileSystemDataProvider(fsRepository)
348-
.fetchData(widget, SNAPSHOT_PREFIX + fileName)
375+
.map(widget -> widgetSnapshotsRepository
376+
.loadSnapshot(widget, SNAPSHOT_PREFIX + fileName)
349377
.map(name -> name.replace(SNAPSHOT_PREFIX, "")))
350378
.orElse(Optional.empty());
351379
}
352380

353381

354382
public List<String> getSnapshots(Long id) {
355383
return getWidgetIfAllowed(id)
356-
.map(widget -> new FileSystemDataProvider(fsRepository)
384+
.map(widget -> widgetSnapshotsRepository
357385
.getAllSnapshots(widget).stream()
358386
.map(name -> name.replace(SNAPSHOT_PREFIX, ""))
359387
.collect(Collectors.toList()))
360388

361-
.orElse(Collections.emptyList());
389+
.orElse(emptyList());
362390

363391
}
364392

@@ -368,13 +396,8 @@ public boolean saveSnapshot(Long id, String snapshotData) {
368396

369397
return getWidgetIfAllowed(id)
370398
.map(widget -> {
371-
final String file = "widgets/"
372-
+ widget.getId().toString()
373-
+ "/"
374-
+ SNAPSHOT_PREFIX
375-
+ DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now());
376399

377-
final boolean stored = fsRepository.store(file, snapshotData.getBytes());
400+
final boolean stored = widgetSnapshotsRepository.storeSnapshot(widget, snapshotData);
378401

379402
widgetRepository.save(widget.hasSnapshot(stored));
380403
return stored;
@@ -386,7 +409,7 @@ public boolean saveSnapshot(Long id, String snapshotData) {
386409
public boolean deleteSnapshot(Long id, String fileName) {
387410

388411
return getWidgetIfAllowed(id)
389-
.map(widget -> new FileSystemDataProvider(fsRepository)
412+
.map(widget -> widgetSnapshotsRepository
390413
.deleteSnapshot(widget, SNAPSHOT_PREFIX + fileName))
391414
.orElse(false);
392415
}

src/main/java/com/arcadeanalytics/service/dto/QueryDTO.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,23 @@
2020
* #L%
2121
*/
2222

23+
import com.arcadeanalytics.provider.QueryParam;
24+
25+
import java.util.Collections;
26+
import java.util.List;
27+
2328
public class QueryDTO {
2429

2530
private String query;
2631

32+
private List<QueryParam> params;
33+
2734
private int datasetCardinality;
2835

36+
public QueryDTO() {
37+
params = Collections.emptyList();
38+
}
39+
2940
public int getDatasetCardinality() {
3041
return datasetCardinality;
3142
}
@@ -42,12 +53,22 @@ public void setQuery(String query) {
4253
this.query = query;
4354
}
4455

56+
public List<QueryParam> getParams() {
57+
return params;
58+
}
59+
60+
public void setParams(List<QueryParam> params) {
61+
this.params = params;
62+
}
63+
4564

4665
@Override
4766
public String toString() {
4867
return "QueryDTO{" +
49-
"query='" + query + '\'' +
50-
", datasetCardinality=" + datasetCardinality +
51-
'}';
68+
"query='" + query + '\'' +
69+
", params=" + params +
70+
", datasetCardinality=" + datasetCardinality +
71+
'}';
5272
}
73+
5374
}

0 commit comments

Comments
 (0)