Skip to content
Snippets Groups Projects
Commit dc3fb5c4 authored by esikkala's avatar esikkala
Browse files

Update facet filters and predicates

parent 3356a401
No related branches found
No related tags found
No related merge requests found
......@@ -32,6 +32,11 @@ class FacetDialog extends React.Component {
};
}
componentDidMount = () => {
console.log('facet dialog mounted, fetch facet')
this.props.fetchFacet();
}
componentDidUpdate(prevProps) {
if (prevProps.facet.fetchingFacet !== this.props.facet.fetchingFacet) {
this.setState({
......@@ -40,13 +45,14 @@ class FacetDialog extends React.Component {
}
}
handleClickOpen = () => this.setState({ open: true });
handleClose = () => this.setState({ open: false });
render() {
const { classes, propertyLabel, facet } = this.props;
// console.log(facet)
//console.log(facet)
return (
<div className={classes.root}>
<IconButton
......
import React from 'react';
import PropTypes from 'prop-types';
import { Route, Switch, Redirect } from 'react-router-dom';
import { Route, Redirect } from 'react-router-dom';
import ViewTabs from './ViewTabs';
import ResultTable from './ResultTable';
import LeafletMap from './LeafletMap';
......@@ -12,59 +12,57 @@ let Manuscripts = props => {
return (
<React.Fragment>
<ViewTabs routeProps={props.routeProps} />
<Switch>
<Route
exact path='/manuscripts'
render={() => <Redirect to='manuscripts/table' />}
/>
<Route
path={'/manuscripts/table'}
render={routeProps =>
<ResultTable
rows={props.search.manuscripts}
facet={props.facet}
fetchManuscripts={props.fetchManuscripts}
fetchPlaces={props.fetchPlaces}
fetchingManuscripts={props.search.fetchingManuscripts}
fetchFacet={props.fetchFacet}
resultCount={props.search.manuscriptCount}
updateFilter={props.updateFilter}
page={props.search.page}
updatePage={props.updatePage}
routeProps={routeProps}
/>
}
/>
<Route
path={'/manuscripts/creation_places'}
render={() =>
<LeafletMap
fetchPlaces={props.fetchPlaces}
fetchPlace={props.fetchPlace}
results={props.search.places}
place={props.search.place}
mapMode='cluster'
/>}
/>
<Route
path={'/manuscripts/migrations'}
render={() =>
<Deck
fetchPlaces={props.fetchPlaces}
fetchingPlaces={props.search.fetchingPlaces}
data={props.search.places}
/>}
/>
<Route
path={'/manuscripts/statistics'}
render={() =>
<Pie
fetchPlaces={props.fetchPlaces}
fetchingPlaces={props.search.fetchingPlaces}
data={props.search.places}
/>}
/>
</Switch>
<Route
exact path='/manuscripts'
render={() => <Redirect to='manuscripts/table' />}
/>
<Route
path={'/manuscripts/table'}
render={routeProps =>
<ResultTable
rows={props.search.manuscripts}
facet={props.facet}
fetchManuscripts={props.fetchManuscripts}
fetchPlaces={props.fetchPlaces}
fetchingManuscripts={props.search.fetchingManuscripts}
fetchFacet={props.fetchFacet}
resultCount={props.search.manuscriptCount}
updateFilter={props.updateFilter}
page={props.search.page}
updatePage={props.updatePage}
routeProps={routeProps}
/>
}
/>
<Route
path={'/manuscripts/creation_places'}
render={() =>
<LeafletMap
fetchPlaces={props.fetchPlaces}
fetchPlace={props.fetchPlace}
results={props.search.places}
place={props.search.place}
mapMode='cluster'
/>}
/>
<Route
path={'/manuscripts/migrations'}
render={() =>
<Deck
fetchPlaces={props.fetchPlaces}
fetchingPlaces={props.search.fetchingPlaces}
data={props.search.places}
/>}
/>
<Route
path={'/manuscripts/statistics'}
render={() =>
<Pie
fetchPlaces={props.fetchPlaces}
fetchingPlaces={props.search.fetchingPlaces}
data={props.search.places}
/>}
/>
</React.Fragment>
);
};
......
......@@ -62,7 +62,7 @@ class ResultTable extends React.Component {
let page;
if (this.props.routeProps.location.search === '') {
page = this.props.page === -1 ? 0 : this.props.page;
this.props.routeProps.history.push({
this.props.routeProps.history.replace({
pathname: '/manuscripts/table',
search: `?page=${page}`,
});
......@@ -70,8 +70,9 @@ class ResultTable extends React.Component {
page = parseInt(parse(this.props.routeProps.location.search).page);
}
this.props.updatePage(page);
console.log('mounted, fetching manuscripts')
this.props.fetchManuscripts();
this.props.fetchFacet();
//this.props.fetchFacet();
}
componentDidUpdate = prevProps => {
......
......@@ -46,7 +46,7 @@ class Tree extends Component {
});
this.props.updatePage(0);
this.props.fetchManuscripts();
this.props.fetchFacet();
//this.props.fetchFacet();
};
render() {
......
......@@ -53,7 +53,8 @@ const styles = theme => ({
},
borderRight: '4px solid' + theme.palette.primary.main,
borderLeft: '4px solid' + theme.palette.primary.main,
backgroundColor: 'rgb(238, 238, 238)'
//backgroundColor: 'rgb(238, 238, 238)'
backgroundColor: theme.palette.background.paper
},
footer: {
position: 'absolute',
......@@ -97,26 +98,24 @@ let MapApp = (props) => {
<React.Fragment>
<TopBar />
<div className={classes.mainContainer}>
<Switch>
<Route exact path="/" component={Main} />
<Route
path="/manuscripts"
render={routeProps =>
<Manuscripts
facet={facet}
map={map}
search={search}
fetchManuscripts={props.fetchManuscripts}
fetchPlaces={props.fetchPlaces}
fetchPlace={props.fetchPlace}
fetchFacet={props.fetchFacet}
fetchResults={props.fetchResults}
updateFilter={props.updateFilter}
updatePage={props.updatePage}
routeProps={routeProps}
/>}
/>
</Switch>
<Route exact path="/" component={Main} />
<Route
path="/manuscripts"
render={routeProps =>
<Manuscripts
facet={facet}
map={map}
search={search}
fetchManuscripts={props.fetchManuscripts}
fetchPlaces={props.fetchPlaces}
fetchPlace={props.fetchPlace}
fetchFacet={props.fetchFacet}
fetchResults={props.fetchResults}
updateFilter={props.updateFilter}
updatePage={props.updatePage}
routeProps={routeProps}
/>}
/>
</div>
</React.Fragment>
</Router>
......
......@@ -68,8 +68,22 @@ const getFacet = (action$, state$) => action$.pipe(
ofType(FETCH_FACET),
withLatestFrom(state$),
mergeMap(([, state]) => {
const filterStr = stringify(state.facet.facetFilters);
const requestUrl = `${apiUrl}facet?filters=${filterStr}`;
let params = {};
let filters = {};
let activeFilters = false;
console.log(state.facet.facetFilters)
for (const [key, value] of Object.entries(state.facet.facetFilters)) {
if (value.size != 0) {
activeFilters = true;
filters[key] = Array.from(value);
}
}
if (activeFilters) {
params.filters = JSON.stringify(filters);
}
const searchUrl = apiUrl + 'facets';
const requestUrl = `${searchUrl}?${stringify(params)}`;
console.log(requestUrl)
return ajax.getJSON(requestUrl).pipe(
map(response => updateFacet({ facetValues: response }))
);
......
......@@ -6,7 +6,7 @@ import {
getManuscripts,
getPlaces,
getPlace,
getFacet
getFacets
} from './sparql/Manuscripts';
const DEFAULT_PORT = 3001;
const app = express();
......@@ -28,7 +28,7 @@ app.get('/manuscripts', (req, res) => {
const page = parseInt(req.query.page) || 0;
const filters = req.query.filters == null ? null : JSON.parse(req.query.filters);
const pagesize = 5;
// console.log(filters)
//console.log(filters)
return getManuscripts(page, pagesize, filters).then(data => {
// console.log(data);
res.json(data);
......@@ -39,17 +39,6 @@ app.get('/manuscripts', (req, res) => {
});
});
// app.get('/manuscript-count', (req, res) => {
// return getManuscriptCount({}).then((data) => {
// // console.log(data);
// res.json(data);
// })
// .catch((err) => {
// console.log(err);
// return res.sendStatus(500);
// });
// });
app.get('/places/:placeId?', (req, res) => {
if (req.params.placeId) {
return getPlace(req.params.placeId).then(data => {
......@@ -73,14 +62,11 @@ app.get('/places/:placeId?', (req, res) => {
}
});
app.get('/facet', (req, res) => {
return getFacet().then((data) => {
const facetValues = {
creationPlace: data,
author: []
};
// console.log(data);
res.json(facetValues);
app.get('/facets', (req, res) => {
const filters = req.query.filters == null ? null : JSON.parse(req.query.filters);
console.log(filters)
return getFacets(filters).then((data) => {
res.json(data);
})
.catch((err) => {
console.log(err);
......
......@@ -211,8 +211,8 @@ module.exports = {
{ SELECT DISTINCT (count(DISTINCT ?id) as ?cnt) ?value ?parent
{
?id a frbroo:F4_Manifestation_Singleton .
?id skos:prefLabel ?name .
?id ^frbroo:R18_created/crm:P7_took_place_at ?value .
<FILTER>
?id <PREDICATE> ?value .
OPTIONAL { ?value mmm-schema:parent ?parent }
}
GROUP BY ?value ?parent
......
......@@ -2,18 +2,30 @@ import SparqlSearchEngine from './SparqlSearchEngine';
import datasetConfig from './Datasets';
import {
mapFacet,
mapHierarchicalFacet,
mapCount,
//mapManuscripts
} from './Mappers';
import { makeObjectList } from './SparqlObjectMapper';
const sparqlSearchEngine = new SparqlSearchEngine();
const facetConfigs = {
creationPlace: {
id: 'creationPlace',
predicate: '^frbroo:R18_created/crm:P7_took_place_at',
hierarchical: true,
},
author: {
id: 'author',
predicate: '^frbroo:R18_created/mmm-schema:carried_out_by_as_author',
hierarchical: false,
}
};
export const getManuscripts = (page, pagesize, filterObj) => {
export const getManuscripts = (page, pagesize, filters) => {
return Promise.all([
getManuscriptCount(filterObj),
getManuscriptData(page, pagesize, filterObj),
getManuscriptCount(filters),
getManuscriptData(page, pagesize, filters),
]).then(data => {
return {
manuscriptCount: data[0].count,
......@@ -24,21 +36,21 @@ export const getManuscripts = (page, pagesize, filterObj) => {
});
};
const getManuscriptData = (page, pagesize, filterObj) => {
const getManuscriptData = (page, pagesize, filters) => {
let { endpoint, manuscriptQuery } = datasetConfig['mmm'];
if (filterObj == null) {
if (filters == null) {
manuscriptQuery = manuscriptQuery.replace('<FILTER>', '');
} else {
manuscriptQuery = manuscriptQuery.replace('<FILTER>', generateFilter(filterObj));
manuscriptQuery = manuscriptQuery.replace('<FILTER>', generateResultFilter(filters));
}
manuscriptQuery = manuscriptQuery.replace('<PAGE>', `LIMIT ${pagesize} OFFSET ${page * pagesize}`);
// console.log(manuscriptQuery)
return sparqlSearchEngine.doSearch(manuscriptQuery, endpoint, makeObjectList);
};
const getManuscriptCount = filterObj => {
const getManuscriptCount = filters => {
let { endpoint, countQuery } = datasetConfig['mmm'];
countQuery = countQuery.replace('<FILTER>', generateFilter(filterObj));
countQuery = countQuery.replace('<FILTER>', generateResultFilter(filters));
return sparqlSearchEngine.doSearch(countQuery, endpoint, mapCount);
};
......@@ -46,43 +58,63 @@ export const getPlaces = variant => {
// console.log(variant)
const config = datasetConfig['mmm'];
const query = config[`${variant}Query`];
// console.log(query)
// console.log(query)
return sparqlSearchEngine.doSearch(query, config.endpoint, makeObjectList);
};
export const getPlace = (id) => {
export const getPlace = id => {
let { endpoint, placeQuery } = datasetConfig['mmm'];
placeQuery = placeQuery.replace('<PLACE_ID>', `<http://ldf.fi/mmm/place/${id}>`);
return sparqlSearchEngine.doSearch(placeQuery, endpoint, makeObjectList);
};
export const getFacet = () => {
const { endpoint, facetQuery } = datasetConfig['mmm'];
// console.log(facetQuery)
return sparqlSearchEngine.doSearch(facetQuery, endpoint, mapFacet);
export const getFacets = filters => {
return Promise.all(Object.values(facetConfigs).map(value => getFacet(value, filters)))
.then(data => {
let results = {};
let i = 0;
Object.keys(facetConfigs).forEach(key => {
results[key] = data[i];
i += 1;
});
return results;
});
};
const generateFilter = filterObj => {
const facetOptions = {
creationPlace: {
predicate: '^frbroo:R18_created/crm:P7_took_place_at',
hierarchical: true,
},
author: {
hierarchical: false,
predicate: '^frbroo:R18_created/crm:P14_carried_out_by',
}
};
const getFacet = (facetConfig, filters) => {
let { endpoint, facetQuery } = datasetConfig['mmm'];
if (filters == null) {
facetQuery = facetQuery.replace('<FILTER>', '');
} else {
facetQuery = facetQuery.replace('<FILTER>', generateFacetFilter(facetConfig, filters));
}
facetQuery = facetQuery.replace('<PREDICATE>', facetConfig.predicate);
console.log(filters)
let mapper = facetConfig.hierarchical ? mapHierarchicalFacet : mapFacet;
return sparqlSearchEngine.doSearch(facetQuery, endpoint, mapper);
};
//filterObj.creationPlace.predicate = '^<http://erlangen-crm.org/efrbroo/R18_created>/<http://www.cidoc-crm.org/cidoc-crm/P7_took_place_at>';
const generateFacetFilter = (facetConfig, filters) => {
delete filters[facetConfig.id]; // apply filters only from other facets
let filterStr = '';
for (let property in filters) {
filterStr += `
?id ${facetConfigs[property].predicate} ?${property}Filter
VALUES ?${property}Filter { <${filters[property].join('> <')}> }
`;
}
return filterStr;
};
for (let property in filterObj) {
//console.log(filterObj[property])
const generateResultFilter = filters => {
//console.log(filters)
let filterStr = '';
for (let property in filters) {
filterStr += `
?id ${facetOptions[property].predicate} ?${property}Filter
VALUES ?${property}Filter { <${filterObj[property].join('> <')}> }
?id ${facetConfigs[property].predicate} ?${property}Filter
VALUES ?${property}Filter { <${filters[property].join('> <')}> }
`;
}
//console.log(filterStr)
return filterStr;
};
......@@ -122,7 +122,18 @@ export const mapCount = (sparqlBindings) => {
};
};
export const mapFacet = (sparqlBindings) => {
export const mapFacet = sparqlBindings => {
const results = sparqlBindings.map(b => {
return {
title: b.facet_text.value,
id: _.has(b, 'value',) ? b.value.value : 'no_selection',
cnt: b.cnt.value,
};
});
return results;
};
export const mapHierarchicalFacet = sparqlBindings => {
const results = sparqlBindings.map(b => {
return {
title: b.facet_text.value,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment