Many performance updates (#237)
This commit is contained in:
@@ -16,15 +16,15 @@ namespace gaseous_server.Classes
|
|||||||
// platforms
|
// platforms
|
||||||
List<FilterItem> platforms = new List<FilterItem>();
|
List<FilterItem> platforms = new List<FilterItem>();
|
||||||
|
|
||||||
string ageRestriction_Platform = "Game.AgeGroupId <= " + (int)MaximumAgeRestriction;
|
string ageRestriction_Platform = "AgeGroup.AgeGroupId <= " + (int)MaximumAgeRestriction;
|
||||||
string ageRestriction_Generic = "view_Games.AgeGroupId <= " + (int)MaximumAgeRestriction;
|
string ageRestriction_Generic = "view_Games.AgeGroupId <= " + (int)MaximumAgeRestriction;
|
||||||
if (IncludeUnrated == true)
|
if (IncludeUnrated == true)
|
||||||
{
|
{
|
||||||
ageRestriction_Platform += " OR Game.AgeGroupId IS NULL";
|
ageRestriction_Platform += " OR AgeGroup.AgeGroupId IS NULL";
|
||||||
ageRestriction_Generic += " OR view_Games.AgeGroupId IS NULL";
|
ageRestriction_Generic += " OR view_Games.AgeGroupId IS NULL";
|
||||||
}
|
}
|
||||||
|
|
||||||
string sql = "SELECT Platform.Id, Platform.`Name`, COUNT(view_Games.Id) AS GameCount FROM view_Games JOIN Relation_Game_Platforms ON Relation_Game_Platforms.GameId = view_Games.Id AND (Relation_Game_Platforms.PlatformsId IN (SELECT DISTINCT PlatformId FROM Games_Roms WHERE Games_Roms.GameId = view_Games.Id)) JOIN Platform ON Platform.Id = Relation_Game_Platforms.PlatformsId WHERE (" + ageRestriction_Generic + ") GROUP BY Platform.`Name` ORDER BY Platform.`Name`;";
|
string sql = "SELECT Platform.Id, Platform.`Name`, COUNT(Game.Id) AS GameCount FROM (SELECT DISTINCT Game.Id, Games_Roms.PlatformId, COUNT(Games_Roms.Id) AS RomCount FROM Game LEFT JOIN AgeGroup ON Game.Id = AgeGroup.GameId LEFT JOIN Games_Roms ON Game.Id = Games_Roms.GameId WHERE (" + ageRestriction_Platform + ") GROUP BY Game.Id , Games_Roms.PlatformId HAVING RomCount > 0) Game JOIN Platform ON Game.PlatformId = Platform.Id GROUP BY Platform.`Name`;";
|
||||||
|
|
||||||
DataTable dbResponse = db.ExecuteCMD(sql);
|
DataTable dbResponse = db.ExecuteCMD(sql);
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
// genres
|
// genres
|
||||||
List<FilterItem> genres = new List<FilterItem>();
|
List<FilterItem> genres = new List<FilterItem>();
|
||||||
dbResponse = GetGenericFilterItem(db, "Genre", ageRestriction_Generic);
|
dbResponse = GetGenericFilterItem(db, "Genre", ageRestriction_Platform);
|
||||||
|
|
||||||
foreach (DataRow dr in dbResponse.Rows)
|
foreach (DataRow dr in dbResponse.Rows)
|
||||||
{
|
{
|
||||||
@@ -49,7 +49,7 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
// game modes
|
// game modes
|
||||||
List<FilterItem> gameModes = new List<FilterItem>();
|
List<FilterItem> gameModes = new List<FilterItem>();
|
||||||
dbResponse = GetGenericFilterItem(db, "GameMode", ageRestriction_Generic);
|
dbResponse = GetGenericFilterItem(db, "GameMode", ageRestriction_Platform);
|
||||||
|
|
||||||
foreach (DataRow dr in dbResponse.Rows)
|
foreach (DataRow dr in dbResponse.Rows)
|
||||||
{
|
{
|
||||||
@@ -60,7 +60,7 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
// player perspectives
|
// player perspectives
|
||||||
List<FilterItem> playerPerspectives = new List<FilterItem>();
|
List<FilterItem> playerPerspectives = new List<FilterItem>();
|
||||||
dbResponse = GetGenericFilterItem(db, "PlayerPerspective", ageRestriction_Generic);
|
dbResponse = GetGenericFilterItem(db, "PlayerPerspective", ageRestriction_Platform);
|
||||||
|
|
||||||
foreach (DataRow dr in dbResponse.Rows)
|
foreach (DataRow dr in dbResponse.Rows)
|
||||||
{
|
{
|
||||||
@@ -71,7 +71,7 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
// themes
|
// themes
|
||||||
List<FilterItem> themes = new List<FilterItem>();
|
List<FilterItem> themes = new List<FilterItem>();
|
||||||
dbResponse = GetGenericFilterItem(db, "Theme", ageRestriction_Generic);
|
dbResponse = GetGenericFilterItem(db, "Theme", ageRestriction_Platform);
|
||||||
|
|
||||||
foreach (DataRow dr in dbResponse.Rows)
|
foreach (DataRow dr in dbResponse.Rows)
|
||||||
{
|
{
|
||||||
@@ -82,7 +82,7 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
// age groups
|
// age groups
|
||||||
List<FilterItem> agegroupings = new List<FilterItem>();
|
List<FilterItem> agegroupings = new List<FilterItem>();
|
||||||
sql = "SELECT view_Games.Id, view_Games.AgeGroupId, COUNT(view_Games.Id) AS GameCount FROM view_Games WHERE (" + ageRestriction_Generic + ") GROUP BY view_Games.AgeGroupId ORDER BY view_Games.AgeGroupId DESC;";
|
sql = "SELECT Game.AgeGroupId, COUNT(Game.Id) AS GameCount FROM (SELECT DISTINCT Game.Id, AgeGroup.AgeGroupId, COUNT(Games_Roms.Id) AS RomCount FROM Game LEFT JOIN AgeGroup ON Game.Id = AgeGroup.GameId LEFT JOIN Games_Roms ON Game.Id = Games_Roms.GameId WHERE (" + ageRestriction_Platform + ") GROUP BY Game.Id HAVING RomCount > 0) Game GROUP BY Game.AgeGroupId ORDER BY Game.AgeGroupId DESC";
|
||||||
dbResponse = db.ExecuteCMD(sql);
|
dbResponse = db.ExecuteCMD(sql);
|
||||||
|
|
||||||
foreach (DataRow dr in dbResponse.Rows)
|
foreach (DataRow dr in dbResponse.Rows)
|
||||||
@@ -108,9 +108,11 @@ namespace gaseous_server.Classes
|
|||||||
return FilterSet;
|
return FilterSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DataTable GetGenericFilterItem(Database db, string Name, string AgeRestriction_Generic)
|
private static DataTable GetGenericFilterItem(Database db, string Name, string AgeRestriction)
|
||||||
{
|
{
|
||||||
string sql = "SELECT DISTINCT <ITEMNAME>.Id, <ITEMNAME>.`Name`, COUNT(view_Games.Id) AS GameCount FROM <ITEMNAME> LEFT JOIN Relation_Game_<ITEMNAME>s ON Relation_Game_<ITEMNAME>s.<ITEMNAME>sId = <ITEMNAME>.Id LEFT JOIN view_Games ON view_Games.Id = Relation_Game_<ITEMNAME>s.GameId WHERE (" + AgeRestriction_Generic + ") GROUP BY <ITEMNAME>.Id HAVING GameCount > 0 ORDER BY <ITEMNAME>.`Name`;";
|
//string sql = "SELECT DISTINCT <ITEMNAME>.Id, <ITEMNAME>.`Name`, COUNT(view_Games.Id) AS GameCount FROM <ITEMNAME> LEFT JOIN Relation_Game_<ITEMNAME>s ON Relation_Game_<ITEMNAME>s.<ITEMNAME>sId = <ITEMNAME>.Id LEFT JOIN view_Games ON view_Games.Id = Relation_Game_<ITEMNAME>s.GameId WHERE (" + AgeRestriction_Generic + ") GROUP BY <ITEMNAME>.Id HAVING GameCount > 0 ORDER BY <ITEMNAME>.`Name`;";
|
||||||
|
|
||||||
|
string sql = "SELECT <ITEMNAME>.Id, <ITEMNAME>.`Name`, COUNT(Game.Id) AS GameCount FROM (SELECT DISTINCT Game.Id, AgeGroup.AgeGroupId, COUNT(Games_Roms.Id) AS RomCount FROM Game LEFT JOIN AgeGroup ON Game.Id = AgeGroup.GameId LEFT JOIN Games_Roms ON Game.Id = Games_Roms.GameId WHERE (" + AgeRestriction + ") GROUP BY Game.Id HAVING RomCount > 0) Game JOIN Relation_Game_<ITEMNAME>s ON Game.Id = Relation_Game_<ITEMNAME>s.GameId JOIN <ITEMNAME> ON Relation_Game_<ITEMNAME>s.<ITEMNAME>sId = <ITEMNAME>.Id GROUP BY <ITEMNAME>.`Name` ORDER BY <ITEMNAME>.`Name`;";
|
||||||
sql = sql.Replace("<ITEMNAME>", Name);
|
sql = sql.Replace("<ITEMNAME>", Name);
|
||||||
DataTable dbResponse = db.ExecuteCMD(sql);
|
DataTable dbResponse = db.ExecuteCMD(sql);
|
||||||
|
|
||||||
|
@@ -331,6 +331,37 @@ namespace gaseous_server.Classes.Metadata
|
|||||||
ids: platformIds.ToArray<long>()
|
ids: platformIds.ToArray<long>()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// get cover art from parent if this has no cover
|
||||||
|
if (result.Cover == null)
|
||||||
|
{
|
||||||
|
if (result.ParentGame != null)
|
||||||
|
{
|
||||||
|
if (result.ParentGame.Id != null)
|
||||||
|
{
|
||||||
|
Logging.Log(Logging.LogType.Information, "Game Metadata", "Game has no cover art, fetching cover art from parent game");
|
||||||
|
Game parentGame = GetGame((long)result.ParentGame.Id, false, false, false);
|
||||||
|
result.Cover = parentGame.Cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get missing metadata from parent if this is a port
|
||||||
|
if (result.Category == Category.Port)
|
||||||
|
{
|
||||||
|
if (result.Summary == null)
|
||||||
|
{
|
||||||
|
if (result.ParentGame != null)
|
||||||
|
{
|
||||||
|
if (result.ParentGame.Id != null)
|
||||||
|
{
|
||||||
|
Logging.Log(Logging.LogType.Information, "Game Metadata", "Game has no summary, fetching summary from parent game");
|
||||||
|
Game parentGame = GetGame((long)result.ParentGame.Id, false, false, false);
|
||||||
|
result.Summary = parentGame.Summary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,37 +379,112 @@ namespace gaseous_server.Classes.Metadata
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool AllowNoPlatformSearch = false;
|
||||||
|
|
||||||
public static Game[] SearchForGame(string SearchString, long PlatformId, SearchType searchType)
|
public static Game[] SearchForGame(string SearchString, long PlatformId, SearchType searchType)
|
||||||
{
|
{
|
||||||
Task<Game[]> games = _SearchForGame(SearchString, PlatformId, searchType);
|
// search local first
|
||||||
|
Logging.Log(Logging.LogType.Information, "Game Search", "Attempting local search of type '" + searchType.ToString() + "' for " + SearchString);
|
||||||
|
Task<Game[]> games = _SearchForGameDatabase(SearchString, PlatformId, searchType);
|
||||||
|
if (games.Result.Length == 0)
|
||||||
|
{
|
||||||
|
// fall back to online search
|
||||||
|
Logging.Log(Logging.LogType.Information, "Game Search", "Falling back to remote search of type '" + searchType.ToString() + "' for " + SearchString);
|
||||||
|
games = _SearchForGameRemote(SearchString, PlatformId, searchType);
|
||||||
|
}
|
||||||
return games.Result;
|
return games.Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<Game[]> _SearchForGame(string SearchString, long PlatformId, SearchType searchType)
|
private static async Task<Game[]> _SearchForGameDatabase(string SearchString, long PlatformId, SearchType searchType)
|
||||||
{
|
{
|
||||||
string searchBody = "";
|
string whereClause = "";
|
||||||
string searchFields = "fields id,name,slug,platforms,summary; ";
|
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
bool allowSearch = true;
|
||||||
switch (searchType)
|
switch (searchType)
|
||||||
{
|
{
|
||||||
case SearchType.searchNoPlatform:
|
case SearchType.searchNoPlatform:
|
||||||
searchBody += "search \"" + SearchString + "\"; ";
|
whereClause = "MATCH(`Name`) AGAINST (@gamename)";
|
||||||
|
dbDict.Add("platformid", PlatformId);
|
||||||
|
dbDict.Add("gamename", SearchString);
|
||||||
|
|
||||||
|
allowSearch = AllowNoPlatformSearch;
|
||||||
break;
|
break;
|
||||||
case SearchType.search:
|
case SearchType.search:
|
||||||
searchBody += "search \"" + SearchString + "\"; ";
|
whereClause = "PlatformsId = @platformid AND MATCH(`Name`) AGAINST (@gamename)";
|
||||||
searchBody += "where platforms = (" + PlatformId + ");";
|
dbDict.Add("platformid", PlatformId);
|
||||||
|
dbDict.Add("gamename", SearchString);
|
||||||
break;
|
break;
|
||||||
case SearchType.wherefuzzy:
|
case SearchType.wherefuzzy:
|
||||||
searchBody += "where platforms = (" + PlatformId + ") & name ~ *\"" + SearchString + "\"*;";
|
whereClause = "PlatformsId = @platformid AND `Name` LIKE @gamename";
|
||||||
|
dbDict.Add("platformid", PlatformId);
|
||||||
|
dbDict.Add("gamename", "%" + SearchString + "%");
|
||||||
break;
|
break;
|
||||||
case SearchType.where:
|
case SearchType.where:
|
||||||
searchBody += "where platforms = (" + PlatformId + ") & name ~ \"" + SearchString + "\";";
|
whereClause = "PlatformsId = @platformid AND `Name` = @gamename";
|
||||||
|
dbDict.Add("platformid", PlatformId);
|
||||||
|
dbDict.Add("gamename", SearchString);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
string sql = "SELECT Game.Id, Game.`Name`, Game.Slug, Relation_Game_Platforms.PlatformsId AS PlatformsId, Game.Summary FROM gaseous.Game JOIN Relation_Game_Platforms ON Game.Id = Relation_Game_Platforms.GameId WHERE " + whereClause + ";";
|
||||||
|
|
||||||
|
|
||||||
|
// get Game metadata
|
||||||
|
Game[]? results = new Game[0];
|
||||||
|
if (allowSearch == true)
|
||||||
|
{
|
||||||
|
List<Game> searchResults = new List<Game>();
|
||||||
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
|
DataTable data = db.ExecuteCMD(sql, dbDict);
|
||||||
|
foreach (DataRow row in data.Rows)
|
||||||
|
{
|
||||||
|
Game game = new Game{
|
||||||
|
Id = (long)row["Id"],
|
||||||
|
Name = (string)row["Name"],
|
||||||
|
Slug = (string)row["Slug"],
|
||||||
|
Summary = (string)row["Summary"]
|
||||||
|
};
|
||||||
|
searchResults.Add(game);
|
||||||
|
}
|
||||||
|
|
||||||
|
results = searchResults.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<Game[]> _SearchForGameRemote(string SearchString, long PlatformId, SearchType searchType)
|
||||||
|
{
|
||||||
|
string searchBody = "";
|
||||||
|
string searchFields = "fields id,name,slug,platforms,summary; ";
|
||||||
|
bool allowSearch = true;
|
||||||
|
switch (searchType)
|
||||||
|
{
|
||||||
|
case SearchType.searchNoPlatform:
|
||||||
|
searchBody = "search \"" + SearchString + "\"; ";
|
||||||
|
|
||||||
|
allowSearch = AllowNoPlatformSearch;
|
||||||
|
break;
|
||||||
|
case SearchType.search:
|
||||||
|
searchBody = "search \"" + SearchString + "\"; where platforms = (" + PlatformId + ");";
|
||||||
|
break;
|
||||||
|
case SearchType.wherefuzzy:
|
||||||
|
searchBody = "where platforms = (" + PlatformId + ") & name ~ *\"" + SearchString + "\"*;";
|
||||||
|
break;
|
||||||
|
case SearchType.where:
|
||||||
|
searchBody = "where platforms = (" + PlatformId + ") & name ~ \"" + SearchString + "\";";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// get Game metadata
|
// get Game metadata
|
||||||
Communications comms = new Communications();
|
Communications comms = new Communications();
|
||||||
var results = await comms.APIComm<Game>(IGDBClient.Endpoints.Games, searchFields, searchBody);
|
Game[]? results = new Game[0];
|
||||||
|
if (allowSearch == true)
|
||||||
|
{
|
||||||
|
results = await comms.APIComm<Game>(IGDBClient.Endpoints.Games, searchFields, searchBody);
|
||||||
|
}
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
@@ -401,6 +507,7 @@ namespace gaseous_server.Classes.Metadata
|
|||||||
this.TotalRatingCount = gameObject.TotalRatingCount;
|
this.TotalRatingCount = gameObject.TotalRatingCount;
|
||||||
this.Cover = gameObject.Cover;
|
this.Cover = gameObject.Cover;
|
||||||
this.Artworks = gameObject.Artworks;
|
this.Artworks = gameObject.Artworks;
|
||||||
|
this.FirstReleaseDate = gameObject.FirstReleaseDate;
|
||||||
|
|
||||||
// compile age ratings
|
// compile age ratings
|
||||||
this.AgeRatings = new List<AgeRating>();
|
this.AgeRatings = new List<AgeRating>();
|
||||||
@@ -421,6 +528,7 @@ namespace gaseous_server.Classes.Metadata
|
|||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public double? TotalRating { get; set; }
|
public double? TotalRating { get; set; }
|
||||||
public int? TotalRatingCount { get; set; }
|
public int? TotalRatingCount { get; set; }
|
||||||
|
public DateTimeOffset? FirstReleaseDate { get; set; }
|
||||||
public IGDB.IdentityOrValue<IGDB.Models.Cover> Cover { get; set; }
|
public IGDB.IdentityOrValue<IGDB.Models.Cover> Cover { get; set; }
|
||||||
public IGDB.IdentitiesOrValues<IGDB.Models.Artwork> Artworks { get; set; }
|
public IGDB.IdentitiesOrValues<IGDB.Models.Artwork> Artworks { get; set; }
|
||||||
public List<IGDB.Models.AgeRating> AgeRatings { get; set; }
|
public List<IGDB.Models.AgeRating> AgeRatings { get; set; }
|
||||||
|
@@ -192,11 +192,14 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
|
|
||||||
string tempVal = "";
|
string tempVal = "";
|
||||||
|
|
||||||
|
string nameWhereClause = "";
|
||||||
if (model.Name.Length > 0)
|
if (model.Name.Length > 0)
|
||||||
{
|
{
|
||||||
tempVal = "`Name` LIKE @Name";
|
// tempVal = "`Name` LIKE @Name";
|
||||||
whereParams.Add("@Name", "%" + model.Name + "%");
|
// whereParams.Add("@Name", "%" + model.Name + "%");
|
||||||
havingClauses.Add(tempVal);
|
// havingClauses.Add(tempVal);
|
||||||
|
nameWhereClause = "WHERE (MATCH(Game.`Name`) AGAINST (@Name IN BOOLEAN MODE) OR MATCH(AlternativeName.`Name`) AGAINST (@Name IN BOOLEAN MODE))";
|
||||||
|
whereParams.Add("@Name", "(*" + model.Name + "*) (" + model.Name + ") ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model.GameRating != null)
|
if (model.GameRating != null)
|
||||||
@@ -263,9 +266,10 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string platformWhereClause = "";
|
||||||
if (model.Platform.Count > 0)
|
if (model.Platform.Count > 0)
|
||||||
{
|
{
|
||||||
tempVal = "Relation_Game_Platforms.PlatformsId IN (";
|
tempVal = " AND Games_Roms.PlatformId IN (";
|
||||||
for (int i = 0; i < model.Platform.Count; i++)
|
for (int i = 0; i < model.Platform.Count; i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
@@ -277,7 +281,8 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
whereParams.Add(platformLabel, model.Platform[i]);
|
whereParams.Add(platformLabel, model.Platform[i]);
|
||||||
}
|
}
|
||||||
tempVal += ")";
|
tempVal += ")";
|
||||||
whereClauses.Add(tempVal);
|
//whereClauses.Add(tempVal);
|
||||||
|
platformWhereClause = tempVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model.Genre.Count > 0)
|
if (model.Genre.Count > 0)
|
||||||
@@ -352,7 +357,7 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
{
|
{
|
||||||
if (model.GameAgeRating.AgeGroupings.Count > 0)
|
if (model.GameAgeRating.AgeGroupings.Count > 0)
|
||||||
{
|
{
|
||||||
tempVal = "(AgeGroupId IN (";
|
tempVal = "(Game.AgeGroupId IN (";
|
||||||
for (int i = 0; i < model.GameAgeRating.AgeGroupings.Count; i++)
|
for (int i = 0; i < model.GameAgeRating.AgeGroupings.Count; i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
@@ -367,7 +372,7 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
|
|
||||||
if (model.GameAgeRating.IncludeUnrated == true)
|
if (model.GameAgeRating.IncludeUnrated == true)
|
||||||
{
|
{
|
||||||
tempVal += " OR AgeGroupId IS NULL";
|
tempVal += " OR Game.AgeGroupId IS NULL";
|
||||||
}
|
}
|
||||||
tempVal += ")";
|
tempVal += ")";
|
||||||
|
|
||||||
@@ -439,7 +444,9 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
string orderByClause = "ORDER BY `" + orderByField + "` " + orderByOrder;
|
string orderByClause = "ORDER BY `" + orderByField + "` " + orderByOrder;
|
||||||
|
|
||||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
string sql = "SELECT DISTINCT view_Games.* FROM view_Games LEFT JOIN Relation_Game_Platforms ON view_Games.Id = Relation_Game_Platforms.GameId AND (Relation_Game_Platforms.PlatformsId IN (SELECT DISTINCT PlatformId FROM Games_Roms WHERE Games_Roms.GameId = view_Games.Id)) LEFT JOIN Relation_Game_Genres ON view_Games.Id = Relation_Game_Genres.GameId LEFT JOIN Relation_Game_GameModes ON view_Games.Id = Relation_Game_GameModes.GameId LEFT JOIN Relation_Game_PlayerPerspectives ON view_Games.Id = Relation_Game_PlayerPerspectives.GameId LEFT JOIN Relation_Game_Themes ON view_Games.Id = Relation_Game_Themes.GameId " + whereClause + " " + havingClause + " " + orderByClause;
|
//string sql = "SELECT DISTINCT view_Games.* FROM view_Games LEFT JOIN Relation_Game_Platforms ON view_Games.Id = Relation_Game_Platforms.GameId AND (Relation_Game_Platforms.PlatformsId IN (SELECT DISTINCT PlatformId FROM Games_Roms WHERE Games_Roms.GameId = view_Games.Id)) LEFT JOIN Relation_Game_Genres ON view_Games.Id = Relation_Game_Genres.GameId LEFT JOIN Relation_Game_GameModes ON view_Games.Id = Relation_Game_GameModes.GameId LEFT JOIN Relation_Game_PlayerPerspectives ON view_Games.Id = Relation_Game_PlayerPerspectives.GameId LEFT JOIN Relation_Game_Themes ON view_Games.Id = Relation_Game_Themes.GameId " + whereClause + " " + havingClause + " " + orderByClause;
|
||||||
|
|
||||||
|
string sql = "SELECT DISTINCT Game.Id, Game.`Name`, Game.NameThe, Game.PlatformId, Game.TotalRating, Game.TotalRatingCount, Game.Cover, Game.Artworks, Game.FirstReleaseDate, Game.Category, Game.ParentGame, Game.AgeRatings, Game.AgeGroupId, Game.RomCount FROM (SELECT DISTINCT Game.*, CASE WHEN Game.`Name` LIKE 'The %' THEN CONCAT(TRIM(SUBSTR(Game.`Name` FROM 4)), ', The') ELSE Game.`Name` END AS NameThe, Games_Roms.PlatformId, AgeGroup.AgeGroupId, COUNT(Games_Roms.Id) AS RomCount FROM Game LEFT JOIN AgeGroup ON Game.Id = AgeGroup.GameId LEFT JOIN Games_Roms ON Game.Id = Games_Roms.GameId" + platformWhereClause + " LEFT JOIN AlternativeName ON Game.Id = AlternativeName.Game " + nameWhereClause + " GROUP BY Game.Id HAVING RomCount > 0) Game LEFT JOIN Relation_Game_Genres ON Game.Id = Relation_Game_Genres.GameId LEFT JOIN Relation_Game_GameModes ON Game.Id = Relation_Game_GameModes.GameId LEFT JOIN Relation_Game_PlayerPerspectives ON Game.Id = Relation_Game_PlayerPerspectives.GameId LEFT JOIN Relation_Game_Themes ON Game.Id = Relation_Game_Themes.GameId " + whereClause + " " + havingClause + " " + orderByClause;
|
||||||
|
|
||||||
List<IGDB.Models.Game> RetVal = new List<IGDB.Models.Game>();
|
List<IGDB.Models.Game> RetVal = new List<IGDB.Models.Game>();
|
||||||
|
|
||||||
@@ -457,7 +464,8 @@ namespace gaseous_server.Controllers.v1_1
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
RetVal.Add(Classes.Metadata.Games.GetGame(dbResponse.Rows[i]));
|
Game retGame = Storage.BuildCacheObject<Game>(new Game() , dbResponse.Rows[i]);
|
||||||
|
RetVal.Add(retGame);
|
||||||
}
|
}
|
||||||
|
|
||||||
GameReturnPackage gameReturn = new GameReturnPackage(RecordCount, RetVal);
|
GameReturnPackage gameReturn = new GameReturnPackage(RecordCount, RetVal);
|
||||||
|
@@ -6,6 +6,9 @@ CREATE TABLE `AgeGroup` (
|
|||||||
`lastUpdated` DATETIME NULL DEFAULT NULL,
|
`lastUpdated` DATETIME NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`Id`));
|
PRIMARY KEY (`Id`));
|
||||||
|
|
||||||
|
ALTER TABLE `AgeGroup`
|
||||||
|
ADD INDEX `id_GameId` (`GameId` ASC) VISIBLE;
|
||||||
|
|
||||||
ALTER TABLE `Game`
|
ALTER TABLE `Game`
|
||||||
CHANGE COLUMN `Slug` `Slug` VARCHAR(255) NULL DEFAULT NULL;
|
CHANGE COLUMN `Slug` `Slug` VARCHAR(255) NULL DEFAULT NULL;
|
||||||
|
|
||||||
@@ -15,4 +18,10 @@ SELECT
|
|||||||
FROM
|
FROM
|
||||||
view_GamesWithRoms a
|
view_GamesWithRoms a
|
||||||
LEFT JOIN AgeGroup b ON b.GameId = a.Id
|
LEFT JOIN AgeGroup b ON b.GameId = a.Id
|
||||||
ORDER BY NameThe;
|
ORDER BY NameThe;
|
||||||
|
|
||||||
|
ALTER TABLE `Game`
|
||||||
|
ADD FULLTEXT INDEX `ft_Name` (`Name`) VISIBLE;
|
||||||
|
|
||||||
|
ALTER TABLE `AlternativeName`
|
||||||
|
ADD FULLTEXT INDEX `ft_Name` (`Name`) VISIBLE;
|
@@ -120,9 +120,10 @@
|
|||||||
|
|
||||||
ajaxCall('/api/v1.1/Games/' + gameId + '/roms/' + modalVariables, 'GET', function (result) {
|
ajaxCall('/api/v1.1/Games/' + gameId + '/roms/' + modalVariables, 'GET', function (result) {
|
||||||
romData = result;
|
romData = result;
|
||||||
|
console.log(romData);
|
||||||
document.getElementById('modal-heading').innerHTML = result.name;
|
document.getElementById('modal-heading').innerHTML = result.name;
|
||||||
document.getElementById('rominfo_library').innerHTML = result.library.name;
|
document.getElementById('rominfo_library').innerHTML = result.library.name;
|
||||||
document.getElementById('rominfo_platform').innerHTML = result.platform.name;
|
document.getElementById('rominfo_platform').innerHTML = result.platform;
|
||||||
document.getElementById('rominfo_size').innerHTML = formatBytes(result.size, 2);
|
document.getElementById('rominfo_size').innerHTML = formatBytes(result.size, 2);
|
||||||
document.getElementById('rominfo_type').innerHTML = getRomType(result.romType);
|
document.getElementById('rominfo_type').innerHTML = getRomType(result.romType);
|
||||||
document.getElementById('rominfo_mediatype').innerHTML = result.romTypeMedia;
|
document.getElementById('rominfo_mediatype').innerHTML = result.romTypeMedia;
|
||||||
@@ -132,7 +133,7 @@
|
|||||||
document.getElementById('rominfo_signaturematch').innerHTML = result.source;
|
document.getElementById('rominfo_signaturematch').innerHTML = result.source;
|
||||||
document.getElementById('rominfo_signaturetitle').innerHTML = result.signatureSourceGameTitle;
|
document.getElementById('rominfo_signaturetitle').innerHTML = result.signatureSourceGameTitle;
|
||||||
|
|
||||||
document.getElementById('properties_fixplatform').innerHTML = "<option value='" + result.platform.id + "' selected='selected'>" + result.platform.name + "</option>";
|
document.getElementById('properties_fixplatform').innerHTML = "<option value='" + result.platformId + "' selected='selected'>" + result.platform + "</option>";
|
||||||
document.getElementById('properties_fixgame').innerHTML = "<option value='" + gameData.id + "' selected='selected'>" + gameData.name + "</option>";
|
document.getElementById('properties_fixgame').innerHTML = "<option value='" + gameData.id + "' selected='selected'>" + gameData.name + "</option>";
|
||||||
|
|
||||||
if (result.library.isDefaultLibrary == false) {
|
if (result.library.isDefaultLibrary == false) {
|
||||||
@@ -233,7 +234,8 @@
|
|||||||
arr.push({
|
arr.push({
|
||||||
id: data[i].id,
|
id: data[i].id,
|
||||||
text: data[i].name,
|
text: data[i].name,
|
||||||
cover: data[i].cover
|
cover: data[i].cover,
|
||||||
|
releaseDate: data[i].firstReleaseDate
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -889,7 +889,8 @@
|
|||||||
arr.push({
|
arr.push({
|
||||||
id: data[i].id,
|
id: data[i].id,
|
||||||
text: data[i].name,
|
text: data[i].name,
|
||||||
cover: data[i].cover
|
cover: data[i].cover,
|
||||||
|
releaseDate: data[i].firstReleaseDate
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,6 +12,8 @@ function formatGamesPanel(targetElement, result, pageNumber, pageSize) {
|
|||||||
console.log("Displaying page: " + pageNumber);
|
console.log("Displaying page: " + pageNumber);
|
||||||
console.log("Page size: " + pageSize);
|
console.log("Page size: " + pageSize);
|
||||||
|
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
|
||||||
var pageMode = GetPreference('LibraryPagination', 'paged');
|
var pageMode = GetPreference('LibraryPagination', 'paged');
|
||||||
|
|
||||||
if (pageNumber == 1 || pageMode == 'paged') {
|
if (pageNumber == 1 || pageMode == 'paged') {
|
||||||
|
@@ -253,13 +253,18 @@ function DropDownRenderGameOption(state) {
|
|||||||
|
|
||||||
var response;
|
var response;
|
||||||
|
|
||||||
|
var releaseDate;
|
||||||
|
if (state.releaseDate) {
|
||||||
|
releaseDate = moment(state.releaseDate).format('yyyy');
|
||||||
|
}
|
||||||
|
|
||||||
if (state.cover) {
|
if (state.cover) {
|
||||||
response = $(
|
response = $(
|
||||||
'<table class="dropdown-div"><tr><td class="dropdown-cover"><img src="https://images.igdb.com/igdb/image/upload/t_cover_small/' + state.cover.value.imageId + '.jpg" /></td><td class="dropdown-label"><span>' + state.text + '</span></td></tr></table>'
|
'<table class="dropdown-div"><tr><td class="dropdown-cover"><img src="https://images.igdb.com/igdb/image/upload/t_cover_small/' + state.cover.value.imageId + '.jpg" /></td><td class="dropdown-label"><span class="dropdown-title">' + state.text + '</span><span class="dropdown-releasedate">' + releaseDate + '</span></td></tr></table>'
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
response = $(
|
response = $(
|
||||||
'<table class="dropdown-div"><tr><td class="dropdown-cover"><img src="/images/unknowngame.png" /></td><td class="dropdown-label"><span>' + state.text + '</span></td></tr></table>'
|
'<table class="dropdown-div"><tr><td class="dropdown-cover"><img src="/images/unknowngame.png" style="max-width: 90px;" /></td><td class="dropdown-label"><span>' + state.text + '</span><span class="dropdown-releasedate">' + releaseDate + '</span></td></tr></table>'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
|
@@ -895,6 +895,18 @@ div[name="properties_toc_item"]:hover,div[name="properties_user_toc_item"]:hover
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-title {
|
||||||
|
display: block;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-releasedate {
|
||||||
|
display: block;
|
||||||
|
font-weight: normal;
|
||||||
|
color: lightgray;
|
||||||
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
background-color: #555;
|
background-color: #555;
|
||||||
color: white;
|
color: white;
|
||||||
|
Reference in New Issue
Block a user